Skip to content

Commit 45adb0d

Browse files
committed
refactor(extension): use settings page and local storage to configure extension
1 parent b50226e commit 45adb0d

File tree

5 files changed

+90
-45
lines changed

5 files changed

+90
-45
lines changed

Extension/bundled/manifest.json

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
"scripts": ["feature.js"]
88
},
99
"content_scripts": [],
10-
"applications": {
10+
"browser_specific_settings": {
1111
"gecko": {
12-
13-
"strict_min_version": "60.0"
12+
1413
}
1514
},
15+
16+
"options_ui": {
17+
"page": "settings/settings.html"
18+
},
1619
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';",
1720
"permissions": [
1821
"<all_urls>",
@@ -25,9 +28,9 @@
2528
"alarms",
2629
"downloads",
2730
"tabs",
28-
"dns",
29-
"mozillaAddons"
31+
"dns"
3032
],
33+
3134
"experiment_apis": {
3235
"sockets": {
3336
"schema": "./privileged/sockets/schema.json",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
</head>
6+
7+
<body>
8+
<h1>THIS PAGE SHOULD ONLY BE USED BY SELENIUM TO PROGRAMATICALLY SET THE SETTINGS</h1>
9+
</body>
10+
</html>

Extension/src/feature.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,9 @@ import { NavigationInstrument } from "./background/navigation-instrument";
88
import * as loggingDB from "./loggingdb";
99
import { CallstackInstrument } from "./callstack-instrument";
1010

11-
async function main() {
12-
// Read the browser configuration from file
13-
const filename = "browser_params.json";
14-
const raw_config = await browser.profileDirIO.readFile(filename);
15-
let config: any;
16-
if (raw_config) {
17-
config = JSON.parse(raw_config);
18-
console.log("Browser Config:", config);
19-
} else {
11+
async function setup(config: any) {
12+
console.log("Browser Config:", config);
13+
if(!config){
2014
config = {
2115
navigation_instrument: true,
2216
cookie_instrument: true,
@@ -104,4 +98,10 @@ async function main() {
10498
await browser.profileDirIO.writeFile("OPENWPM_STARTUP_SUCCESS.txt", "");
10599
}
106100

107-
main();
101+
browser.storage.local.onChanged.addListener((changes) => {
102+
const changedItems = Object.keys(changes);
103+
if (!changedItems.includes("initialized")) {
104+
return;
105+
}
106+
setup(changes.config?.newValue)
107+
});

openwpm/deploy_browsers/deploy_firefox.py

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import subprocess
55
import tempfile
66
from pathlib import Path
7+
from time import sleep
78
from typing import Any, Dict, Optional, Tuple
89

910
from easyprocess import EasyProcessError
1011
from multiprocess import Queue
1112
from pyvirtualdisplay import Display
1213
from selenium import webdriver
14+
from selenium.webdriver.common.by import By
1315
from selenium.webdriver.firefox.options import Options
1416
from selenium.webdriver.firefox.service import Service
1517

@@ -98,25 +100,6 @@ def deploy_firefox(
98100
# because status_queue is read off no matter what.
99101
status_queue.put(("STATUS", "Display", (display_pid, display_port)))
100102

101-
# Write config file
102-
extension_config: Dict[str, Any] = dict()
103-
extension_config.update(browser_params.to_dict())
104-
extension_config["logger_address"] = manager_params.logger_address
105-
extension_config["storage_controller_address"] = (
106-
manager_params.storage_controller_address
107-
)
108-
extension_config["testing"] = manager_params.testing
109-
ext_config_file = browser_profile_path / "browser_params.json"
110-
with open(ext_config_file, "w") as f:
111-
json.dump(extension_config, f, cls=ConfigEncoder)
112-
logger.debug(
113-
"BROWSER %i: Saved extension config file to: %s"
114-
% (browser_params.browser_id, ext_config_file)
115-
)
116-
117-
# TODO restore detailed logging
118-
# fo.set_preference("[email protected]", "all")
119-
120103
# Configure privacy settings
121104
configure_firefox.privacy(browser_params, fo)
122105

@@ -155,10 +138,11 @@ def deploy_firefox(
155138
# Install extension
156139
ext_loc = os.path.join(root_dir, "../../Extension/openwpm.xpi")
157140
ext_loc = os.path.normpath(ext_loc)
158-
driver.install_addon(ext_loc, temporary=True)
141+
driver.install_addon(ext_loc)
159142
logger.debug(
160143
"BROWSER %i: OpenWPM Firefox extension loaded" % browser_params.browser_id
161144
)
145+
apply_extension_configuration(driver, browser_params, manager_params)
162146

163147
# set window size
164148
driver.set_window_size(*DEFAULT_SCREEN_RES)
@@ -172,3 +156,37 @@ def deploy_firefox(
172156
status_queue.put(("STATUS", "Browser Launched", int(pid)))
173157

174158
return driver, browser_profile_path, display
159+
160+
161+
def apply_extension_configuration(
162+
driver: webdriver.Firefox,
163+
browser_params: BrowserParamsInternal,
164+
manager_params: ManagerParamsInternal,
165+
) -> None:
166+
# Write config file
167+
extension_config: Dict[str, Any] = dict()
168+
extension_config.update(browser_params.to_dict())
169+
extension_config["logger_address"] = manager_params.logger_address
170+
extension_config["storage_controller_address"] = (
171+
manager_params.storage_controller_address
172+
)
173+
extension_config["testing"] = manager_params.testing
174+
config = json.dumps(extension_config, cls=ConfigEncoder)
175+
driver.get("about:debugging#/runtime/this-firefox")
176+
sleep(0.1)
177+
extension_id = driver.find_element(
178+
By.XPATH, "//span[@title='OpenWPM']/../section/dl/div[2]/dd"
179+
).text
180+
driver.get(f"moz-extension://{extension_id}/settings/settings.html")
181+
driver.execute_script(
182+
f"""
183+
browser.storage.local.set({{
184+
config: {config},
185+
initialized: true
186+
}});
187+
"""
188+
)
189+
logger.debug("BROWSER %i: Set extension configuration:", browser_params.browser_id)
190+
191+
# TODO restore detailed logging
192+
# fo.set_preference("[email protected]", "all")

test/manual_test.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88
import click
99
import IPython
1010
from selenium import webdriver
11+
from selenium.webdriver.common.by import By
1112
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
1213
from selenium.webdriver.firefox.options import Options
14+
from selenium.webdriver.firefox.service import Service
1315

1416
from openwpm import js_instrumentation as jsi
15-
from openwpm.config import BrowserParams
17+
from openwpm.config import BrowserParams, BrowserParamsInternal, ManagerParamsInternal
1618
from openwpm.deploy_browsers import configure_firefox
19+
from openwpm.deploy_browsers.deploy_firefox import apply_extension_configuration
1720
from openwpm.utilities.platform_utils import get_firefox_binary_path
1821

1922
from .conftest import xpi
@@ -102,11 +105,10 @@ def start_webdriver(
102105
"""
103106
firefox_binary_path = get_firefox_binary_path()
104107

105-
fb = FirefoxBinary(firefox_path=firefox_binary_path)
106108
server, thread = start_server()
107109

108110
def register_cleanup(driver):
109-
driver.get(BASE_TEST_URL)
111+
# driver.get(BASE_TEST_URL)
110112

111113
def cleanup_server():
112114
print("Cleanup before shutdown...")
@@ -131,30 +133,42 @@ def cleanup_server():
131133
# fp.set_preference("[email protected]", "all")
132134
configure_firefox.optimize_prefs(fo)
133135

134-
driver = webdriver.Firefox(firefox_binary=fb, options=fo)
136+
fo.binary_location = firefox_binary_path
137+
geckodriver_path = subprocess.check_output(
138+
"which geckodriver", encoding="utf-8", shell=True
139+
).strip()
140+
driver = webdriver.Firefox(
141+
options=fo,
142+
service=Service(
143+
executable_path=geckodriver_path,
144+
),
145+
)
146+
browser_params = BrowserParamsInternal()
147+
135148
if load_browser_params is True:
136149
# There's probably more we could do here
137150
# to set more preferences and better emulate
138151
# what happens in TaskManager. But this lets
139152
# us pass some basic things.
140153

141-
browser_params = BrowserParams()
142154
if browser_params_file is not None:
143155
with open(browser_params_file, "r") as f:
144156
browser_params.from_json(f.read())
145157
js_request = browser_params.js_instrument_settings
146158
js_request_as_string = jsi.clean_js_instrumentation_settings(js_request)
147159
browser_params.js_instrument_settings = js_request_as_string
148160

149-
with open(browser_profile_path / "browser_params.json", "w") as f:
150-
f.write(browser_params.to_json())
151-
152161
if with_extension:
153162
# add openwpm extension to profile
154163
xpi()
155164
ext_xpi = join(EXT_PATH, "dist", "openwpm-1.0.zip")
156-
driver.install_addon(ext_xpi, temporary=True)
157-
165+
driver.install_addon(ext_xpi)
166+
manager_params = ManagerParamsInternal()
167+
manager_params.logger_address = None
168+
manager_params.storage_controller_address = None
169+
manager_params.testing = True
170+
browser_params.browser_id = 1
171+
apply_extension_configuration(driver, browser_params, manager_params)
158172
return register_cleanup(driver)
159173

160174

0 commit comments

Comments
 (0)