diff options
Diffstat (limited to 'testing/talos/talos/talos-powers/chrome/talos-powers-content.js')
-rw-r--r-- | testing/talos/talos/talos-powers/chrome/talos-powers-content.js | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/testing/talos/talos/talos-powers/chrome/talos-powers-content.js b/testing/talos/talos/talos-powers/chrome/talos-powers-content.js new file mode 100644 index 0000000000..4b7276e7a5 --- /dev/null +++ b/testing/talos/talos/talos-powers/chrome/talos-powers-content.js @@ -0,0 +1,214 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* eslint-env mozilla/frame-script */ + +addEventListener( + "TalosContentProfilerCommand", + e => { + let name = e.detail.name; + let data = e.detail.data; + sendAsyncMessage("TalosContentProfiler:Command", { name, data }); + }, + { wantUntrusted: true } // since we're exposing to unprivileged +); + +addMessageListener("TalosContentProfiler:Response", msg => { + let name = msg.data.name; + let data = msg.data.data; + + let event = Cu.cloneInto( + { + bubbles: true, + detail: { + name, + data, + }, + }, + content + ); + content.dispatchEvent( + new content.CustomEvent("TalosContentProfilerResponse", event) + ); +}); + +addEventListener( + "TalosPowersContentForceCCAndGC", + e => { + Cu.forceGC(); + Cu.forceCC(); + Cu.forceShrinkingGC(); + sendSyncMessage("TalosPowersContent:ForceCCAndGC"); + }, + { wantUntrusted: true } // since we're exposing to unprivileged +); + +addEventListener( + "TalosPowersContentFocus", + e => { + if ( + content.location.protocol != "file:" && + content.location.hostname != "localhost" && + content.location.hostname != "127.0.0.1" + ) { + throw new Error( + "TalosPowersContentFocus may only be used with local content" + ); + } + content.focus(); + let contentEvent = Cu.cloneInto( + { + bubbles: true, + }, + content + ); + content.dispatchEvent( + new content.CustomEvent("TalosPowersContentFocused", contentEvent) + ); + }, + { capture: true, wantUntrusted: true } // since we're exposing to unprivileged +); + +addEventListener( + "TalosPowersContentGetStartupInfo", + e => { + sendAsyncMessage("TalosPowersContent:GetStartupInfo"); + addMessageListener( + "TalosPowersContent:GetStartupInfo:Result", + function onResult(msg) { + removeMessageListener( + "TalosPowersContent:GetStartupInfo:Result", + onResult + ); + let event = Cu.cloneInto( + { + bubbles: true, + detail: msg.data, + }, + content + ); + + content.dispatchEvent( + new content.CustomEvent( + "TalosPowersContentGetStartupInfoResult", + event + ) + ); + } + ); + }, + { wantUntrusted: true } // since we're exposing to unprivileged +); + +addEventListener( + "TalosPowersContentDumpConsole", + e => { + var messages; + try { + messages = Services.console.getMessageArray(); + } catch (ex) { + dump(ex + "\n"); + messages = []; + } + + for (var i = 0; i < messages.length; i++) { + dump(messages[i].message + "\n"); + } + }, + { wantUntrusted: true } // since we're exposing to unprivileged +); + +/** + * Content that wants to quit the whole session should + * fire the TalosPowersGoQuitApplication custom event. This will + * attempt to force-quit the browser. + */ +addEventListener( + "TalosPowersGoQuitApplication", + e => { + // If we're loaded in a low-priority background process, like + // the background page thumbnailer, then we shouldn't be allowed + // to quit the whole application. This is a workaround until + // bug 1164459 is fixed. + let priority = docShell + .QueryInterface(Ci.nsIDocumentLoader) + .loadGroup.QueryInterface(Ci.nsISupportsPriority).priority; + if (priority != Ci.nsISupportsPriority.PRIORITY_LOWEST) { + sendAsyncMessage("Talos:ForceQuit", e.detail); + } + }, + { wantUntrusted: true } // since we're exposing to unprivileged +); + +/** + * Content that wants to trigger a WebRender capture should fire the + * TalosPowersWebRenderCapture custom event. + */ +addEventListener( + "TalosPowersWebRenderCapture", + e => { + if (content && content.windowUtils) { + content.windowUtils.wrCapture(); + } else { + dump("Unable to obtain DOMWindowUtils for TalosPowersWebRenderCapture\n"); + } + }, + { wantUntrusted: true } // since we're exposing to unprivileged +); + +/* * + * Mediator for the generic ParentExec mechanism. + * Listens for a query event from the content, forwards it as a query message + * to the parent, listens to a parent reply message, and forwards it as a reply + * event for the content to capture. + * The consumer API for this mechanism is at content/TalosPowersContent.js + * and the callees are at ParentExecServices at components/TalosPowersService.js + */ +addEventListener( + "TalosPowers:ParentExec:QueryEvent", + function (e) { + if ( + content.location.protocol != "file:" && + content.location.hostname != "localhost" && + content.location.hostname != "127.0.0.1" + ) { + throw new Error( + "TalosPowers:ParentExec may only be used with local content" + ); + } + let uniqueMessageId = + "TalosPowers:ParentExec:" + + content.document.documentURI + + content.window.performance.now() + + Math.random(); + + // Listener for the reply from the parent process + addMessageListener("TalosPowers:ParentExec:ReplyMsg", function done(reply) { + if (reply.data.id != uniqueMessageId) { + return; + } + + removeMessageListener("TalosPowers:ParentExec:ReplyMsg", done); + + // reply to content via an event + let contentEvent = Cu.cloneInto( + { + bubbles: true, + detail: reply.data.result, + }, + content + ); + content.dispatchEvent( + new content.CustomEvent(e.detail.listeningTo, contentEvent) + ); + }); + + // Send the query to the parent process + sendAsyncMessage("TalosPowers:ParentExec:QueryMsg", { + command: e.detail.command, + id: uniqueMessageId, + }); + }, + { wantUntrusted: true } // since we're exposing to unprivileged +); |