From b75a5717a084c9e5a727c2e960f2b910abcb5ace Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Tue, 25 Jan 2022 09:37:34 +0100 Subject: add a repo querying HTML interface --- test/unit/utils.py | 78 +++++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 36 deletions(-) (limited to 'test/unit/utils.py') diff --git a/test/unit/utils.py b/test/unit/utils.py index 90a2ab7..6f0236d 100644 --- a/test/unit/utils.py +++ b/test/unit/utils.py @@ -202,43 +202,49 @@ def are_scripts_allowed(driver, nonce=None): ''', nonce) -""" -tab_id_responder is meant to be appended to background script of a test -extension. -""" -tab_id_responder = ''' -function tell_tab_id(msg, sender, respond_cb) { - if (msg[0] === "learn_tab_id") - respond_cb(sender.tab.id); -} -browser.runtime.onMessage.addListener(tell_tab_id); -''' - -""" -tab_id_asker is meant to be appended to content script of a test extension. -""" -tab_id_asker = ''' -browser.runtime.sendMessage(["learn_tab_id"]) - .then(tid => window.wrappedJSObject.haketilo_tab = tid); -''' - -def run_content_script_in_new_window(driver, url): +def mock_cacher(execute_in_page): """ - Expect an extension to be loaded which had tab_id_responder and tab_id_asker - appended to its background and content scripts, respectively. - Open the provided url in a new tab, find its tab id and return it, with - current window changed back to the initial one. + Some parts of code depend on content/repo_query_cacher.js and + background/CORS_bypass_server.js running in their appropriate contexts. This + function modifies the relevant browser.runtime.sendMessage function to + perform fetch(), bypassing the cacher. """ - initial_handle = driver.current_window_handle - handles = driver.window_handles - driver.execute_script('window.open(arguments[0], "_blank");', url) - WebDriverWait(driver, 10).until(lambda d: d.window_handles is not handles) - new_handle = [h for h in driver.window_handles if h not in handles][0] - - driver.switch_to.window(new_handle) + execute_in_page( + '''{ + const old_sendMessage = browser.tabs.sendMessage, old_fetch = fetch; + async function new_sendMessage(tab_id, msg) { + if (msg[0] !== "repo_query") + return old_sendMessage(tab_id, msg); + + /* Use snapshotted fetch(), allow other test code to override it. */ + const response = await old_fetch(msg[1]); + if (!response) + return {error: "Something happened :o"}; + + const result = {ok: response.ok, status: response.status}; + try { + result.json = await response.json(); + } catch(e) { + result.error_json = "" + e; + } + return result; + } - get_tab_id = lambda d: d.execute_script('return window.haketilo_tab;') - tab_id = WebDriverWait(driver, 10).until(get_tab_id) + browser.tabs.sendMessage = new_sendMessage; + }''') - driver.switch_to.window(initial_handle) - return tab_id +""" +Convenience snippet of code to retrieve a copy of given object with only those +properties present which are DOM nodes. This makes it possible to easily access +DOM nodes stored in a javascript object that also happens to contain some +other properties that make it impossible to return from a Selenium script. +""" +nodes_props_code = '''\ +(obj => { + const result = {}; + for (const [key, value] of Object.entries(obj)) { + if (value instanceof Node) + result[key] = value; + } + return result; +})''' -- cgit v1.2.3