forked from mirrors/gecko-dev
		
	 b555d2142a
			
		
	
	
		b555d2142a
		
	
	
	
	
		
			
			This wasn't used except for a test and wasn't working with server side targets. Making this compatible with SST wasn't trivial, so I went for removing this. Differential Revision: https://phabricator.services.mozilla.com/D130919
		
			
				
	
	
		
			131 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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 browser */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const { require } = ChromeUtils.import(
 | |
|   "resource://devtools/shared/loader/Loader.jsm"
 | |
| );
 | |
| 
 | |
| // URL constructor doesn't support about: scheme
 | |
| const href = window.location.href.replace("about:", "http://");
 | |
| const url = new window.URL(href);
 | |
| 
 | |
| // `host` is the frame element loading the toolbox.
 | |
| let host = window.browsingContext.embedderElement;
 | |
| 
 | |
| // If there's no containerElement (which happens when loading about:devtools-toolbox as
 | |
| // a top level document), use the current window.
 | |
| if (!host) {
 | |
|   host = {
 | |
|     contentWindow: window,
 | |
|     contentDocument: document,
 | |
|     // toolbox-host-manager.js wants to set attributes on the frame that contains it,
 | |
|     // but that is fine to skip and doesn't make sense when using the current window.
 | |
|     setAttribute() {},
 | |
|     ownerDocument: document,
 | |
|     // toolbox-host-manager.js wants to listen for unload events from outside the frame,
 | |
|     // but this is fine to skip since the toolbox code listens inside the frame as well,
 | |
|     // and there is no outer document in this case.
 | |
|     addEventListener() {},
 | |
|   };
 | |
| }
 | |
| 
 | |
| const onLoad = new Promise(r => {
 | |
|   host.contentWindow.addEventListener("DOMContentLoaded", r, { once: true });
 | |
| });
 | |
| 
 | |
| async function showErrorPage(doc, errorMessage) {
 | |
|   const win = doc.defaultView;
 | |
|   const { BrowserLoader } = ChromeUtils.import(
 | |
|     "resource://devtools/shared/loader/browser-loader.js"
 | |
|   );
 | |
|   const browserRequire = BrowserLoader({
 | |
|     window: win,
 | |
|     useOnlyShared: true,
 | |
|   }).require;
 | |
| 
 | |
|   const React = browserRequire("devtools/client/shared/vendor/react");
 | |
|   const ReactDOM = browserRequire("devtools/client/shared/vendor/react-dom");
 | |
|   const DebugTargetErrorPage = React.createFactory(
 | |
|     require("devtools/client/framework/components/DebugTargetErrorPage")
 | |
|   );
 | |
|   const { LocalizationHelper } = browserRequire("devtools/shared/l10n");
 | |
|   const L10N = new LocalizationHelper(
 | |
|     "devtools/client/locales/toolbox.properties"
 | |
|   );
 | |
| 
 | |
|   // mount the React component into our XUL container once the DOM is ready
 | |
|   await onLoad;
 | |
| 
 | |
|   // Update the tab title.
 | |
|   document.title = L10N.getStr("toolbox.debugTargetInfo.tabTitleError");
 | |
| 
 | |
|   const mountEl = doc.querySelector("#toolbox-error-mount");
 | |
|   const element = DebugTargetErrorPage({
 | |
|     errorMessage,
 | |
|     L10N,
 | |
|   });
 | |
|   ReactDOM.render(element, mountEl);
 | |
| 
 | |
|   // make sure we unmount the component when the page is destroyed
 | |
|   win.addEventListener(
 | |
|     "unload",
 | |
|     () => {
 | |
|       ReactDOM.unmountComponentAtNode(mountEl);
 | |
|     },
 | |
|     { once: true }
 | |
|   );
 | |
| }
 | |
| 
 | |
| async function initToolbox(url, host) {
 | |
|   const { gDevTools } = require("devtools/client/framework/devtools");
 | |
| 
 | |
|   const {
 | |
|     descriptorFromURL,
 | |
|   } = require("devtools/client/framework/descriptor-from-url");
 | |
|   const { Toolbox } = require("devtools/client/framework/toolbox");
 | |
| 
 | |
|   // Specify the default tool to open
 | |
|   const tool = url.searchParams.get("tool");
 | |
| 
 | |
|   try {
 | |
|     const descriptor = await descriptorFromURL(url);
 | |
|     const toolbox = gDevTools.getToolboxForDescriptor(descriptor);
 | |
|     if (toolbox && toolbox.isDestroying()) {
 | |
|       // If a toolbox already exists for the descriptor, wait for current
 | |
|       // toolbox destroy to be finished.
 | |
|       await toolbox.destroy();
 | |
|     }
 | |
| 
 | |
|     // Display an error page if we are connected to a remote target and we lose it
 | |
|     descriptor.once("descriptor-destroyed", function() {
 | |
|       // Prevent trying to display the error page if the toolbox tab is being destroyed
 | |
|       if (host.contentDocument) {
 | |
|         const error = new Error("Debug target was disconnected");
 | |
|         showErrorPage(host.contentDocument, `${error}`);
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     const options = { customIframe: host };
 | |
|     await gDevTools.showToolbox(descriptor, {
 | |
|       toolId: tool,
 | |
|       hostType: Toolbox.HostType.PAGE,
 | |
|       hostOptions: options,
 | |
|     });
 | |
|   } catch (error) {
 | |
|     // When an error occurs, show error page with message.
 | |
|     console.error("Exception while loading the toolbox", error);
 | |
|     showErrorPage(host.contentDocument, `${error}`);
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Only use this method to attach the toolbox if some query parameters are given
 | |
| if (url.search.length > 1) {
 | |
|   initToolbox(url, host);
 | |
| }
 | |
| // TODO: handle no params in about:devtool-toolbox
 | |
| // https://bugzilla.mozilla.org/show_bug.cgi?id=1526996
 |