Project

General

Profile

« Previous | Next » 

Revision 26e4800d

Added by koszko over 1 year ago

more improvements for abrowser&librewolf

View differences:

common/broadcast.js
119 119
{
120 120
    if (conn.type === "sender")
121 121
	flush(conn);
122
    conn.port.disconnect();
122
    setTimeout(conn.port.disconnect());
123 123
}
124 124
#EXPORT close
common/indexeddb.js
99 99
    return wait_request(transaction.objectStore(store_name).delete(key));
100 100
}
101 101

  
102
async function perform_upgrade(event) {
103
    const opened_db = event.target.result;
104

  
105
    /* When we move to a new database schema, we will add upgrade logic here. */
106
    if (event.oldVersion > 0)
107
	throw "bad db version: " + event.oldVersion;
108

  
109
    let store;
110
    for (const [store_name, key_mode] of stores)
111
	store = opened_db.createObjectStore(store_name, key_mode);
112

  
113
    const ctx = make_context(store.transaction, initial_data.files);
114
    await _save_items(initial_data.resources, initial_data.mappings, ctx);
115

  
116
    return opened_db;
117
}
118

  
102 119
/* Open haketilo database, asynchronously return an IDBDatabase object. */
103
async function get_db()
104
{
120
async function get_db() {
105 121
    if (db)
106 122
	return db;
107 123

  
......
109 125
    const waiter = new Promise((...cbs) => [resolve, reject] = cbs);
110 126

  
111 127
    const request = indexedDB.open("haketilo", version_nr(db_version));
112
    request.onsuccess       = resolve;
128
    request.onsuccess       = ev => resolve(ev.target.result);
113 129
    request.onerror         = ev => reject("db error: " + ev.target.errorCode);
114
    request.onupgradeneeded = resolve;
115

  
116
    const event = await waiter;
117
    const opened_db = event.target.result;
130
    request.onupgradeneeded = ev => perform_upgrade(ev).then(resolve, reject);
118 131

  
119
    if (event instanceof IDBVersionChangeEvent) {
120
	/*
121
	 * When we move to a new database schema, we will add upgrade logic
122
	 * here.
123
	 */
124
	if (event.oldVersion > 0)
125
	    throw "bad db version: " + event.oldVersion;
126

  
127
	let store;
128
	for (const [store_name, key_mode] of stores)
129
	    store = opened_db.createObjectStore(store_name, key_mode);
130

  
131
	const ctx = make_context(store.transaction, initial_data.files);
132
	await _save_items(initial_data.resources, initial_data.mappings, ctx);
133
    }
132
    const opened_db = await waiter;
134 133

  
135 134
    if (db)
136 135
	opened_db.close();
configure
88 88
    if [ "x$TARGET" = xabrowser ]; then
89 89
	# Trisquel's path to Abrowser
90 90
	BROWSER_BINARY=/usr/lib/abrowser/abrowser
91
    if [ "x$TARGET" = xabrowser ]; then
91
    elif [ "x$TARGET" = xlibrewolf ]; then
92 92
	# Debian's path to Librewolf
93 93
	BROWSER_BINARY=/usr/share/librewolf/librewolf
94 94
    elif [ "x$TARGET" = xicecat ]; then
html/popup.html
70 70
      #info_form label+span, .top_but_container {
71 71
	  padding-bottom: 0.5em;
72 72
      }
73

  
74
      #info_form .long_msg {
75
	  white-space: normal;
76
      }
73 77
    </style>
74 78
  </head>
75 79
  <body>
html/popup.js
83 83

  
84 84
	if (page_info.payload) {
85 85
	    if ("error" in page_info) {
86
		let long_msg = true;
87

  
86 88
		if (page_info.error.haketilo_error_type === "missing")
87 89
		    payload_text = `None (error: resource with id '${page_info.error.id}' missing from the database)`;
88 90
		else if (page_info.error.haketilo_error_type === "circular")
......
91 93
		    payload_text = `None (error: failure reading Haketilo internal database)`;
92 94
		else if (page_info.error.haketilo_error_type === "other")
93 95
		    payload_text = `None (error: unknown failure occured)`;
96
		else
97
		    long_msg = false;
98

  
99
		if (long_msg)
100
		    by_id("injected_payload").classList.add("long_msg");
94 101
	    } else {
95 102
		payload_text = page_info.payload.identifier;
96 103
	    }
......
100 107

  
101 108
	const scripts_fate = page_info.allow ? "allowed" : "blocked";
102 109

  
103
	let mapping_text;
110
	let mapping_text, long_msg = true;
104 111

  
105
	if (page_info.mapping === "~allow")
112
	if (page_info.mapping === "~allow") {
106 113
	    mapping_text = `None (scripts ${scripts_fate} by a rule)`;
107
	else if ("error" in page_info
108
		 && page_info.error.haketilo_error_type ==="deciding_policy")
114
	} else if ("error" in page_info &&
115
		   page_info.error.haketilo_error_type === "deciding_policy") {
109 116
	    mapping_text = `None (error occured when determining policy)`;
110
	else if (page_info.mapping)
117
	} else if (page_info.mapping) {
111 118
	    mapping_text = page_info.mapping;
112
	else
119
	    long_msg = false;
120
	} else {
113 121
	    mapping_text = `None (scripts ${scripts_fate} by default policy)`;
122
	}
114 123

  
115 124
	by_id("mapping_used").innerText = mapping_text;
125
	if (long_msg)
126
	    by_id("mapping_used").classList.add("long_msg");
116 127
    }
117 128
}
118 129

  
test/conftest.py
78 78
    driver.get('https://gotmyowndoma.in/')
