Project

General

Profile

« Previous | Next » 

Revision bbc9fae4

Added by koszko over 1 year ago

serialize and deserialize entire Response object when relaying fetch() calls to other contexts using sendMessage

View differences:

test/haketilo_test/unit/utils.py
246 246
        'Object.keys(broadcast).forEach(k => broadcast[k] = () => {});'
247 247
    )
248 248

  
249
def mock_cacher(execute_in_page):
250
    """
251
    Some parts of code depend on content/repo_query_cacher.js and
252
    background/CORS_bypass_server.js running in their appropriate contexts. This
253
    function modifies the relevant browser.runtime.sendMessage function to
254
    perform fetch(), bypassing the cacher.
255
    """
256
    execute_in_page(
257
        '''{
258
        const old_sendMessage = browser.tabs.sendMessage, old_fetch = fetch;
259
        async function new_sendMessage(tab_id, msg) {
260
            if (msg[0] !== "repo_query")
261
                return old_sendMessage(tab_id, msg);
249
"""
250
Some parts of code depend on content/repo_query_cacher.js and
251
background/CORS_bypass_server.js running in their appropriate contexts. This
252
snippet modifies the relevant browser.runtime.sendMessage function to perform
253
fetch(), bypassing the cacher.
254
"""
255
mock_cacher_code = '''{
256
const uint8_to_hex =
257
    array => [...array].map(b => ("0" + b.toString(16)).slice(-2)).join("");
262 258

  
263
            /* Use snapshotted fetch(), allow other test code to override it. */
264
            const response = await old_fetch(msg[1]);
265
            if (!response)
266
                return {error: "Something happened :o"};
259
const old_sendMessage = browser.tabs.sendMessage;
260
window.mock_cacher_fetch = fetch;
261
browser.tabs.sendMessage = async function(tab_id, msg) {
262
    if (msg[0] !== "repo_query")
263
        return old_sendMessage(tab_id, msg);
267 264

  
268
            const result = {ok: response.ok, status: response.status};
269
            try {
270
                result.json = await response.json();
271
            } catch(e) {
272
                result.error_json = "" + e;
273
            }
274
            return result;
265
    /*
266
     * Use snapshotted fetch() under the name window.mock_cacher_fetch,
267
     * allow other test code to override it.
268
     */
269
    try {
270
        const response = await window.mock_cacher_fetch(msg[1]);
271
        const buf = await response.arrayBuffer();
272
        return {
273
            status:     response.status,
274
            statusText: response.statusText,
275
            headers:    [...response.headers.entries()],
276
            body:       uint8_to_hex(new Uint8Array(buf))
275 277
        }
276

  
277
        browser.tabs.sendMessage = new_sendMessage;
278
        }''')
278
    } catch(e) {
279
        return {error: {name: e.name, message: e.message}};
280
    }
281
}
282
}'''
279 283

  
280 284
"""
281 285
Convenience snippet of code to retrieve a copy of given object with only those

Also available in: Unified diff