test_provider_notification.js (7663B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 let firstProvider; 7 let secondProvider; 8 let context; 9 10 add_setup(async function () { 11 firstProvider = new UrlbarTestUtils.TestProvider({ 12 results: [ 13 new UrlbarResult({ 14 type: UrlbarUtils.RESULT_TYPE.URL, 15 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 16 payload: { 17 url: "https://mozilla.com/", 18 tags: [], 19 title: "mozilla.com", 20 }, 21 }), 22 ], 23 priority: 999, 24 type: UrlbarUtils.PROVIDER_TYPE.PROFILE, 25 name: "firstProvider", 26 onEngagement: () => {}, 27 onAbandonment: () => {}, 28 onImpression: () => {}, 29 onSearchSessionEnd: () => {}, 30 }); 31 32 secondProvider = new UrlbarTestUtils.TestProvider({ 33 results: [ 34 new UrlbarResult({ 35 type: UrlbarUtils.RESULT_TYPE.URL, 36 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 37 payload: { 38 url: "https://example.com/", 39 tags: [], 40 title: "example.com", 41 }, 42 }), 43 ], 44 priority: 999, 45 type: UrlbarUtils.PROVIDER_TYPE.PROFILE, 46 name: "secondProvider", 47 }); 48 49 context = createContext("", { 50 providers: [firstProvider.name, secondProvider.name], 51 }); 52 53 UrlbarProvidersManager.registerProvider(firstProvider); 54 UrlbarProvidersManager.registerProvider(secondProvider); 55 56 registerCleanupFunction(() => { 57 UrlbarProvidersManager.unregisterProvider(firstProvider); 58 UrlbarProvidersManager.unregisterProvider(secondProvider); 59 sinon.restore(); 60 }); 61 }); 62 63 add_task(async function testOnEngagementNotification() { 64 let spyFirstProviderOnEngagement = sinon.spy(firstProvider, "onEngagement"); 65 66 const engagedResult = makeVisitResult(context, { 67 uri: "https://mozilla.com/", 68 title: "mozilla.com", 69 providerName: "firstProvider", 70 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 71 }); 72 73 await check_results({ 74 context, 75 matches: [ 76 engagedResult, 77 makeVisitResult(context, { 78 uri: "https://example.com/", 79 title: "example.com", 80 providerName: "secondProvider", 81 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 82 }), 83 ], 84 }); 85 86 let controller = UrlbarTestUtils.newMockController(); 87 controller.setView({ 88 get visibleResults() { 89 return context.results; 90 }, 91 }); 92 93 await UrlbarProvidersManager.notifyEngagementChange( 94 "engagement", 95 context, 96 { 97 result: engagedResult, 98 }, 99 controller 100 ); 101 102 Assert.equal( 103 spyFirstProviderOnEngagement.callCount, 104 1, 105 "onEngagement called once for first provider" 106 ); 107 }); 108 109 add_task(async function testOnAbandonmentNotification() { 110 let spyFirstProviderOnAbandonment = sinon.spy(firstProvider, "onAbandonment"); 111 112 await check_results({ 113 context, 114 matches: [ 115 makeVisitResult(context, { 116 uri: "https://mozilla.com/", 117 title: "mozilla.com", 118 providerName: "firstProvider", 119 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 120 }), 121 makeVisitResult(context, { 122 uri: "https://example.com/", 123 title: "example.com", 124 providerName: "secondProvider", 125 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 126 }), 127 ], 128 }); 129 130 let controller = UrlbarTestUtils.newMockController(); 131 controller.setView({ 132 get visibleResults() { 133 return context.results; 134 }, 135 }); 136 137 await UrlbarProvidersManager.notifyEngagementChange( 138 "abandonment", 139 context, 140 {}, 141 controller 142 ); 143 144 Assert.equal( 145 spyFirstProviderOnAbandonment.callCount, 146 1, 147 "onAbandonment called once for first provider" 148 ); 149 }); 150 151 add_task(async function testOnImpressionNotification() { 152 let spyFirstProviderOnImpression = sinon.spy(firstProvider, "onImpression"); 153 154 const engagedResult = makeVisitResult(context, { 155 uri: "https://mozilla.com/", 156 title: "mozilla.com", 157 providerName: "firstProvider", 158 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 159 }); 160 161 await check_results({ 162 context, 163 matches: [ 164 engagedResult, 165 makeVisitResult(context, { 166 uri: "https://example.com/", 167 title: "example.com", 168 providerName: "secondProvider", 169 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 170 }), 171 ], 172 }); 173 174 let controller = UrlbarTestUtils.newMockController(); 175 controller.setView({ 176 get visibleResults() { 177 return context.results; 178 }, 179 }); 180 181 await UrlbarProvidersManager.notifyEngagementChange( 182 "engagement", 183 context, 184 { 185 isSessionOngoing: false, 186 result: engagedResult, 187 }, 188 controller 189 ); 190 191 Assert.equal( 192 spyFirstProviderOnImpression.callCount, 193 1, 194 "onImpression called for first provider after an engagement event" 195 ); 196 197 await UrlbarProvidersManager.notifyEngagementChange( 198 "abandonment", 199 context, 200 { 201 isSessionOngoing: false, 202 }, 203 controller 204 ); 205 206 Assert.equal( 207 spyFirstProviderOnImpression.callCount, 208 2, 209 "onImpression called once more for first provider after an abandonment \ 210 event" 211 ); 212 }); 213 214 add_task(async function testOnSearchSessionEndNotification() { 215 let spyFirstProviderOnSearchSessionEnd = sinon.spy( 216 firstProvider, 217 "onSearchSessionEnd" 218 ); 219 220 const engagedResult = makeVisitResult(context, { 221 uri: "https://mozilla.com/", 222 title: "mozilla.com", 223 providerName: "firstProvider", 224 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 225 }); 226 227 await check_results({ 228 context, 229 matches: [ 230 engagedResult, 231 makeVisitResult(context, { 232 uri: "https://example.com/", 233 title: "example.com", 234 providerName: "secondProvider", 235 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 236 }), 237 ], 238 }); 239 240 let controller = UrlbarTestUtils.newMockController(); 241 controller.setView({ 242 get visibleResults() { 243 return context.results; 244 }, 245 }); 246 247 await UrlbarProvidersManager.notifyEngagementChange( 248 "engagement", 249 context, 250 { 251 isSessionOngoing: false, 252 result: engagedResult, 253 }, 254 controller 255 ); 256 257 Assert.equal( 258 spyFirstProviderOnSearchSessionEnd.callCount, 259 1, 260 "onSearchSessionEnd called for first provider after an engagement event" 261 ); 262 263 await UrlbarProvidersManager.notifyEngagementChange( 264 "abandonment", 265 context, 266 { 267 isSessionOngoing: false, 268 }, 269 controller 270 ); 271 272 Assert.equal( 273 spyFirstProviderOnSearchSessionEnd.callCount, 274 2, 275 "onSearchSessionEnd called once more for first provider after an \ 276 abandonment event" 277 ); 278 }); 279 280 add_task(async function testProviderPresenceInMap() { 281 const notificationMethods = [ 282 "onEngagement", 283 "onAbandonment", 284 "onImpression", 285 "onSearchSessionEnd", 286 ]; 287 288 for (const method of notificationMethods) { 289 const providersForMethod = 290 UrlbarProvidersManager.providersByNotificationType[method]; 291 292 const isFirstProviderPresent = providersForMethod.has(firstProvider); 293 const isSecondProviderPresent = providersForMethod.has(secondProvider); 294 295 Assert.ok( 296 isFirstProviderPresent, 297 `The key ${method} includes the firstProvider` 298 ); 299 Assert.ok( 300 !isSecondProviderPresent, 301 `The key ${method} does not include secondProvider` 302 ); 303 } 304 305 UrlbarProvidersManager.unregisterProvider(firstProvider); 306 307 for (const method of notificationMethods) { 308 const providersForMethod = 309 UrlbarProvidersManager.providersByNotificationType[method]; 310 const isPresent = providersForMethod.has(firstProvider); 311 Assert.ok( 312 !isPresent, 313 `FirstProvider should no longer be present for ${method} after being 314 unregistered` 315 ); 316 } 317 });