235 lines
6.3 KiB
JavaScript
235 lines
6.3 KiB
JavaScript
/*
|
|
* Copyright (C) 2013 Apple Inc. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
|
* THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
WI.CSSStyleSheet = class CSSStyleSheet extends WI.SourceCode
|
|
{
|
|
constructor(id)
|
|
{
|
|
super();
|
|
|
|
console.assert(id);
|
|
|
|
this._id = id || null;
|
|
this._parentFrame = null;
|
|
this._origin = null;
|
|
this._startLineNumber = 0;
|
|
this._startColumnNumber = 0;
|
|
|
|
this._inlineStyleAttribute = false;
|
|
this._inlineStyleTag = false;
|
|
|
|
this._hasInfo = false;
|
|
}
|
|
|
|
// Static
|
|
|
|
static resetUniqueDisplayNameNumbers()
|
|
{
|
|
WI.CSSStyleSheet._nextUniqueDisplayNameNumber = 1;
|
|
}
|
|
|
|
// Public
|
|
|
|
get id()
|
|
{
|
|
return this._id;
|
|
}
|
|
|
|
get parentFrame()
|
|
{
|
|
return this._parentFrame;
|
|
}
|
|
|
|
get origin()
|
|
{
|
|
return this._origin;
|
|
}
|
|
|
|
get injected()
|
|
{
|
|
return WI.browserManager.isExtensionScheme(this.urlComponents.scheme);
|
|
}
|
|
|
|
get anonymous()
|
|
{
|
|
return !this.isInspectorStyleSheet() && !this._url;
|
|
}
|
|
|
|
get mimeType()
|
|
{
|
|
return "text/css";
|
|
}
|
|
|
|
get displayName()
|
|
{
|
|
if (this.isInspectorStyleSheet())
|
|
return WI.UIString("Inspector Style Sheet");
|
|
|
|
if (this._url)
|
|
return WI.displayNameForURL(this._url, this.urlComponents);
|
|
|
|
// Assign a unique number to the StyleSheet object so it will stay the same.
|
|
if (!this._uniqueDisplayNameNumber)
|
|
this._uniqueDisplayNameNumber = this.constructor._nextUniqueDisplayNameNumber++;
|
|
|
|
return WI.UIString("Anonymous Style Sheet %d").format(this._uniqueDisplayNameNumber);
|
|
}
|
|
|
|
get startLineNumber()
|
|
{
|
|
return this._startLineNumber;
|
|
}
|
|
|
|
get startColumnNumber()
|
|
{
|
|
return this._startColumnNumber;
|
|
}
|
|
|
|
hasInfo()
|
|
{
|
|
return this._hasInfo;
|
|
}
|
|
|
|
isInspectorStyleSheet()
|
|
{
|
|
return this._origin === WI.CSSStyleSheet.Type.Inspector;
|
|
}
|
|
|
|
isInlineStyleTag()
|
|
{
|
|
return this._inlineStyleTag;
|
|
}
|
|
|
|
isInlineStyleAttributeStyleSheet()
|
|
{
|
|
return this._inlineStyleAttribute;
|
|
}
|
|
|
|
markAsInlineStyleAttributeStyleSheet()
|
|
{
|
|
this._inlineStyleAttribute = true;
|
|
}
|
|
|
|
offsetSourceCodeLocation(sourceCodeLocation)
|
|
{
|
|
if (!sourceCodeLocation)
|
|
return null;
|
|
|
|
if (!this._hasInfo)
|
|
return sourceCodeLocation;
|
|
|
|
let sourceCode = sourceCodeLocation.sourceCode;
|
|
let lineNumber = this._startLineNumber + sourceCodeLocation.lineNumber;
|
|
let columnNumber = this._startColumnNumber + sourceCodeLocation.columnNumber;
|
|
return sourceCode.createSourceCodeLocation(lineNumber, columnNumber);
|
|
}
|
|
|
|
// Protected
|
|
|
|
updateInfo(url, parentFrame, origin, inlineStyle, startLineNumber, startColumnNumber)
|
|
{
|
|
this._hasInfo = true;
|
|
|
|
this._url = url || null;
|
|
this._urlComponents = undefined;
|
|
|
|
this._parentFrame = parentFrame || null;
|
|
this._origin = origin;
|
|
|
|
this._inlineStyleTag = inlineStyle;
|
|
this._startLineNumber = startLineNumber;
|
|
this._startColumnNumber = startColumnNumber;
|
|
}
|
|
|
|
get revisionForRequestedContent()
|
|
{
|
|
return this.currentRevision;
|
|
}
|
|
|
|
handleCurrentRevisionContentChange()
|
|
{
|
|
if (!this._id)
|
|
return;
|
|
|
|
let target = WI.assumingMainTarget();
|
|
|
|
function contentDidChange(error)
|
|
{
|
|
if (error)
|
|
return;
|
|
|
|
if (target.hasCommand("DOM.markUndoableState"))
|
|
target.DOMAgent.markUndoableState();
|
|
|
|
this.dispatchEventToListeners(WI.CSSStyleSheet.Event.ContentDidChange);
|
|
}
|
|
|
|
this._ignoreNextContentDidChangeNotification = true;
|
|
|
|
target.CSSAgent.setStyleSheetText(this._id, this.currentRevision.content, contentDidChange.bind(this));
|
|
}
|
|
|
|
requestContentFromBackend()
|
|
{
|
|
let specialContentPromise = WI.SourceCode.generateSpecialContentForURL(this._url);
|
|
if (specialContentPromise)
|
|
return specialContentPromise;
|
|
|
|
if (!this._id) {
|
|
// There is no identifier to request content with. Reject the promise to cause the
|
|
// pending callbacks to get null content.
|
|
return Promise.reject(new Error("There is no identifier to request content with."));
|
|
}
|
|
|
|
let target = WI.assumingMainTarget();
|
|
return target.CSSAgent.getStyleSheetText(this._id);
|
|
}
|
|
|
|
noteContentDidChange()
|
|
{
|
|
if (this._ignoreNextContentDidChangeNotification) {
|
|
this._ignoreNextContentDidChangeNotification = false;
|
|
return false;
|
|
}
|
|
|
|
this.markContentAsStale();
|
|
this.dispatchEventToListeners(WI.CSSStyleSheet.Event.ContentDidChange);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
WI.CSSStyleSheet._nextUniqueDisplayNameNumber = 1;
|
|
|
|
WI.CSSStyleSheet.Event = {
|
|
ContentDidChange: "css-style-sheet-content-did-change"
|
|
};
|
|
|
|
WI.CSSStyleSheet.Type = {
|
|
Author: "css-style-sheet-type-author",
|
|
User: "css-style-sheet-type-user",
|
|
UserAgent: "css-style-sheet-type-user-agent",
|
|
Inspector: "css-style-sheet-type-inspector"
|
|
};
|