Skip to content

Commit b82f462

Browse files
committed
Add more popup tests
Following up on #2748
1 parent 2a638cd commit b82f462

File tree

3 files changed

+184
-46
lines changed

3 files changed

+184
-46
lines changed

src/js/popup.js

+22-25
Original file line numberDiff line numberDiff line change
@@ -200,31 +200,6 @@ function init() {
200200
// add event listeners for click-to-expand first party protections popup section
201201
$('#firstparty-protections-header').on('click', toggleFirstPartyInfoHandler);
202202

203-
// show sliders when sliders were shown last
204-
// or when there is at least one breakage warning
205-
if (POPUP_DATA.settings.showExpandedTrackingSection || (
206-
POPUP_DATA.cookieblocked && Object.keys(POPUP_DATA.cookieblocked).some(
207-
d => POPUP_DATA.origins[d] == constants.USER_BLOCK)
208-
)) {
209-
$('#expand-blocked-resources').hide();
210-
$('#collapse-blocked-resources').show();
211-
$('#blockedResources').show();
212-
213-
} else {
214-
$('#expand-blocked-resources').show();
215-
$('#collapse-blocked-resources').hide();
216-
// show sliders regardless when the button
217-
// that lets you toggle slider visibility
218-
// isn't shown for whatever reason
219-
// (for ex.: "no trackers blocked" but we need to show
220-
// one or more "don't appear to be tracking you" sliders)
221-
if (!$('#tracker-list-header').is(':visible')) {
222-
$('#blockedResources').show();
223-
} else {
224-
$('#blockedResources').hide();
225-
}
226-
}
227-
228203
// show firstparty protections message if current tab is in our content scripts
229204
if (POPUP_DATA.enabled && POPUP_DATA.isOnFirstParty) {
230205
$("#firstparty-protections-container").show();
@@ -579,6 +554,22 @@ function refreshPopup() {
579554
$("#error_input").val(POPUP_DATA.errorText);
580555
}
581556

557+
// show sliders when sliders were shown last
558+
// or when there is at least one breakage warning
559+
if (POPUP_DATA.settings.showExpandedTrackingSection || (
560+
POPUP_DATA.cookieblocked && Object.keys(POPUP_DATA.cookieblocked).some(
561+
d => POPUP_DATA.origins[d] == constants.USER_BLOCK)
562+
)) {
563+
$('#expand-blocked-resources').hide();
564+
$('#collapse-blocked-resources').show();
565+
$('#blockedResources').show();
566+
567+
} else {
568+
$('#expand-blocked-resources').show();
569+
$('#collapse-blocked-resources').hide();
570+
$('#blockedResources').hide();
571+
}
572+
582573
let origins = POPUP_DATA.origins;
583574
let originsArr = [];
584575
if (origins) {
@@ -674,6 +665,12 @@ function refreshPopup() {
674665
// show "no trackers" message
675666
$("#instructions-no-trackers").show();
676667

668+
if (printable.length) {
669+
// make sure to show domain list
670+
// (there is no toggle button when nothing was blocked)
671+
$('#blockedResources').show();
672+
}
673+
677674
} else {
678675
$('#tracker-list-header').show();
679676
$('#instructions-many-trackers').html(chrome.i18n.getMessage(

src/skin/popup.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ <h2 id="title-name"><span class="i18n_name"></span></h2>
147147
<span id="no-third-parties" class="i18n_popup_blocked" style="display:none"></span>
148148
</div>
149149
</div>
150-
<div id="blockedResources"></div>
150+
<div id="blockedResources" style="display:none"></div>
151151
</div>
152152

153153
<div id="special-browser-page" style="display:none">

tests/selenium/popup_test.py

+161-20
Original file line numberDiff line numberDiff line change
@@ -39,45 +39,50 @@ def wait_for_page_to_start_loading(self, url, timeout=20):
3939
def open_popup(self, show_nag=False, origins=None):
4040
"""Open popup and optionally close overlay."""
4141

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-
5042
self.open_window()
5143
self.load_url(self.popup_url)
5244
self.wait_for_script("return window.POPUP_INITIALIZED")
5345

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
5853
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+
""
6165
" chrome.runtime.sendMessage({"
6266
" type: 'getPopupData',"
63-
" tabId: tabs[0].id"
67+
" tabId: tab.id"
6468
" }, (response) => {"
6569
" response.settings.seenComic = !show_nag;"
66-
" response.origins = origins;"
6770
" setPopupData(response);"
6871
" refreshPopup();"
6972
" showNagMaybe();"
7073
" window.DONE_REFRESHING = true;"
7174
" });"
7275
"});"
73-
"}(arguments[0], arguments[1], arguments[2]));"
76+
""
77+
"}(arguments[0], arguments[1]));"
7478
)
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
7782
self.wait_for_script(
7883
"return typeof window.DONE_REFRESHING != 'undefined'",
7984
timeout=5,
80-
message="Timed out waiting for getTab() to complete."
85+
message="Timed out waiting for popup to finish initializing"
8186
)
8287

8388
# wait for any sliders to finish rendering
@@ -230,6 +235,11 @@ def test_reverting_control(self):
230235

231236
self.open_popup(origins={DOMAIN:"cookieblock"})
232237

238+
# reveal sliders
239+
self.driver.find_element_by_id('expand-blocked-resources').click()
240+
# TODO retry instead
241+
time.sleep(1)
242+
233243
# set the domain to user control
234244
# click input with JavaScript to avoid "Element ... is not clickable" /
235245
# "Other element would receive the click" Selenium limitation
@@ -350,6 +360,137 @@ def test_donate_button(self):
350360
self.assertEqual(self.driver.current_url, EFF_URL,
351361
"EFF website should open after clicking donate button on popup")
352362

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+
353494

354495
if __name__ == "__main__":
355496
unittest.main()

0 commit comments

Comments
 (0)