Bug 1316577 - move chrome tab loading logic out of inspector.js;r=ochameau
MozReview-Commit-ID: APAOPOMRVHp
--- a/devtools/client/inspector/inspector.js
+++ b/devtools/client/inspector/inspector.js
@@ -1,20 +1,20 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* 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/. */
-/* global window */
+/* global window, chrometabHelper */
"use strict";
var Cu = Components.utils;
-var { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
+var { require, loader } = Cu.import("resource://devtools/shared/Loader.jsm", {});
var Services = require("Services");
var promise = require("promise");
var defer = require("devtools/shared/defer");
var EventEmitter = require("devtools/shared/event-emitter");
const {executeSoon} = require("devtools/shared/DevToolsUtils");
var {KeyShortcuts} = require("devtools/client/shared/key-shortcuts");
var {Task} = require("devtools/shared/task");
const {initCssProperties} = require("devtools/shared/fronts/css-properties");
@@ -30,16 +30,19 @@ const {FontInspector} = require("devtool
const {HTMLBreadcrumbs} = require("devtools/client/inspector/breadcrumbs");
const {InspectorSearch} = require("devtools/client/inspector/inspector-search");
const MarkupView = require("devtools/client/inspector/markup/markup");
const {RuleViewTool} = require("devtools/client/inspector/rules/rules");
const {ToolSidebar} = require("devtools/client/inspector/toolsidebar");
const {ViewHelpers} = require("devtools/client/shared/widgets/view-helpers");
const clipboardHelper = require("devtools/shared/platform/clipboard");
+loader.lazyRequireGetter(this, "chrometabHelper",
+ "devtools/client/inspector/shared/chrometab-helper");
+
const {LocalizationHelper, localizeMarkup} = require("devtools/shared/l10n");
const INSPECTOR_L10N =
new LocalizationHelper("devtools/client/locales/inspector.properties");
const TOOLBOX_L10N = new LocalizationHelper("devtools/client/locales/toolbox.properties");
// Sidebar dimensions
const INITIAL_SIDEBAR_SIZE = 350;
@@ -1855,88 +1858,16 @@ Inspector.prototype = {
};
// URL constructor doesn't support chrome: scheme
let href = window.location.href.replace(/chrome:/, "http://");
let url = new window.URL(href);
// Only use this method to attach the toolbox if some query parameters are given
if (url.search.length > 1) {
- const { targetFromURL } = require("devtools/client/framework/target-from-url");
- const { attachThread } = require("devtools/client/framework/attach-thread");
- const { BrowserLoader } =
- Cu.import("resource://devtools/client/shared/browser-loader.js", {});
-
- const { Selection } = require("devtools/client/framework/selection");
- const { InspectorFront } = require("devtools/shared/fronts/inspector");
- const { getHighlighterUtils } = require("devtools/client/framework/toolbox-highlighter-utils");
-
Task.spawn(function* () {
- let target = yield targetFromURL(url);
-
- let notImplemented = function () {
- throw new Error("Not implemented in a tab");
- };
- let fakeToolbox = {
- target,
- hostType: "bottom",
- doc: window.document,
- win: window,
- on() {}, emit() {}, off() {},
- initInspector() {},
- browserRequire: BrowserLoader({
- window: window,
- useOnlyShared: true
- }).require,
- get React() {
- return this.browserRequire("devtools/client/shared/vendor/react");
- },
- get ReactDOM() {
- return this.browserRequire("devtools/client/shared/vendor/react-dom");
- },
- isToolRegistered() {
- return false;
- },
- currentToolId: "inspector",
- getCurrentPanel() {
- return "inspector";
- },
- get textboxContextMenuPopup() {
- notImplemented();
- },
- getPanel: notImplemented,
- openSplitConsole: notImplemented,
- viewCssSourceInStyleEditor: notImplemented,
- viewJsSourceInDebugger: notImplemented,
- viewSource: notImplemented,
- viewSourceInDebugger: notImplemented,
- viewSourceInStyleEditor: notImplemented,
-
- // For attachThread:
- highlightTool() {},
- unhighlightTool() {},
- selectTool() {},
- raise() {},
- getNotificationBox() {}
- };
-
- // attachThread also expect a toolbox as argument
- fakeToolbox.threadClient = yield attachThread(fakeToolbox);
-
- let inspector = InspectorFront(target.client, target.form);
- let showAllAnonymousContent =
- Services.prefs.getBoolPref("devtools.inspector.showAllAnonymousContent");
- let walker = yield inspector.getWalker({ showAllAnonymousContent });
- let selection = new Selection(walker);
- let highlighter = yield inspector.getHighlighter(false);
-
- fakeToolbox.inspector = inspector;
- fakeToolbox.walker = walker;
- fakeToolbox.selection = selection;
- fakeToolbox.highlighter = highlighter;
- fakeToolbox.highlighterUtils = getHighlighterUtils(fakeToolbox);
-
+ let fakeToolbox = yield chrometabHelper.createToolbox(url, window);
let inspectorUI = new Inspector(fakeToolbox);
inspectorUI.init();
}).then(null, e => {
window.alert("Unable to start the inspector:" + e.message + "\n" + e.stack);
});
}
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/shared/chrometab-helper.js
@@ -0,0 +1,106 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* 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/. */
+
+"use strict";
+
+/**
+ * Helper methods to allow the inspector to be loaded in a chrome priviledged tab, using
+ * URLs following the syntax :
+ * chrome://devtools/content/inspector/inspector.xhtml?type=tab&id={tab-id}
+ */
+
+/* eslint-disable mozilla/reject-some-requires */
+const { Cu } = require("chrome");
+
+const Services = require("Services");
+const { BrowserLoader } =
+ Cu.import("resource://devtools/client/shared/browser-loader.js", {});
+
+const { targetFromURL } = require("devtools/client/framework/target-from-url");
+const { attachThread } = require("devtools/client/framework/attach-thread");
+
+const { Selection } = require("devtools/client/framework/selection");
+const { InspectorFront } = require("devtools/shared/fronts/inspector");
+const { getHighlighterUtils } = require("devtools/client/framework/toolbox-highlighter-utils");
+var {Task} = require("devtools/shared/task");
+
+/**
+ * Create a fake toolbox object needed to initialize the Inspector when loaded in a chrome
+ * tab context.
+ *
+ * @param {URL} url
+ * URL to parse in order to extract a valid target for the inspector.
+ * @param {Window} window
+ * Global window object where inspector.xhtml is loaded.
+ */
+exports.createToolbox = Task.async(function* (url, window) {
+ let target = yield targetFromURL(url);
+
+ let notImplemented = function () {
+ throw new Error("Not implemented in a tab");
+ };
+ let fakeToolbox = {
+ target,
+ hostType: "bottom",
+ doc: window.document,
+ win: window,
+ on() {}, emit() {}, off() {},
+ initInspector() {},
+ browserRequire: BrowserLoader({
+ window: window,
+ useOnlyShared: true
+ }).require,
+ get React() {
+ return this.browserRequire("devtools/client/shared/vendor/react");
+ },
+ get ReactDOM() {
+ return this.browserRequire("devtools/client/shared/vendor/react-dom");
+ },
+ isToolRegistered() {
+ return false;
+ },
+ currentToolId: "inspector",
+ getCurrentPanel() {
+ return "inspector";
+ },
+ get textboxContextMenuPopup() {
+ notImplemented();
+ },
+ getPanel: notImplemented,
+ openSplitConsole: notImplemented,
+ viewCssSourceInStyleEditor: notImplemented,
+ viewJsSourceInDebugger: notImplemented,
+ viewSource: notImplemented,
+ viewSourceInDebugger: notImplemented,
+ viewSourceInStyleEditor: notImplemented,
+
+ // For attachThread:
+ highlightTool() {},
+ unhighlightTool() {},
+ selectTool() {},
+ raise() {},
+ getNotificationBox() {}
+ };
+
+ // attachThread also expect a toolbox as argument
+ fakeToolbox.threadClient = yield attachThread(fakeToolbox);
+
+ let inspector = InspectorFront(target.client, target.form);
+ let showAllAnonymousContent =
+ Services.prefs.getBoolPref("devtools.inspector.showAllAnonymousContent");
+ let walker = yield inspector.getWalker({ showAllAnonymousContent });
+ let selection = new Selection(walker);
+ let highlighter = yield inspector.getHighlighter(false);
+
+ fakeToolbox.inspector = inspector;
+ fakeToolbox.walker = walker;
+ fakeToolbox.selection = selection;
+ fakeToolbox.highlighter = highlighter;
+ fakeToolbox.highlighterUtils = getHighlighterUtils(fakeToolbox);
+
+ return fakeToolbox;
+});
+
--- a/devtools/client/inspector/shared/moz.build
+++ b/devtools/client/inspector/shared/moz.build
@@ -1,14 +1,15 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# 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/.
DevToolsModules(
+ 'chrometab-helper.js',
'dom-node-preview.js',
'style-inspector-menu.js',
'style-inspector-overlays.js',
'utils.js'
)
BROWSER_CHROME_MANIFESTS += ['test/browser.ini']