2016-12-07 20:24:51 +03:00
|
|
|
/* 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, document */
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const React = require("devtools/client/shared/vendor/react");
|
|
|
|
const ReactDOM = require("devtools/client/shared/vendor/react-dom");
|
|
|
|
const { appinfo } = require("Services");
|
|
|
|
|
|
|
|
const { buildFakeToolbox, Inspector } = require("./inspector");
|
|
|
|
|
|
|
|
function onConnect(arg) {
|
|
|
|
if (!arg || !arg.client) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let client = arg.client;
|
|
|
|
|
|
|
|
const tabTarget = client.getTabTarget();
|
|
|
|
let threadClient = { paused: false };
|
|
|
|
buildFakeToolbox(
|
|
|
|
tabTarget,
|
|
|
|
() => threadClient,
|
|
|
|
{ React, ReactDOM, browserRequire: () => {} }
|
|
|
|
).then(function (fakeToolbox) {
|
|
|
|
let inspector = new Inspector(fakeToolbox);
|
|
|
|
inspector.init();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Stylesheet links in devtools xhtml files are using chrome or resource URLs.
|
|
|
|
* Rewrite the href attribute to remove the protocol. web-server.js contains redirects
|
|
|
|
* to map CSS urls to the proper file. Supports urls using:
|
|
|
|
* - devtools/client/
|
|
|
|
* - devtools/content/
|
|
|
|
* - skin/
|
|
|
|
* The css for the light-theme will additionally be loaded.
|
|
|
|
* Will also add mandatory classnames and attributes to be compatible with devtools theme
|
|
|
|
* stylesheet.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
function fixStylesheets(doc) {
|
|
|
|
let links = doc.head.querySelectorAll("link");
|
|
|
|
for (let link of links) {
|
|
|
|
link.href = link.href.replace(/(resource|chrome)\:\/\//, "/");
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add the light theme stylesheet to compensate for the missing theme-switching.js
|
|
|
|
let themeLink = doc.createElement("link");
|
|
|
|
themeLink.setAttribute("rel", "stylesheet");
|
|
|
|
themeLink.setAttribute("href", "/devtools/skin/light-theme.css");
|
|
|
|
|
|
|
|
doc.head.appendChild(themeLink);
|
|
|
|
doc.documentElement.classList.add("theme-light");
|
|
|
|
doc.body.classList.add("theme-light");
|
|
|
|
|
|
|
|
if (appinfo.OS === "Darwin") {
|
|
|
|
doc.documentElement.setAttribute("platform", "mac");
|
|
|
|
} else if (appinfo.OS === "Linux") {
|
|
|
|
doc.documentElement.setAttribute("platform", "linux");
|
|
|
|
} else {
|
|
|
|
doc.documentElement.setAttribute("platform", "win");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Called each time a childList mutation is received on the main document.
|
|
|
|
* Check the iframes currently loaded in the document and call fixStylesheets if needed.
|
|
|
|
*/
|
|
|
|
function fixStylesheetsOnMutation() {
|
|
|
|
let frames = document.body.querySelectorAll("iframe");
|
|
|
|
for (let frame of frames) {
|
|
|
|
let doc = frame.contentDocument || frame.contentWindow.document;
|
|
|
|
if (doc.__fixStylesheetsFlag) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Mark the document as processed to avoid extra changes.
|
|
|
|
doc.__fixStylesheetsFlag = true;
|
|
|
|
if (doc.readyState !== "complete") {
|
|
|
|
// If the document is not loaded yet, wait for DOMContentLoaded.
|
|
|
|
frame.contentWindow.addEventListener("DOMContentLoaded", () => {
|
|
|
|
fixStylesheets(doc);
|
|
|
|
}, { once: true });
|
|
|
|
} else {
|
|
|
|
fixStylesheets(doc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-25 09:01:52 +03:00
|
|
|
window.addEventListener("DOMContentLoaded", function () {
|
2016-12-07 20:24:51 +03:00
|
|
|
// Add styling for the main document.
|
|
|
|
fixStylesheets(document);
|
|
|
|
|
|
|
|
// Add a mutation observer to check if new iframes have been loaded and need to have
|
|
|
|
// their stylesheet links updated.
|
|
|
|
new window.MutationObserver(mutations => {
|
|
|
|
fixStylesheetsOnMutation();
|
|
|
|
}).observe(document.body, { childList: true, subtree: true });
|
|
|
|
|
|
|
|
const hasFirefoxTabParam = window.location.href.indexOf("firefox-tab") != -1;
|
|
|
|
if (!hasFirefoxTabParam) {
|
|
|
|
const inspectorRoot = document.querySelector(".inspector");
|
|
|
|
// Remove the inspector specific markup and add the landing page root element.
|
|
|
|
inspectorRoot.remove();
|
|
|
|
let mount = document.createElement("div");
|
|
|
|
mount.setAttribute("id", "mount");
|
|
|
|
document.body.appendChild(mount);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Toolbox tries to add a theme classname on the documentElement and should only be
|
|
|
|
// required after DOMContentLoaded.
|
2017-01-18 22:49:40 +03:00
|
|
|
const { bootstrap } = require("devtools-launchpad");
|
2016-12-07 20:24:51 +03:00
|
|
|
bootstrap(React, ReactDOM).then(onConnect);
|
2017-01-25 09:01:52 +03:00
|
|
|
}, {once: true});
|