DevTools: refactor InspectorStyleSheet

Introduce InspectorStyleSheetBase, inherit InspectorStyleSheet and InspectorStyleSheetForInlineStyle from it.

BUG=341506

Review URL: https://codereview.chromium.org/202103002

git-svn-id: svn://svn.chromium.org/blink/trunk@169550 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 91fae4bb
......@@ -121,14 +121,10 @@ static unsigned computePseudoClassMask(JSONArray* pseudoClassArray)
class InspectorCSSAgent::StyleSheetAction : public InspectorHistory::Action {
WTF_MAKE_NONCOPYABLE(StyleSheetAction);
public:
StyleSheetAction(const String& name, InspectorStyleSheet* styleSheet)
StyleSheetAction(const String& name)
: InspectorHistory::Action(name)
, m_styleSheet(styleSheet)
{
}
protected:
RefPtr<InspectorStyleSheet> m_styleSheet;
};
class InspectorCSSAgent::EnableResourceClient FINAL : public StyleSheetResourceClient {
......@@ -175,8 +171,9 @@ void InspectorCSSAgent::EnableResourceClient::setCSSStyleSheet(const String&, co
class InspectorCSSAgent::SetStyleSheetTextAction FINAL : public InspectorCSSAgent::StyleSheetAction {
WTF_MAKE_NONCOPYABLE(SetStyleSheetTextAction);
public:
SetStyleSheetTextAction(InspectorStyleSheet* styleSheet, const String& text)
: InspectorCSSAgent::StyleSheetAction("SetStyleSheetText", styleSheet)
SetStyleSheetTextAction(InspectorStyleSheetBase* styleSheet, const String& text)
: InspectorCSSAgent::StyleSheetAction("SetStyleSheetText")
, m_styleSheet(styleSheet)
, m_text(text)
{
}
......@@ -220,6 +217,7 @@ public:
}
private:
RefPtr<InspectorStyleSheetBase> m_styleSheet;
String m_text;
String m_oldText;
};
......@@ -227,8 +225,9 @@ private:
class InspectorCSSAgent::SetPropertyTextAction FINAL : public InspectorCSSAgent::StyleSheetAction {
WTF_MAKE_NONCOPYABLE(SetPropertyTextAction);
public:
SetPropertyTextAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, unsigned propertyIndex, const String& text, bool overwrite)
: InspectorCSSAgent::StyleSheetAction("SetPropertyText", styleSheet)
SetPropertyTextAction(InspectorStyleSheetBase* styleSheet, const InspectorCSSId& cssId, unsigned propertyIndex, const String& text, bool overwrite)
: InspectorCSSAgent::StyleSheetAction("SetPropertyText")
, m_styleSheet(styleSheet)
, m_cssId(cssId)
, m_propertyIndex(propertyIndex)
, m_text(text)
......@@ -274,6 +273,7 @@ public:
}
private:
RefPtr<InspectorStyleSheetBase> m_styleSheet;
InspectorCSSId m_cssId;
unsigned m_propertyIndex;
String m_text;
......@@ -285,7 +285,8 @@ class InspectorCSSAgent::SetRuleSelectorAction FINAL : public InspectorCSSAgent:
WTF_MAKE_NONCOPYABLE(SetRuleSelectorAction);
public:
SetRuleSelectorAction(InspectorStyleSheet* styleSheet, const InspectorCSSId& cssId, const String& selector)
: InspectorCSSAgent::StyleSheetAction("SetRuleSelector", styleSheet)
: InspectorCSSAgent::StyleSheetAction("SetRuleSelector")
, m_styleSheet(styleSheet)
, m_cssId(cssId)
, m_selector(selector)
{
......@@ -310,6 +311,7 @@ public:
}
private:
RefPtr<InspectorStyleSheet> m_styleSheet;
InspectorCSSId m_cssId;
String m_selector;
String m_oldSelector;
......@@ -319,7 +321,8 @@ class InspectorCSSAgent::AddRuleAction FINAL : public InspectorCSSAgent::StyleSh
WTF_MAKE_NONCOPYABLE(AddRuleAction);
public:
AddRuleAction(InspectorStyleSheet* styleSheet, const String& selector)
: InspectorCSSAgent::StyleSheetAction("AddRule", styleSheet)
: InspectorCSSAgent::StyleSheetAction("AddRule")
, m_styleSheet(styleSheet)
, m_selector(selector)
{
}
......@@ -346,6 +349,7 @@ public:
InspectorCSSId newRuleId() { return m_newId; }
private:
RefPtr<InspectorStyleSheet> m_styleSheet;
InspectorCSSId m_newId;
String m_selector;
String m_oldSelector;
......@@ -444,6 +448,7 @@ void InspectorCSSAgent::flushPendingFrontendMessages()
void InspectorCSSAgent::reset()
{
m_idToInspectorStyleSheet.clear();
m_idToInspectorStyleSheetForInlineStyle.clear();
m_cssStyleSheetToInspectorStyleSheet.clear();
m_documentToCSSStyleSheets.clear();
m_invalidatedDocuments.clear();
......@@ -819,7 +824,7 @@ void InspectorCSSAgent::getPlatformFontsForNode(ErrorString* errorString, int no
void InspectorCSSAgent::getStyleSheetText(ErrorString* errorString, const String& styleSheetId, String* result)
{
InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId);
InspectorStyleSheetBase* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId);
if (!inspectorStyleSheet)
return;
......@@ -828,7 +833,7 @@ void InspectorCSSAgent::getStyleSheetText(ErrorString* errorString, const String
void InspectorCSSAgent::setStyleSheetText(ErrorString* errorString, const String& styleSheetId, const String& text)
{
InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId);
InspectorStyleSheetBase* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId);
if (!inspectorStyleSheet) {
*errorString = "Style sheet with id " + styleSheetId + " not found.";
return;
......@@ -844,7 +849,7 @@ void InspectorCSSAgent::setPropertyText(ErrorString* errorString, const RefPtr<J
InspectorCSSId compoundId(fullStyleId);
ASSERT(!compoundId.isEmpty());
InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId());
InspectorStyleSheetBase* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId());
if (!inspectorStyleSheet)
return;
......@@ -860,7 +865,7 @@ void InspectorCSSAgent::setRuleSelector(ErrorString* errorString, const RefPtr<J
InspectorCSSId compoundId(fullRuleId);
ASSERT(!compoundId.isEmpty());
InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, compoundId.styleSheetId());
InspectorStyleSheet* inspectorStyleSheet = assertInspectorStyleSheetForId(errorString, compoundId.styleSheetId());
if (!inspectorStyleSheet)
return;
......@@ -901,7 +906,7 @@ void InspectorCSSAgent::createStyleSheet(ErrorString* errorString, const String&
void InspectorCSSAgent::addRule(ErrorString* errorString, const String& styleSheetId, const String& selector, RefPtr<TypeBuilder::CSS::CSSRule>& result)
{
InspectorStyleSheet* inspectorStyleSheet = assertStyleSheetForId(errorString, styleSheetId);
InspectorStyleSheet* inspectorStyleSheet = assertInspectorStyleSheetForId(errorString, styleSheetId);
if (!inspectorStyleSheet)
return;
......@@ -1056,8 +1061,8 @@ InspectorStyleSheetForInlineStyle* InspectorCSSAgent::asInspectorStyleSheet(Elem
return 0;
String newStyleSheetId = String::number(m_lastStyleSheetId++);
RefPtr<InspectorStyleSheetForInlineStyle> inspectorStyleSheet = InspectorStyleSheetForInlineStyle::create(m_pageAgent, m_resourceAgent, newStyleSheetId, element, this);
m_idToInspectorStyleSheet.set(newStyleSheetId, inspectorStyleSheet);
RefPtr<InspectorStyleSheetForInlineStyle> inspectorStyleSheet = InspectorStyleSheetForInlineStyle::create(newStyleSheetId, element, this);
m_idToInspectorStyleSheetForInlineStyle.set(newStyleSheetId, inspectorStyleSheet);
m_nodeToInspectorStyleSheet.set(element, inspectorStyleSheet);
return inspectorStyleSheet.get();
}
......@@ -1174,7 +1179,7 @@ InspectorStyleSheet* InspectorCSSAgent::viaInspectorStyleSheet(Document* documen
return m_documentToViaInspectorStyleSheet.get(document);
}
InspectorStyleSheet* InspectorCSSAgent::assertStyleSheetForId(ErrorString* errorString, const String& styleSheetId)
InspectorStyleSheet* InspectorCSSAgent::assertInspectorStyleSheetForId(ErrorString* errorString, const String& styleSheetId)
{
IdToInspectorStyleSheet::iterator it = m_idToInspectorStyleSheet.find(styleSheetId);
if (it == m_idToInspectorStyleSheet.end()) {
......@@ -1184,6 +1189,20 @@ InspectorStyleSheet* InspectorCSSAgent::assertStyleSheetForId(ErrorString* error
return it->value.get();
}
InspectorStyleSheetBase* InspectorCSSAgent::assertStyleSheetForId(ErrorString* errorString, const String& styleSheetId)
{
String placeholder;
InspectorStyleSheetBase* result = assertInspectorStyleSheetForId(&placeholder, styleSheetId);
if (result)
return result;
IdToInspectorStyleSheetForInlineStyle::iterator it = m_idToInspectorStyleSheetForInlineStyle.find(styleSheetId);
if (it == m_idToInspectorStyleSheetForInlineStyle.end()) {
*errorString = "No style sheet with given id found";
return 0;
}
return it->value.get();
}
TypeBuilder::CSS::StyleSheetOrigin::Enum InspectorCSSAgent::detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument)
{
if (m_creatingViaInspectorStyleSheet)
......@@ -1298,7 +1317,7 @@ void InspectorCSSAgent::didRemoveDOMNode(Node* node)
if (it == m_nodeToInspectorStyleSheet.end())
return;
m_idToInspectorStyleSheet.remove(it->value->id());
m_idToInspectorStyleSheetForInlineStyle.remove(it->value->id());
m_nodeToInspectorStyleSheet.remove(node);
}
......@@ -1314,7 +1333,7 @@ void InspectorCSSAgent::didModifyDOMAttr(Element* element)
it->value->didModifyElementAttribute();
}
void InspectorCSSAgent::styleSheetChanged(InspectorStyleSheet* styleSheet)
void InspectorCSSAgent::styleSheetChanged(InspectorStyleSheetBase* styleSheet)
{
flushPendingFrontendMessages();
m_frontend->styleSheetChanged(styleSheet->id());
......
......@@ -63,7 +63,7 @@ class InspectorCSSAgent FINAL
: public InspectorBaseAgent<InspectorCSSAgent>
, public InspectorDOMAgent::DOMListener
, public InspectorBackendDispatcher::CSSCommandHandler
, public InspectorStyleSheet::Listener {
, public InspectorStyleSheetBase::Listener {
WTF_MAKE_NONCOPYABLE(InspectorCSSAgent);
public:
enum MediaListSource {
......@@ -148,6 +148,7 @@ private:
InspectorCSSAgent(InspectorDOMAgent*, InspectorPageAgent*, InspectorResourceAgent*);
typedef HashMap<String, RefPtr<InspectorStyleSheet> > IdToInspectorStyleSheet;
typedef HashMap<String, RefPtr<InspectorStyleSheetForInlineStyle> > IdToInspectorStyleSheetForInlineStyle;
typedef HashMap<Node*, RefPtr<InspectorStyleSheetForInlineStyle> > NodeToInspectorStyleSheet; // bogus "stylesheets" with elements' inline styles
typedef HashMap<int, unsigned> NodeIdToForcedPseudoState;
......@@ -167,7 +168,8 @@ private:
InspectorStyleSheet* bindStyleSheet(CSSStyleSheet*);
String unbindStyleSheet(InspectorStyleSheet*);
InspectorStyleSheet* viaInspectorStyleSheet(Document*, bool createIfAbsent);
InspectorStyleSheet* assertStyleSheetForId(ErrorString*, const String&);
InspectorStyleSheet* assertInspectorStyleSheetForId(ErrorString*, const String&);
InspectorStyleSheetBase* assertStyleSheetForId(ErrorString*, const String&);
TypeBuilder::CSS::StyleSheetOrigin::Enum detectOrigin(CSSStyleSheet* pageStyleSheet, Document* ownerDocument);
bool styleSheetEditInProgress() const { return m_styleSheetsPendingMutation || m_styleDeclarationPendingMutation || m_isSettingStyleSheetText; }
......@@ -181,7 +183,7 @@ private:
virtual void didModifyDOMAttr(Element*) OVERRIDE;
// InspectorStyleSheet::Listener implementation
virtual void styleSheetChanged(InspectorStyleSheet*) OVERRIDE;
virtual void styleSheetChanged(InspectorStyleSheetBase*) OVERRIDE;
virtual void willReparseStyleSheet() OVERRIDE;
virtual void didReparseStyleSheet() OVERRIDE;
......@@ -193,6 +195,7 @@ private:
InspectorResourceAgent* m_resourceAgent;
IdToInspectorStyleSheet m_idToInspectorStyleSheet;
IdToInspectorStyleSheetForInlineStyle m_idToInspectorStyleSheetForInlineStyle;
HashMap<CSSStyleSheet*, RefPtr<InspectorStyleSheet> > m_cssStyleSheetToInspectorStyleSheet;
typedef HashMap<Document*, OwnPtr<HashSet<CSSStyleSheet*> > > DocumentStyleSheets;
DocumentStyleSheets m_documentToCSSStyleSheets;
......
......@@ -504,12 +504,12 @@ static PassRefPtrWillBeRawPtr<CSSRuleList> asCSSRuleList(CSSRule* rule)
return nullptr;
}
PassRefPtr<InspectorStyle> InspectorStyle::create(const InspectorCSSId& styleId, PassRefPtr<CSSStyleDeclaration> style, InspectorStyleSheet* parentStyleSheet)
PassRefPtr<InspectorStyle> InspectorStyle::create(const InspectorCSSId& styleId, PassRefPtr<CSSStyleDeclaration> style, InspectorStyleSheetBase* parentStyleSheet)
{
return adoptRef(new InspectorStyle(styleId, style, parentStyleSheet));
}
InspectorStyle::InspectorStyle(const InspectorCSSId& styleId, PassRefPtr<CSSStyleDeclaration> style, InspectorStyleSheet* parentStyleSheet)
InspectorStyle::InspectorStyle(const InspectorCSSId& styleId, PassRefPtr<CSSStyleDeclaration> style, InspectorStyleSheetBase* parentStyleSheet)
: m_styleId(styleId)
, m_style(style)
, m_parentStyleSheet(parentStyleSheet)
......@@ -830,7 +830,62 @@ NewLineAndWhitespace& InspectorStyle::newLineAndWhitespaceDelimiters() const
Document* InspectorStyle::ownerDocument() const
{
return m_parentStyleSheet->pageStyleSheet() ? m_parentStyleSheet->pageStyleSheet()->ownerDocument() : 0;
return m_parentStyleSheet->ownerDocument();
}
InspectorStyleSheetBase::InspectorStyleSheetBase(const String& id, Listener* listener)
: m_id(id)
, m_listener(listener)
{
}
bool InspectorStyleSheetBase::setPropertyText(const InspectorCSSId& id, unsigned propertyIndex, const String& text, bool overwrite, String* oldText, ExceptionState& exceptionState)
{
RefPtr<InspectorStyle> inspectorStyle = inspectorStyleForId(id);
if (!inspectorStyle) {
exceptionState.throwDOMException(NotFoundError, "No property could be found for the given ID.");
return false;
}
bool success = inspectorStyle->setPropertyText(propertyIndex, text, overwrite, oldText, exceptionState);
if (success)
fireStyleSheetChanged();
return success;
}
void InspectorStyleSheetBase::fireStyleSheetChanged()
{
if (listener())
listener()->styleSheetChanged(this);
}
PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyleSheetBase::buildObjectForStyle(CSSStyleDeclaration* style)
{
RefPtr<CSSRuleSourceData> sourceData;
if (ensureParsedDataReady())
sourceData = ruleSourceDataFor(style);
InspectorCSSId id = styleId(style);
if (id.isEmpty()) {
// Any rule coming from User Agent and not from DefaultStyleSheet will not have id.
// See InspectorCSSAgent::buildObjectForRule for details.
RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(id, style, this);
return inspectorStyle->buildObjectForStyle();
}
RefPtr<InspectorStyle> inspectorStyle = inspectorStyleForId(id);
RefPtr<TypeBuilder::CSS::CSSStyle> result = inspectorStyle->buildObjectForStyle();
// Style text cannot be retrieved without stylesheet, so set cssText here.
if (sourceData) {
String sheetText;
bool success = getText(&sheetText);
if (success) {
const SourceRange& bodyRange = sourceData->ruleBodyRange;
result->setCssText(sheetText.substring(bodyRange.start, bodyRange.end - bodyRange.start));
}
}
return result.release();
}
PassRefPtr<InspectorStyleSheet> InspectorStyleSheet::create(InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum origin, const String& documentURL, Listener* listener)
......@@ -839,13 +894,12 @@ PassRefPtr<InspectorStyleSheet> InspectorStyleSheet::create(InspectorPageAgent*
}
InspectorStyleSheet::InspectorStyleSheet(InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum origin, const String& documentURL, Listener* listener)
: m_pageAgent(pageAgent)
: InspectorStyleSheetBase(id, listener)
, m_pageAgent(pageAgent)
, m_resourceAgent(resourceAgent)
, m_id(id)
, m_pageStyleSheet(pageStyleSheet)
, m_origin(origin)
, m_documentURL(documentURL)
, m_listener(listener)
{
m_parsedStyleSheet = adoptPtr(new ParsedStyleSheet(m_pageStyleSheet.get()));
}
......@@ -869,8 +923,8 @@ String InspectorStyleSheet::finalURL() const
void InspectorStyleSheet::reparseStyleSheet(const String& text)
{
if (m_listener)
m_listener->willReparseStyleSheet();
if (listener())
listener()->willReparseStyleSheet();
{
// Have a separate scope for clearRules() (bug 95324).
......@@ -883,19 +937,14 @@ void InspectorStyleSheet::reparseStyleSheet(const String& text)
m_pageStyleSheet->contents()->parseString(text);
}
if (m_listener)
m_listener->didReparseStyleSheet();
if (listener())
listener()->didReparseStyleSheet();
fireStyleSheetChanged();
m_pageStyleSheet->ownerDocument()->styleResolverChanged(RecalcStyleImmediately, FullStyleUpdate);
}
bool InspectorStyleSheet::setText(const String& text, ExceptionState& exceptionState)
{
if (!checkPageStyleSheet(exceptionState))
return false;
if (!m_parsedStyleSheet)
return false;
m_parsedStyleSheet->setText(text);
m_flatRules.clear();
......@@ -914,8 +963,6 @@ String InspectorStyleSheet::ruleSelector(const InspectorCSSId& id, ExceptionStat
bool InspectorStyleSheet::setRuleSelector(const InspectorCSSId& id, const String& selector, ExceptionState& exceptionState)
{
if (!checkPageStyleSheet(exceptionState))
return false;
CSSStyleRule* rule = ruleForId(id);
if (!rule) {
exceptionState.throwDOMException(NotFoundError, "No rule was found for the given ID.");
......@@ -950,8 +997,6 @@ static bool checkStyleRuleSelector(Document* document, const String& selector)
CSSStyleRule* InspectorStyleSheet::addRule(const String& selector, ExceptionState& exceptionState)
{
if (!checkPageStyleSheet(exceptionState))
return 0;
if (!checkStyleRuleSelector(m_pageStyleSheet->ownerDocument(), selector)) {
exceptionState.throwDOMException(SyntaxError, "The selector '" + selector + "' could not be added.");
return 0;
......@@ -998,8 +1043,6 @@ CSSStyleRule* InspectorStyleSheet::addRule(const String& selector, ExceptionStat
bool InspectorStyleSheet::deleteRule(const InspectorCSSId& id, ExceptionState& exceptionState)
{
if (!checkPageStyleSheet(exceptionState))
return false;
RefPtrWillBeRawPtr<CSSStyleRule> rule = ruleForId(id);
if (!rule) {
exceptionState.throwDOMException(NotFoundError, "No style rule could be found for the provided ID.");
......@@ -1146,49 +1189,6 @@ PassRefPtr<TypeBuilder::CSS::CSSRule> InspectorStyleSheet::buildObjectForRule(CS
return result.release();
}
PassRefPtr<TypeBuilder::CSS::CSSStyle> InspectorStyleSheet::buildObjectForStyle(CSSStyleDeclaration* style)
{
RefPtr<CSSRuleSourceData> sourceData;
if (ensureParsedDataReady())
sourceData = ruleSourceDataFor(style);
InspectorCSSId id = ruleIdByStyle(style);
if (id.isEmpty()) {
// Any rule coming from User Agent and not from DefaultStyleSheet will not have id.
// See InspectorCSSAgent::buildObjectForRule for details.
RefPtr<InspectorStyle> inspectorStyle = InspectorStyle::create(id, style, this);
return inspectorStyle->buildObjectForStyle();
}
RefPtr<InspectorStyle> inspectorStyle = inspectorStyleForId(id);
RefPtr<TypeBuilder::CSS::CSSStyle> result = inspectorStyle->buildObjectForStyle();
// Style text cannot be retrieved without stylesheet, so set cssText here.
if (sourceData) {
String sheetText;
bool success = getText(&sheetText);
if (success) {
const SourceRange& bodyRange = sourceData->ruleBodyRange;
result->setCssText(sheetText.substring(bodyRange.start, bodyRange.end - bodyRange.start));
}
}
return result.release();
}
bool InspectorStyleSheet::setPropertyText(const InspectorCSSId& id, unsigned propertyIndex, const String& text, bool overwrite, String* oldText, ExceptionState& exceptionState)
{
RefPtr<InspectorStyle> inspectorStyle = inspectorStyleForId(id);
if (!inspectorStyle) {
exceptionState.throwDOMException(NotFoundError, "No property could be found for the given ID.");
return false;
}
bool success = inspectorStyle->setPropertyText(propertyIndex, text, overwrite, oldText, exceptionState);
if (success)
fireStyleSheetChanged();
return success;
}
bool InspectorStyleSheet::getText(String* result) const
{
if (!ensureText())
......@@ -1206,12 +1206,6 @@ CSSStyleDeclaration* InspectorStyleSheet::styleForId(const InspectorCSSId& id) c
return rule->style();
}
void InspectorStyleSheet::fireStyleSheetChanged()
{
if (m_listener)
m_listener->styleSheetChanged(this);
}
PassRefPtr<TypeBuilder::CSS::SourceRange> InspectorStyleSheet::ruleHeaderSourceRange(const CSSRule* rule)
{
if (!ensureParsedDataReady())
......@@ -1366,8 +1360,6 @@ bool InspectorStyleSheet::ensureParsedDataReady()
bool InspectorStyleSheet::ensureText() const
{
if (!m_parsedStyleSheet)
return false;
if (m_parsedStyleSheet->hasText())
return true;
......@@ -1415,8 +1407,6 @@ void InspectorStyleSheet::ensureFlatRules() const
bool InspectorStyleSheet::setStyleText(CSSStyleDeclaration* style, const String& text)
{
if (!m_pageStyleSheet)
return false;
if (!ensureParsedDataReady())
return false;
......@@ -1476,7 +1466,7 @@ bool InspectorStyleSheet::resourceStyleSheetText(String* result) const
if (m_origin == TypeBuilder::CSS::StyleSheetOrigin::User || m_origin == TypeBuilder::CSS::StyleSheetOrigin::User_agent)
return false;
if (!m_pageStyleSheet || !ownerDocument() || !ownerDocument()->frame())
if (!ownerDocument() || !ownerDocument()->frame())
return false;
bool base64Encoded;
......@@ -1486,9 +1476,6 @@ bool InspectorStyleSheet::resourceStyleSheetText(String* result) const
bool InspectorStyleSheet::inlineStyleSheetText(String* result) const
{
if (!m_pageStyleSheet)
return false;
Node* ownerNode = m_pageStyleSheet->ownerNode();
if (!ownerNode || ownerNode->nodeType() != Node::ELEMENT_NODE)
return false;
......@@ -1500,13 +1487,13 @@ bool InspectorStyleSheet::inlineStyleSheetText(String* result) const
return true;
}
PassRefPtr<InspectorStyleSheetForInlineStyle> InspectorStyleSheetForInlineStyle::create(InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent, const String& id, PassRefPtr<Element> element, Listener* listener)
PassRefPtr<InspectorStyleSheetForInlineStyle> InspectorStyleSheetForInlineStyle::create(const String& id, PassRefPtr<Element> element, Listener* listener)
{
return adoptRef(new InspectorStyleSheetForInlineStyle(pageAgent, resourceAgent, id, element, listener));
return adoptRef(new InspectorStyleSheetForInlineStyle(id, element, listener));
}
InspectorStyleSheetForInlineStyle::InspectorStyleSheetForInlineStyle(InspectorPageAgent* pageAgent, InspectorResourceAgent* resourceAgent, const String& id, PassRefPtr<Element> element, Listener* listener)
: InspectorStyleSheet(pageAgent, resourceAgent, id, nullptr, TypeBuilder::CSS::StyleSheetOrigin::Regular, "", listener)
InspectorStyleSheetForInlineStyle::InspectorStyleSheetForInlineStyle(const String& id, PassRefPtr<Element> element, Listener* listener)
: InspectorStyleSheetBase(id, listener)
, m_element(element)
, m_ruleSourceData(nullptr)
, m_isStyleTextValid(false)
......
......@@ -50,7 +50,7 @@ class Element;
class ExceptionState;
class InspectorPageAgent;
class InspectorResourceAgent;
class InspectorStyleSheet;
class InspectorStyleSheetBase;
typedef WillBePersistentHeapVector<RefPtrWillBeMember<CSSRule> > CSSRuleVector;
typedef String ErrorString;
......@@ -132,7 +132,7 @@ struct InspectorStyleProperty {
class InspectorStyle FINAL : public RefCounted<InspectorStyle> {
public:
static PassRefPtr<InspectorStyle> create(const InspectorCSSId& styleId, PassRefPtr<CSSStyleDeclaration> style, InspectorStyleSheet* parentStyleSheet);
static PassRefPtr<InspectorStyle> create(const InspectorCSSId&, PassRefPtr<CSSStyleDeclaration>, InspectorStyleSheetBase* parentStyleSheet);
CSSStyleDeclaration* cssStyle() const { return m_style.get(); }
PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForStyle() const;
......@@ -141,7 +141,7 @@ public:
bool styleText(String* result) const;
private:
InspectorStyle(const InspectorCSSId& styleId, PassRefPtr<CSSStyleDeclaration> style, InspectorStyleSheet* parentStyleSheet);
InspectorStyle(const InspectorCSSId&, PassRefPtr<CSSStyleDeclaration>, InspectorStyleSheetBase* parentStyleSheet);
bool verifyPropertyText(const String& propertyText, bool canOmitSemicolon);
void populateAllProperties(Vector<InspectorStyleProperty>& result) const;
......@@ -154,70 +154,103 @@ private:
InspectorCSSId m_styleId;
RefPtr<CSSStyleDeclaration> m_style;
InspectorStyleSheet* m_parentStyleSheet;
InspectorStyleSheetBase* m_parentStyleSheet;
mutable std::pair<String, String> m_format;
mutable bool m_formatAcquired;
};
class InspectorStyleSheet : public RefCounted<InspectorStyleSheet> {
class InspectorStyleSheetBase : public RefCounted<InspectorStyleSheetBase> {
public:
class Listener {
public:
Listener() { }
virtual ~Listener() { }
virtual void styleSheetChanged(InspectorStyleSheet*) = 0;
virtual void styleSheetChanged(InspectorStyleSheetBase*) = 0;
virtual void willReparseStyleSheet() = 0;
virtual void didReparseStyleSheet() = 0;
};
virtual ~InspectorStyleSheetBase() { }
String id() const { return m_id; }
virtual Document* ownerDocument() const = 0;
virtual bool setText(const String&, ExceptionState&) = 0;
virtual bool getText(String* result) const = 0;
virtual void reparseStyleSheet(const String&) = 0;
bool setPropertyText(const InspectorCSSId&, unsigned propertyIndex, const String& text, bool overwrite, String* oldPropertyText, ExceptionState&);
virtual CSSStyleDeclaration* styleForId(const InspectorCSSId&) const = 0;
virtual InspectorCSSId styleId(CSSStyleDeclaration*) const = 0;
PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForStyle(CSSStyleDeclaration*);
protected:
InspectorStyleSheetBase(const String& id, Listener*);
Listener* listener() const { return m_listener; }
void fireStyleSheetChanged();
virtual PassRefPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) = 0;
// Also accessed by friend class InspectorStyle.
virtual PassRefPtr<CSSRuleSourceData> ruleSourceDataFor(CSSStyleDeclaration*) const = 0;
virtual bool setStyleText(CSSStyleDeclaration*, const String&) = 0;
virtual PassOwnPtr<Vector<unsigned> > lineEndings() const = 0;
virtual bool ensureParsedDataReady() = 0;
private:
friend class InspectorStyle;
String m_id;
Listener* m_listener;
};
class InspectorStyleSheet : public InspectorStyleSheetBase {
public:
static PassRefPtr<InspectorStyleSheet> create(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum, const String& documentURL, Listener*);
virtual ~InspectorStyleSheet();
String id() const { return m_id; }
String finalURL() const;
virtual Document* ownerDocument() const;
CSSStyleSheet* pageStyleSheet() const { return m_pageStyleSheet.get(); }
virtual void reparseStyleSheet(const String&);
virtual bool setText(const String&, ExceptionState&);
virtual bool getText(String* result) const;
virtual Document* ownerDocument() const OVERRIDE;
virtual void reparseStyleSheet(const String&) OVERRIDE;
virtual bool setText(const String&, ExceptionState&) OVERRIDE;
virtual bool getText(String* result) const OVERRIDE;
String ruleSelector(const InspectorCSSId&, ExceptionState&);
bool setRuleSelector(const InspectorCSSId&, const String& selector, ExceptionState&);
CSSStyleRule* addRule(const String& selector, ExceptionState&);
bool deleteRule(const InspectorCSSId&, ExceptionState&);
bool setPropertyText(const InspectorCSSId&, unsigned propertyIndex, const String& text, bool overwrite, String* oldPropertyText, ExceptionState&);
CSSStyleSheet* pageStyleSheet() const { return m_pageStyleSheet.get(); }
PassRefPtr<TypeBuilder::CSS::CSSStyleSheetHeader> buildObjectForStyleSheetInfo() const;
PassRefPtr<TypeBuilder::CSS::CSSRule> buildObjectForRule(CSSStyleRule*, PassRefPtr<TypeBuilder::Array<TypeBuilder::CSS::CSSMedia> >);
PassRefPtr<TypeBuilder::CSS::CSSStyle> buildObjectForStyle(CSSStyleDeclaration*);
PassRefPtr<TypeBuilder::CSS::SourceRange> ruleHeaderSourceRange(const CSSRule*);
InspectorCSSId ruleId(CSSStyleRule*) const;
InspectorCSSId styleId(CSSStyleDeclaration* style) const { return ruleIdByStyle(style); }
virtual CSSStyleRule* ruleForId(const InspectorCSSId&) const;
virtual CSSStyleDeclaration* styleForId(const InspectorCSSId&) const;
CSSStyleRule* ruleForId(const InspectorCSSId&) const;
protected:
InspectorStyleSheet(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtrWillBeRawPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum, const String& documentURL, Listener*);
virtual InspectorCSSId styleId(CSSStyleDeclaration* style) const OVERRIDE { return ruleIdByStyle(style); }
virtual CSSStyleDeclaration* styleForId(const InspectorCSSId&) const OVERRIDE;
void fireStyleSheetChanged();
virtual PassRefPtr<CSSRuleSourceData> ruleSourceDataFor(CSSStyleDeclaration*) const;
virtual unsigned ruleIndexByStyle(CSSStyleDeclaration*) const;
virtual unsigned ruleIndexByRule(const CSSRule*) const;
virtual bool ensureParsedDataReady();
virtual PassRefPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&);
virtual String sourceMapURL() const;
virtual String sourceURL() const;
protected:
virtual PassRefPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) OVERRIDE;
// Also accessed by friend class InspectorStyle.
virtual bool setStyleText(CSSStyleDeclaration*, const String&);
virtual PassOwnPtr<Vector<unsigned> > lineEndings() const;
virtual PassRefPtr<CSSRuleSourceData> ruleSourceDataFor(CSSStyleDeclaration*) const OVERRIDE;
virtual bool setStyleText(CSSStyleDeclaration*, const String&) OVERRIDE;
virtual PassOwnPtr<Vector<unsigned> > lineEndings() const OVERRIDE;
virtual bool ensureParsedDataReady() OVERRIDE;
private:
friend class InspectorStyle;
InspectorStyleSheet(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtr<CSSStyleSheet> pageStyleSheet, TypeBuilder::CSS::StyleSheetOrigin::Enum, const String& documentURL, Listener*);
InspectorCSSId ruleIdByStyle(CSSStyleDeclaration*) const;
unsigned ruleIndexByStyle(CSSStyleDeclaration*) const;
unsigned ruleIndexByRule(const CSSRule*) const;
String sourceMapURL() const;
String sourceURL() const;
bool checkPageStyleSheet(ExceptionState&) const;
bool ensureText() const;
void ensureFlatRules() const;
......@@ -233,43 +266,38 @@ private:
InspectorPageAgent* m_pageAgent;
InspectorResourceAgent* m_resourceAgent;
String m_id;
RefPtrWillBePersistent<CSSStyleSheet> m_pageStyleSheet;
TypeBuilder::CSS::StyleSheetOrigin::Enum m_origin;
String m_documentURL;
OwnPtr<ParsedStyleSheet> m_parsedStyleSheet;
mutable CSSRuleVector m_flatRules;
Listener* m_listener;
mutable String m_sourceURL;
};
class InspectorStyleSheetForInlineStyle FINAL : public InspectorStyleSheet {
class InspectorStyleSheetForInlineStyle FINAL : public InspectorStyleSheetBase {
public:
static PassRefPtr<InspectorStyleSheetForInlineStyle> create(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtr<Element>, Listener*);
static PassRefPtr<InspectorStyleSheetForInlineStyle> create(const String& id, PassRefPtr<Element>, Listener*);
void didModifyElementAttribute();
virtual Document* ownerDocument() const OVERRIDE;
virtual void reparseStyleSheet(const String&) OVERRIDE;
virtual bool setText(const String&, ExceptionState&) OVERRIDE;
virtual bool getText(String* result) const OVERRIDE;
virtual CSSStyleRule* ruleForId(const InspectorCSSId&) const OVERRIDE { return 0; }
virtual CSSStyleDeclaration* styleForId(const InspectorCSSId& id) const OVERRIDE { ASSERT_UNUSED(id, !id.ordinal()); return inlineStyle(); }
virtual InspectorCSSId styleId(CSSStyleDeclaration* style) const OVERRIDE { return InspectorCSSId(id(), 0); }
protected:
InspectorStyleSheetForInlineStyle(InspectorPageAgent*, InspectorResourceAgent*, const String& id, PassRefPtr<Element>, Listener*);
virtual PassRefPtr<CSSRuleSourceData> ruleSourceDataFor(CSSStyleDeclaration* style) const OVERRIDE { ASSERT_UNUSED(style, style == inlineStyle()); return m_ruleSourceData; }
virtual unsigned ruleIndexByStyle(CSSStyleDeclaration*) const OVERRIDE { return 0; }
virtual bool ensureParsedDataReady() OVERRIDE;
virtual PassRefPtr<InspectorStyle> inspectorStyleForId(const InspectorCSSId&) OVERRIDE;
virtual String sourceMapURL() const OVERRIDE { return String(); }
virtual String sourceURL() const OVERRIDE { return String(); }
// Also accessed by friend class InspectorStyle.
virtual bool ensureParsedDataReady() OVERRIDE;
virtual PassRefPtr<CSSRuleSourceData> ruleSourceDataFor(CSSStyleDeclaration* style) const OVERRIDE { ASSERT_UNUSED(style, style == inlineStyle()); return m_ruleSourceData; }
virtual bool setStyleText(CSSStyleDeclaration*, const String&) OVERRIDE;
virtual PassOwnPtr<Vector<unsigned> > lineEndings() const OVERRIDE;
private:
InspectorStyleSheetForInlineStyle(const String& id, PassRefPtr<Element>, Listener*);
CSSStyleDeclaration* inlineStyle() const;
const String& elementStyleText() const;
PassRefPtr<CSSRuleSourceData> getStyleAttributeData() const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment