/* 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/. */
/* A host should always allow this much space for the page to be displayed. * There is also a min-height on the browser, but we still don't want to set * frame.style.height to be larger than that, since it can cause problems with
* resizing the toolbox and panel layout. */ const MIN_PAGE_SIZE = 25;
/** * A toolbox host represents an object that contains a toolbox (e.g. the * sidebar or a separate window). Any host object should implement the * following functions: * * create() - create the UI * destroy() - destroy the host's UI
*/
/** * Host object for the dock on the bottom of the browser
*/ function BottomHost(hostTab) { this.hostTab = hostTab;
EventEmitter.decorate(this);
}
BottomHost.prototype = {
type: "bottom",
heightPref: "devtools.toolbox.footer.height",
/** * Create a box at the bottom of the host tab.
*/
async create() {
await gDevToolsBrowser.loadBrowserStyleSheet(this.hostTab.ownerGlobal);
// We should consider the direction when changing the dock position. const topWindow = this.hostTab.ownerDocument.defaultView.top; const topDoc = topWindow.document.documentElement; const isLTR = topWindow.getComputedStyle(topDoc).direction === "ltr";
/** * Host object for the in-browser left sidebar
*/ class LeftHost extends SidebarHost {
constructor(hostTab) { super(hostTab, "left");
}
}
/** * Host object for the in-browser right sidebar
*/ class RightHost extends SidebarHost {
constructor(hostTab) { super(hostTab, "right");
}
}
/** * Host object for the toolbox in a separate window
*/ function WindowHost(hostTab, options) { this._boundUnload = this._boundUnload.bind(this); this.hostTab = hostTab; this.options = options;
EventEmitter.decorate(this);
}
/** * Create a new xul window to contain the toolbox.
*/
create() { returnnew Promise(resolve => {
let flags = "chrome,centerscreen,resizable,dialog=no";
// If we are debugging a tab which is in a Private window, we must also // set the private flag on the DevTools host window. Otherwise switching // hosts between docked and window modes can fail due to incompatible // docshell origin attributes. See 1581093. const owner = this.hostTab?.ownerGlobal; if (owner && lazy.PrivateBrowsingUtils.isWindowPrivate(owner)) {
flags += ",private";
}
// If the current window is a non-fission window, force the non-fission // flag. Otherwise switching to window host from a non-fission window in // a fission Firefox (!) will attempt to swapFrameLoaders between fission // and non-fission frames. See Bug 1650963. if (this.hostTab && !this.hostTab.ownerGlobal.gFissionBrowser) {
flags += ",non-fission";
}
// When debugging local Web Extension, the toolbox is opened in an // always foremost top level window in order to be kept visible // when interacting with the Firefox Window. if (this.options?.alwaysOnTop) {
flags += ",alwaysontop";
}
// The forceOwnRefreshDriver attribute is set to avoid Windows only issues with // CSS transitions when switching from docked to window hosts. // Added in Bug 832920, should be reviewed in Bug 1542468. this.frame.setAttribute("forceOwnRefreshDriver", "");
resolve(this.frame);
};
/** * Catch the user closing the window.
*/
_boundUnload(event) { if (event.target.location != this.WINDOW_URL) { return;
} this._window.removeEventListener("unload", this._boundUnload);
this.emit("window-closed");
},
/** * Raise the host.
*/
raise() { this._window.focus();
},
/** * Set the toolbox title.
*/
setTitle(title) { this._window.document.title = title;
},
/** * Destroy the window.
*/
destroy() { if (!this._destroyed) { this._destroyed = true;
/** * Raise the host.
*/
raise() { this.doc.defaultView.focus();
},
/** * Set the toolbox title.
*/
setTitle(title) { this.doc.title = title;
},
// Do nothing. The BrowserToolbox is destroyed by quitting the application.
destroy() { return Promise.resolve(null);
},
};
/** * Host object for the toolbox as a page. * This is typically used by `about:debugging`, when opening toolbox in a new tab, * via `about:devtools-toolbox` URLs. * The `iframe` ends up being the tab's browser element.
*/ function PageHost(hostTab, options) { this.frame = options.customIframe;
}
PageHost.prototype = {
type: "page",
create() { return Promise.resolve(this.frame);
},
// Do nothing.
raise() {},
// Do nothing.
setTitle() {},
// Do nothing.
destroy() { return Promise.resolve(null);
},
};
/** * Switch to the given tab in a browser and focus the browser window
*/ function focusTab(tab) { const browserWindow = tab.ownerDocument.defaultView;
browserWindow.focus();
browserWindow.gBrowser.selectedTab = tab;
}
/** * Create an iframe that can be used to load DevTools via about:devtools-toolbox.
*/ function createDevToolsFrame(doc, className) { const frame = doc.createXULElement("browser");
frame.setAttribute("type", "content");
frame.style.flex = "1 auto"; // Required to be able to shrink when the window shrinks
frame.className = className;
const inXULDocument = doc.documentElement.namespaceURI === XUL_NS; if (inXULDocument) { // When the toolbox frame is loaded in a XUL document, tooltips rely on a // special XUL <tooltip id="aHTMLTooltip"> element. // This attribute should not be set when the frame is loaded in a HTML // document (for instance: Browser Toolbox).
frame.tooltip = "aHTMLTooltip";
} return frame;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.