@@ -39,45 +39,50 @@ def wait_for_page_to_start_loading(self, url, timeout=20):
39
39
def open_popup (self , show_nag = False , origins = None ):
40
40
"""Open popup and optionally close overlay."""
41
41
42
- DUMMY_PAGE_URL = "https://efforg.github.io/privacybadger-test-fixtures/"
43
-
44
- # hack to get tabData populated for the popup's tab
45
- # to get the popup shown for regular pages
46
- # as opposed to special (no-tabData) browser pages
47
- self .open_window ()
48
- self .load_url (DUMMY_PAGE_URL )
49
-
50
42
self .open_window ()
51
43
self .load_url (self .popup_url )
52
44
self .wait_for_script ("return window.POPUP_INITIALIZED" )
53
45
54
- # override tab ID (to get regular page popup instead of
55
- # special browser page popup),
56
- # optionally set the domains the popup should report,
57
- # optionally ask for the new user welcome page reminder
46
+ # populate tabData for the popup's tab
47
+ # to get a regular page popup
48
+ # instead of a special browser page popup
49
+ #
50
+ # optionally set the domains the popup should report
51
+ #
52
+ # optionally show the new user welcome page reminder
58
53
popup_js = (
59
- "(function (origins, show_nag, DUMMY_PAGE_URL) {"
60
- "chrome.tabs.query({ url: DUMMY_PAGE_URL }, (tabs) => {"
54
+ "(function (origins, show_nag) {"
55
+ ""
56
+ "let bg = chrome.extension.getBackgroundPage();"
57
+ ""
58
+ "chrome.tabs.getCurrent(tab => {"
59
+ " bg.badger.recordFrame(tab.id, 0, tab.url);"
60
+ ""
61
+ " for (let domain of Object.keys(origins)) {"
62
+ " bg.badger.logThirdPartyOriginOnTab(tab.id, domain, origins[domain]);"
63
+ " }"
64
+ ""
61
65
" chrome.runtime.sendMessage({"
62
66
" type: 'getPopupData',"
63
- " tabId: tabs[0] .id"
67
+ " tabId: tab .id"
64
68
" }, (response) => {"
65
69
" response.settings.seenComic = !show_nag;"
66
- " response.origins = origins;"
67
70
" setPopupData(response);"
68
71
" refreshPopup();"
69
72
" showNagMaybe();"
70
73
" window.DONE_REFRESHING = true;"
71
74
" });"
72
75
"});"
73
- "}(arguments[0], arguments[1], arguments[2]));"
76
+ ""
77
+ "}(arguments[0], arguments[1]));"
74
78
)
75
- self .js (popup_js , origins if origins else {}, show_nag , DUMMY_PAGE_URL )
76
- # wait until the async getTab function is done
79
+ self .js (popup_js , origins if origins else {}, show_nag )
80
+
81
+ # wait until the async functions above are done
77
82
self .wait_for_script (
78
83
"return typeof window.DONE_REFRESHING != 'undefined'" ,
79
84
timeout = 5 ,
80
- message = "Timed out waiting for getTab() to complete. "
85
+ message = "Timed out waiting for popup to finish initializing "
81
86
)
82
87
83
88
# wait for any sliders to finish rendering
@@ -230,6 +235,11 @@ def test_reverting_control(self):
230
235
231
236
self .open_popup (origins = {DOMAIN :"cookieblock" })
232
237
238
+ # reveal sliders
239
+ self .driver .find_element_by_id ('expand-blocked-resources' ).click ()
240
+ # TODO retry instead
241
+ time .sleep (1 )
242
+
233
243
# set the domain to user control
234
244
# click input with JavaScript to avoid "Element ... is not clickable" /
235
245
# "Other element would receive the click" Selenium limitation
@@ -350,6 +360,137 @@ def test_donate_button(self):
350
360
self .assertEqual (self .driver .current_url , EFF_URL ,
351
361
"EFF website should open after clicking donate button on popup" )
352
362
363
+ def test_breakage_warnings (self ):
364
+ YLIST_DOMAIN = "jquery.com"
365
+ self .open_popup (origins = {YLIST_DOMAIN : "cookieblock" })
366
+
367
+ def get_breakage_icon ():
368
+ return self .driver .find_element_by_css_selector (
369
+ 'div.clicker[data-origin="{}"] span.breakage-warning' .format (YLIST_DOMAIN ))
370
+
371
+ # reveal sliders
372
+ self .driver .find_element_by_id ('expand-blocked-resources' ).click ()
373
+ # TODO retry instead
374
+ time .sleep (1 )
375
+
376
+ # verify there is no breakage warning
377
+ breakage_icon = get_breakage_icon ()
378
+ self .assertFalse (breakage_icon .is_displayed ())
379
+
380
+ # manually block the yellowlisted domain
381
+ self .js ("$('#block-{}').click()" .format (YLIST_DOMAIN .replace ("." , "-" )))
382
+
383
+ # verify breakage warning is shown
384
+ breakage_icon = get_breakage_icon ()
385
+ self .assertTrue (breakage_icon .is_displayed ())
386
+
387
+ # verify breakage warning is there when reopened
388
+ self .open_popup (origins = {YLIST_DOMAIN : "user_block" }) # TODO hack
389
+ breakage_icon = get_breakage_icon ()
390
+ self .assertTrue (breakage_icon .is_displayed ())
391
+
392
+ def test_slider_hiding (self ):
393
+ YLIST_DOMAIN = "jquery.com"
394
+ TEST_DOMAINS = {
395
+ "example.com" : "block" ,
396
+ YLIST_DOMAIN : "cookieblock"
397
+ }
398
+
399
+ def assert_hidden (sliders ):
400
+ for slider in sliders :
401
+ self .assertFalse (slider .is_displayed (),
402
+ "{} is visible but should be hidden" .format (
403
+ slider .get_attribute ('data-origin' )))
404
+
405
+ def assert_visible (sliders ):
406
+ for slider in sliders :
407
+ self .assertTrue (slider .is_displayed (),
408
+ "{} is hidden but should be visible" .format (
409
+ slider .get_attribute ('data-origin' )))
410
+
411
+ self .open_popup (origins = TEST_DOMAINS )
412
+ sliders = self .driver .find_elements_by_css_selector ('div.clicker' )
413
+
414
+ # verify we have the expected number of sliders
415
+ self .assertEqual (len (sliders ), len (TEST_DOMAINS ))
416
+
417
+ # verify sliders are hidden
418
+ assert_hidden (sliders )
419
+
420
+ # reveal sliders
421
+ self .driver .find_element_by_id ('expand-blocked-resources' ).click ()
422
+ # TODO retry instead
423
+ time .sleep (1 )
424
+
425
+ # verify sliders are visible
426
+ assert_visible (sliders )
427
+
428
+ # reopen popup
429
+ self .open_popup (origins = TEST_DOMAINS )
430
+ sliders = self .driver .find_elements_by_css_selector ('div.clicker' )
431
+
432
+ # verify sliders are visible
433
+ assert_visible (sliders )
434
+
435
+ # verify domain is shown second in the list
436
+ self .assertEqual (sliders [1 ].get_attribute ('data-origin' ), YLIST_DOMAIN )
437
+
438
+ # manually block the yellowlisted domain
439
+ self .js ("$('#block-{}').click()" .format (YLIST_DOMAIN .replace ("." , "-" )))
440
+
441
+ # hide sliders
442
+ self .driver .find_element_by_id ('collapse-blocked-resources' ).click ()
443
+ # TODO retry instead
444
+ time .sleep (1 )
445
+
446
+ # verify sliders are hidden
447
+ assert_hidden (sliders )
448
+
449
+ # reopen popup
450
+ TEST_DOMAINS [YLIST_DOMAIN ] = "user_block" # TODO hack
451
+ self .open_popup (origins = TEST_DOMAINS )
452
+ sliders = self .driver .find_elements_by_css_selector ('div.clicker' )
453
+
454
+ # verify sliders are visible
455
+ assert_visible (sliders )
456
+
457
+ # verify breakage warning slider is at the top
458
+ self .assertEqual (sliders [0 ].get_attribute ('data-origin' ), YLIST_DOMAIN )
459
+
460
+ # restore the user-set slider to default action
461
+ self .driver .find_element_by_css_selector (
462
+ 'div[data-origin="{}"] a.honeybadgerPowered' .format (YLIST_DOMAIN )
463
+ ).click ()
464
+
465
+ # get back to a valid window handle as the window just got closed
466
+ self .driver .switch_to .window (self .driver .window_handles [0 ])
467
+
468
+ # reopen popup
469
+ TEST_DOMAINS [YLIST_DOMAIN ] = "cookieblock" # TODO hack
470
+ self .open_popup (origins = TEST_DOMAINS )
471
+ sliders = self .driver .find_elements_by_css_selector ('div.clicker' )
472
+
473
+ # verify sliders are hidden again
474
+ assert_hidden (sliders )
475
+
476
+ def test_nothing_blocked_slider_list (self ):
477
+ # enable local learning and showing non-tracking domains
478
+ self .load_url (self .options_url )
479
+ self .wait_for_script ("return window.OPTIONS_INITIALIZED" )
480
+ self .find_el_by_css ('#local-learning-checkbox' ).click ()
481
+ self .find_el_by_css ('#show-nontracking-domains-checkbox' ).click ()
482
+
483
+ # base case: verify blocked slider is hidden (list is collapsed)
484
+ self .open_popup (origins = {'example.com' : 'block' })
485
+ slider = self .driver .find_element_by_css_selector ('div.clicker[data-origin="example.com"]' )
486
+ self .assertFalse (slider .is_displayed ())
487
+
488
+ # reopen popup
489
+ self .open_popup (origins = {'example.com' : 'noaction' })
490
+ # verify a non-tracking slider gets shown (no collapsing, just show the list)
491
+ slider = self .driver .find_element_by_css_selector ('div.clicker[data-origin="example.com"]' )
492
+ self .assertTrue (slider .is_displayed ())
493
+
353
494
354
495
if __name__ == "__main__" :
355
496
unittest .main ()
0 commit comments