Bug 1265796 - remove dummy document from rule view; r?gregtatum
MozReview-Commit-ID: 3iyEuTrWe19
--- a/devtools/client/inspector/rules/rules.js
+++ b/devtools/client/inspector/rules/rules.js
@@ -3,17 +3,16 @@
/* 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/. */
/* globals gDevTools */
"use strict";
const promise = require("promise");
-const defer = require("devtools/shared/defer");
const Services = require("Services");
const {Task} = require("devtools/shared/task");
const {Tools} = require("devtools/client/definitions");
const {l10n} = require("devtools/shared/inspector/css-logic");
const {ELEMENT_STYLE} = require("devtools/shared/specs/styles");
const {OutputParser} = require("devtools/client/shared/output-parser");
const {PrefObserver, PREF_ORIG_SOURCES} = require("devtools/client/styleeditor/utils");
const {ElementStyle} = require("devtools/client/inspector/rules/models/element-style");
@@ -74,57 +73,16 @@ const FILTER_STRICT_RE = /\s*`(.*?)`\s*$
* TextPropertyEditor:
* Owns a TextProperty object.
* Manages changes to the TextProperty.
* Can be expanded to display computed properties.
* Can mark a property disabled or enabled.
*/
/**
- * To figure out how shorthand properties are interpreted by the
- * engine, we will set properties on a dummy element and observe
- * how their .style attribute reflects them as computed values.
- * This function creates the document in which those dummy elements
- * will be created.
- */
-var gDummyPromise;
-function createDummyDocument() {
- if (gDummyPromise) {
- return gDummyPromise;
- }
- const { getDocShell, create: makeFrame } = require("sdk/frame/utils");
-
- let frame = makeFrame(Services.appShell.hiddenDOMWindow.document, {
- nodeName: "iframe",
- namespaceURI: "http://www.w3.org/1999/xhtml",
- allowJavascript: false,
- allowPlugins: false,
- allowAuth: false
- });
- let docShell = getDocShell(frame);
- let eventTarget = docShell.chromeEventHandler;
- let ssm = Services.scriptSecurityManager;
-
- // We probably need to call InheritFromDocShellToDoc to get the correct origin
- // attributes, but right now we can't call it from JS.
- let nullPrincipal = ssm.createNullPrincipal(docShell.getOriginAttributes());
- docShell.createAboutBlankContentViewer(nullPrincipal);
- let window = docShell.contentViewer.DOMDocument.defaultView;
- window.location = "data:text/html,<html></html>";
- let deferred = defer();
- eventTarget.addEventListener("DOMContentLoaded", function handler() {
- eventTarget.removeEventListener("DOMContentLoaded", handler, false);
- deferred.resolve(window.document);
- frame.remove();
- }, false);
- gDummyPromise = deferred.promise;
- return gDummyPromise;
-}
-
-/**
* CssRuleView is a view of the style rules and declarations that
* apply to a given element. After construction, the 'element'
* property will be available with the user interface.
*
* @param {Inspector} inspector
* Inspector toolbox panel
* @param {Document} document
* The document that will contain the rule view.
@@ -712,18 +670,16 @@ CssRuleView.prototype = {
return false;
},
destroy: function () {
this.isDestroyed = true;
this.clear();
this._dummyElement = null;
- this.dummyElementPromise = null;
- gDummyPromise = null;
this._prefObserver.off(PREF_ORIG_SOURCES, this._onSourcePrefChanged);
this._prefObserver.off(PREF_UA_STYLES, this._handlePrefChange);
this._prefObserver.off(PREF_DEFAULT_COLOR_UNIT, this._handlePrefChange);
this._prefObserver.destroy();
this._outputParser = null;
@@ -820,33 +776,31 @@ CssRuleView.prototype = {
this._showEmpty();
this.refreshPseudoClassPanel();
return promise.resolve(undefined);
}
// To figure out how shorthand properties are interpreted by the
// engine, we will set properties on a dummy element and observe
// how their .style attribute reflects them as computed values.
- this.dummyElementPromise = createDummyDocument().then(document => {
+ let dummyElementPromise = promise.resolve(this.styleDocument).then(document => {
// ::before and ::after do not have a namespaceURI
let namespaceURI = this.element.namespaceURI ||
document.documentElement.namespaceURI;
this._dummyElement = document.createElementNS(namespaceURI,
this.element.tagName);
- document.documentElement.appendChild(this._dummyElement);
- return this._dummyElement;
}).then(null, promiseWarn);
let elementStyle = new ElementStyle(element, this, this.store,
this.pageStyle, this.showUserAgentStyles);
this._elementStyle = elementStyle;
this._startSelectingElement();
- return this.dummyElementPromise.then(() => {
+ return dummyElementPromise.then(() => {
if (this._elementStyle === elementStyle) {
return this._populate();
}
return undefined;
}).then(() => {
if (this._elementStyle === elementStyle) {
if (!refresh) {
this.element.scrollTop = 0;