79 79
    ext_path = make_extension(Path(driver.firefox_profile.path), **ext_data)
80 80
    addon_id = driver.install_addon(str(ext_path), temporary=True)
81
    WebDriverWait(driver, 10).until(
82
        EC.url_matches('^moz-extension://.*')
83
    )
81
    get_url = lambda d: d.execute_script('return window.ext_page_url;')
82
    ext_page_url = WebDriverWait(driver, 10).until(get_url)
83
    driver.get(ext_page_url)
84 84

  
85 85
    if navigate_to is not None:
86
        testpage_url = driver.execute_script('return window.location.href;')
87
        driver.get(testpage_url.replace('testpage.html', navigate_to))
86
        driver.get(driver.current_url.replace('testpage.html', navigate_to))
88 87

  
89 88
    yield
90 89

  
test/extension_crafting.py
136 136
open_test_page_script = '''(() => {
137 137
const page_url = browser.runtime.getURL("testpage.html");
138 138
const execute_details = {
139
    code: `window.location.href=${JSON.stringify(page_url)};`
139
    code: `window.wrappedJSObject.ext_page_url=${JSON.stringify(page_url)};`
140 140
};
141 141
browser.tabs.query({currentWindow: true, active: true})
142 142
    .then(t => browser.tabs.executeScript(t.id, execute_details));
test/unit/test_patterns_query_manager.py
265 265
        json_txt = run_content_script()
266 266
        if json_txt and json.loads(json_txt) == {}:
267 267
            break;
268
        assert attempt != 2
268
        assert attempt != 1
269 269

  
270 270
    driver.switch_to.window(windows[0])
271 271
    execute_in_page(load_script('common/indexeddb.js'))
......
283 283
        json.loads(tree_json)
284 284
        if all([m['identifier'] in tree_json for m in sample_mappings]):
285 285
            break
286
        assert attempt != 2
286
        assert attempt != 1
287 287

  
288 288
    driver.switch_to.window(windows[0])
289 289
    execute_in_page(
......
300 300
        }''',
301 301
        [sm['identifier'] for sm in sample_mappings])
302 302

  
303
    for attempt in range(10):
304
        if json.loads(run_content_script()) == {}:
305
            break
306
        assert attempt != 9
303
    for attempt in range(2):
304
        json_txt = run_content_script()
305
        if json_txt and json.loads(json_txt) == {}:
306
            break;
307
        assert attempt != 1
test/unit/test_popup.py
20 20
import pytest
21 21
import json
22 22
from selenium.webdriver.support.ui import WebDriverWait
23
from selenium.common.exceptions import ElementNotInteractableException
24 23

  
25 24
from ..extension_crafting import ExtraHTML
26 25
from ..script_loader import load_script
27 26
from .utils import *
28 27

  
29
def reload_with_target(driver, target):
30
    current_url = driver.execute_script('return location.href')
31
    driver.execute_script(
32
        '''
33
        window.location.href = arguments[0];
34
        window.location.reload();
35
        ''',
36
        f'{current_url}#{target}')
37

  
38 28
unprivileged_page_info = {
39 29
    'url': 'https://example_a.com/something',
40 30
    'allow': False
......
145 135
    possible values of page_info object passed in message from the content
146 136
    script.
147 137
    """
148
    reload_with_target(driver, f'mock_page_info-{page_info_key}')
138
    initial_url = driver.current_url
139
    driver.get('about:blank')
140
    driver.get(f'{initial_url}#mock_page_info-{page_info_key}')
149 141

  
150
    def get_nodes_by_id(driver):
151
        by_id = driver.execute_script(
152
            '''
153
            const nodes = [...document.querySelectorAll("[id]")];
154
            const reductor = (ob, node) => Object.assign(ob, {[node.id]: node});
155
            return nodes.reduce(reductor, {});
156
            ''');
157
        return by_id if by_id and 'repo_query_container' in by_id else None
158

  
159
    by_id = WebDriverWait(driver, 10).until(get_nodes_by_id)
142
    by_id = driver.execute_script(
143
        '''
144
        const nodes = [...document.querySelectorAll("[id]")];
145
        const reductor = (ob, node) => Object.assign(ob, {[node.id]: node});
146
        return nodes.reduce(reductor, {});
147
        ''')
160 148

  
161 149
    if page_info_key == '':
162 150
        error_msg = 'Page info not avaialable. Try reloading the page.'
......
218 206
    """
219 207
    Test opening and closing the repo query view in popup.
220 208
    """
221
    reload_with_target(driver, f'mock_page_info-blocked_rule')
209
    initial_url = driver.current_url
210
    driver.get('about:blank')
211
    driver.get(f'{initial_url}#mock_page_info-blocked_rule')
222 212

  
223
    driver.implicitly_wait(10)
224 213
    search_but = driver.find_element_by_id("search_resources_but")
225
    driver.implicitly_wait(0)
226

  
227
    # For unknown reasons waiting for search_but.is_displayed() to return True
228
    # does not guarantee the button will be interactable afterwards under newer
229
    # browsers. Hence, this workaround.
230
    def click_search_but(driver):
231
        try:
232
            search_but.click()
233
            return True
234
        except ElementNotInteractableException:
235
            pass
236

  
237
    WebDriverWait(driver, 10).until(click_search_but)
214
    WebDriverWait(driver, 10).until(lambda d: search_but.is_displayed())
215
    search_but.click()
238 216

  
239 217
    containers = dict([(name, driver.find_element_by_id(f'{name}_container'))
240 218
                       for name in ('page_info', 'repo_query')])

Also available in: Unified diff