Title: [102903] trunk/Source/WebCore
Revision
102903
Author
[email protected]
Date
2011-12-15 01:23:19 -0800 (Thu, 15 Dec 2011)

Log Message

Web Inspector: [Styles] Update selected DOM element styles whenever applicable media queries change
https://bugs.webkit.org/show_bug.cgi?id=74292

The change introduces and handles in the frontend a new event type for the CSS domain,
"mediaQueryResultChanged", which gets fired every time a viewport-dependent media feature
changes its value. This allows users to see live changes of the (media-dependent) matched
rules for inspected elements.

Reviewed by Pavel Feldman.

* inspector/CodeGeneratorInspector.py:
(DomainNameFixes):
* inspector/Inspector.json:
* inspector/InspectorCSSAgent.cpp:
(WebCore::InspectorCSSAgent::InspectorCSSAgent):
(WebCore::InspectorCSSAgent::setFrontend):
(WebCore::InspectorCSSAgent::clearFrontend):
(WebCore::InspectorCSSAgent::restore):
(WebCore::InspectorCSSAgent::enable):
(WebCore::InspectorCSSAgent::disable):
(WebCore::InspectorCSSAgent::mediaQueryResultChanged):
* inspector/InspectorCSSAgent.h:
* inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::mediaQueryResultChangedImpl):
* inspector/InspectorInstrumentation.h:
(WebCore::InspectorInstrumentation::mediaQueryResultChanged):
* inspector/front-end/CSSStyleModel.js:
(WebInspector.CSSStyleModel):
(WebInspector.CSSStyleModel.prototype.mediaQueryResultChanged):
(WebInspector.CSSDispatcher):
(WebInspector.CSSDispatcher.prototype.mediaQueryResultChanged):
* inspector/front-end/MetricsSidebarPane.js:
(WebInspector.MetricsSidebarPane):
(WebInspector.MetricsSidebarPane.prototype._styleSheetOrMediaQueryResultChanged):
* inspector/front-end/StylesSidebarPane.js:
(WebInspector.StylesSidebarPane):
(WebInspector.StylesSidebarPane.prototype._styleSheetOrMediaQueryResultChanged):
* page/FrameView.cpp:
(WebCore::FrameView::layout):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (102902 => 102903)


--- trunk/Source/WebCore/ChangeLog	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/ChangeLog	2011-12-15 09:23:19 UTC (rev 102903)
@@ -1,3 +1,45 @@
+2011-12-15  Alexander Pavlov  <[email protected]>
+
+        Web Inspector: [Styles] Update selected DOM element styles whenever applicable media queries change
+        https://bugs.webkit.org/show_bug.cgi?id=74292
+
+        The change introduces and handles in the frontend a new event type for the CSS domain,
+        "mediaQueryResultChanged", which gets fired every time a viewport-dependent media feature
+        changes its value. This allows users to see live changes of the (media-dependent) matched
+        rules for inspected elements.
+
+        Reviewed by Pavel Feldman.
+
+        * inspector/CodeGeneratorInspector.py:
+        (DomainNameFixes):
+        * inspector/Inspector.json:
+        * inspector/InspectorCSSAgent.cpp:
+        (WebCore::InspectorCSSAgent::InspectorCSSAgent):
+        (WebCore::InspectorCSSAgent::setFrontend):
+        (WebCore::InspectorCSSAgent::clearFrontend):
+        (WebCore::InspectorCSSAgent::restore):
+        (WebCore::InspectorCSSAgent::enable):
+        (WebCore::InspectorCSSAgent::disable):
+        (WebCore::InspectorCSSAgent::mediaQueryResultChanged):
+        * inspector/InspectorCSSAgent.h:
+        * inspector/InspectorInstrumentation.cpp:
+        (WebCore::InspectorInstrumentation::mediaQueryResultChangedImpl):
+        * inspector/InspectorInstrumentation.h:
+        (WebCore::InspectorInstrumentation::mediaQueryResultChanged):
+        * inspector/front-end/CSSStyleModel.js:
+        (WebInspector.CSSStyleModel):
+        (WebInspector.CSSStyleModel.prototype.mediaQueryResultChanged):
+        (WebInspector.CSSDispatcher):
+        (WebInspector.CSSDispatcher.prototype.mediaQueryResultChanged):
+        * inspector/front-end/MetricsSidebarPane.js:
+        (WebInspector.MetricsSidebarPane):
+        (WebInspector.MetricsSidebarPane.prototype._styleSheetOrMediaQueryResultChanged):
+        * inspector/front-end/StylesSidebarPane.js:
+        (WebInspector.StylesSidebarPane):
+        (WebInspector.StylesSidebarPane.prototype._styleSheetOrMediaQueryResultChanged):
+        * page/FrameView.cpp:
+        (WebCore::FrameView::layout):
+
 2011-12-14  Vsevolod Vlasov  <[email protected]>
 
         Web Inspector: [Regression] Network manager fails to show resource type and MIME type in incorrect MIME type console message.

Modified: trunk/Source/WebCore/inspector/CodeGeneratorInspector.py (102902 => 102903)


--- trunk/Source/WebCore/inspector/CodeGeneratorInspector.py	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/CodeGeneratorInspector.py	2011-12-15 09:23:19 UTC (rev 102903)
@@ -204,7 +204,7 @@
 
         return Res
 
-    skip_js_bind_domains = set(["Runtime", "CSS", "DOMDebugger"])
+    skip_js_bind_domains = set(["Runtime", "DOMDebugger"])
     agent_type_map = {"Network": "InspectorResourceAgent", "Inspector": "InspectorAgent", }
 
 

Modified: trunk/Source/WebCore/inspector/Inspector.json (102902 => 102903)


--- trunk/Source/WebCore/inspector/Inspector.json	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/Inspector.json	2011-12-15 09:23:19 UTC (rev 102903)
@@ -1617,6 +1617,14 @@
         ],
         "commands": [
             {
+                "name": "enable",
+                "description": "Enables the CSS agent for the given page. Clients should not assume that the CSS agent has been enabled until the result of this command is received."
+            },
+            {
+                "name": "disable",
+                "description": "Disables the CSS agent for the given page."
+            },
+            {
                 "name": "getMatchedStylesForNode",
                 "parameters": [
                     { "name": "nodeId", "$ref": "DOM.NodeId" },
@@ -1742,6 +1750,12 @@
                 ],
                 "description": "Returns all supported CSS property names."
             }
+        ],
+        "events": [
+            {
+                "name": "mediaQueryResultChanged",
+                "description": "Fires whenever a MediaQuery result changes (for example, after a browser window has been resized.) The current implementation considers only viewport-dependent media features."
+            }
         ]
     },
     {

Modified: trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp (102902 => 102903)


--- trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp	2011-12-15 09:23:19 UTC (rev 102903)
@@ -40,6 +40,7 @@
 #include "DOMWindow.h"
 #include "HTMLHeadElement.h"
 #include "InspectorDOMAgent.h"
+#include "InspectorState.h"
 #include "InspectorValues.h"
 #include "InstrumentingAgents.h"
 #include "Node.h"
@@ -128,6 +129,10 @@
 //    text         : <string> // Optional - whenever the text is available for a text-based stylesheet
 // }
 
+namespace CSSAgentState {
+static const char cssAgentEnabled[] = "cssAgentEnabled";
+}
+
 namespace WebCore {
 
 enum ForcePseudoClassFlags {
@@ -186,6 +191,7 @@
 
 InspectorCSSAgent::InspectorCSSAgent(InstrumentingAgents* instrumentingAgents, InspectorState* state, InspectorDOMAgent* domAgent)
     : InspectorBaseAgent<InspectorCSSAgent>("CSS", instrumentingAgents, state)
+    , m_frontend(0)
     , m_domAgent(domAgent)
     , m_lastPseudoState(0)
     , m_lastStyleSheetId(1)
@@ -193,7 +199,6 @@
     , m_lastStyleId(1)
 {
     m_domAgent->setDOMListener(this);
-    m_instrumentingAgents->setInspectorCSSAgent(this);
 }
 
 InspectorCSSAgent::~InspectorCSSAgent()
@@ -203,9 +208,18 @@
     reset();
 }
 
+void InspectorCSSAgent::setFrontend(InspectorFrontend* frontend)
+{
+    ASSERT(!m_frontend);
+    m_frontend = frontend->css();
+}
+
 void InspectorCSSAgent::clearFrontend()
 {
+    ASSERT(m_frontend);
+    m_frontend = 0;
     clearPseudoState(true);
+    m_instrumentingAgents->setInspectorCSSAgent(0);
 }
 
 void InspectorCSSAgent::discardAgent()
@@ -214,6 +228,14 @@
     m_domAgent = 0;
 }
 
+void InspectorCSSAgent::restore()
+{
+    if (m_state->getBoolean(CSSAgentState::cssAgentEnabled)) {
+        ErrorString error;
+        enable(&error);
+    }
+}
+
 void InspectorCSSAgent::reset()
 {
     m_idToInspectorStyleSheet.clear();
@@ -222,6 +244,23 @@
     m_documentToInspectorStyleSheet.clear();
 }
 
+void InspectorCSSAgent::enable(ErrorString*)
+{
+    m_state->setBoolean(CSSAgentState::cssAgentEnabled, true);
+    m_instrumentingAgents->setInspectorCSSAgent(this);
+}
+
+void InspectorCSSAgent::disable(ErrorString*)
+{
+    m_state->setBoolean(CSSAgentState::cssAgentEnabled, false);
+}
+
+void InspectorCSSAgent::mediaQueryResultChanged()
+{
+    if (m_frontend)
+        m_frontend->mediaQueryResultChanged();
+}
+
 bool InspectorCSSAgent::forcePseudoState(Element* element, CSSSelector::PseudoType pseudoType)
 {
     if (m_lastElementWithPseudoState != element)

Modified: trunk/Source/WebCore/inspector/InspectorCSSAgent.h (102902 => 102903)


--- trunk/Source/WebCore/inspector/InspectorCSSAgent.h	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/InspectorCSSAgent.h	2011-12-15 09:23:19 UTC (rev 102903)
@@ -26,6 +26,7 @@
 #define InspectorCSSAgent_h
 
 #include "CSSSelector.h"
+#include "Document.h"
 #include "InspectorBaseAgent.h"
 #include "InspectorDOMAgent.h"
 #include "InspectorStyleSheet.h"
@@ -65,9 +66,14 @@
     ~InspectorCSSAgent();
 
     bool forcePseudoState(Element*, CSSSelector::PseudoType);
+    virtual void setFrontend(InspectorFrontend*);
     virtual void clearFrontend();
     virtual void discardAgent();
+    virtual void restore();
+    void enable(ErrorString*);
+    void disable(ErrorString*);
     void reset();
+    void mediaQueryResultChanged();
 
     void getComputedStyleForNode(ErrorString*, int nodeId, const RefPtr<InspectorArray>* forcedPseudoClasses, RefPtr<InspectorArray>* style);
     void getInlineStylesForNode(ErrorString*, int nodeId, RefPtr<InspectorObject>* inlineStyle, RefPtr<InspectorArray>* attributes);
@@ -110,6 +116,7 @@
 
     void clearPseudoState(bool recalcStyles);
 
+    InspectorFrontend::CSS* m_frontend;
     InspectorDOMAgent* m_domAgent;
     RefPtr<Element> m_lastElementWithPseudoState;
     unsigned m_lastPseudoState;

Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp (102902 => 102903)


--- trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp	2011-12-15 09:23:19 UTC (rev 102903)
@@ -182,6 +182,12 @@
         consoleAgent->frameWindowDiscarded(window);
 }
 
+void InspectorInstrumentation::mediaQueryResultChangedImpl(InstrumentingAgents* instrumentingAgents)
+{
+    if (InspectorCSSAgent* cssAgent = instrumentingAgents->inspectorCSSAgent())
+        cssAgent->mediaQueryResultChanged();
+}
+
 void InspectorInstrumentation::mouseDidMoveOverElementImpl(InstrumentingAgents* instrumentingAgents, const HitTestResult& result, unsigned modifierFlags)
 {
     if (InspectorDOMAgent* domAgent = instrumentingAgents->inspectorDOMAgent())

Modified: trunk/Source/WebCore/inspector/InspectorInstrumentation.h (102902 => 102903)


--- trunk/Source/WebCore/inspector/InspectorInstrumentation.h	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/InspectorInstrumentation.h	2011-12-15 09:23:19 UTC (rev 102903)
@@ -87,6 +87,7 @@
     static void characterDataModified(Document*, CharacterData*);
     static void didInvalidateStyleAttr(Document*, Node*);
     static void frameWindowDiscarded(Frame*, DOMWindow*);
+    static void mediaQueryResultChanged(Document*);
 
     static void mouseDidMoveOverElement(Page*, const HitTestResult&, unsigned modifierFlags);
     static bool handleMousePress(Page*);
@@ -227,6 +228,7 @@
     static void characterDataModifiedImpl(InstrumentingAgents*, CharacterData*);
     static void didInvalidateStyleAttrImpl(InstrumentingAgents*, Node*);
     static void frameWindowDiscardedImpl(InstrumentingAgents*, DOMWindow*);
+    static void mediaQueryResultChangedImpl(InstrumentingAgents*);
 
     static void mouseDidMoveOverElementImpl(InstrumentingAgents*, const HitTestResult&, unsigned modifierFlags);
     static bool handleMousePressImpl(InstrumentingAgents*);
@@ -435,6 +437,15 @@
 #endif
 }
 
+inline void InspectorInstrumentation::mediaQueryResultChanged(Document* document)
+{
+#if ENABLE(INSPECTOR)
+    FAST_RETURN_IF_NO_FRONTENDS(void());
+    if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForDocument(document))
+        mediaQueryResultChangedImpl(instrumentingAgents);
+#endif
+}
+
 inline void InspectorInstrumentation::mouseDidMoveOverElement(Page* page, const HitTestResult& result, unsigned modifierFlags)
 {
 #if ENABLE(INSPECTOR)

Modified: trunk/Source/WebCore/inspector/front-end/CSSStyleModel.js (102902 => 102903)


--- trunk/Source/WebCore/inspector/front-end/CSSStyleModel.js	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/front-end/CSSStyleModel.js	2011-12-15 09:23:19 UTC (rev 102903)
@@ -35,6 +35,8 @@
 WebInspector.CSSStyleModel = function()
 {
     new WebInspector.CSSStyleModelResourceBinding(this);
+    InspectorBackend.registerCSSDispatcher(new WebInspector.CSSDispatcher(this));
+    CSSAgent.enable();
 }
 
 WebInspector.CSSStyleModel.parseRuleArrayPayload = function(ruleArray)
@@ -46,7 +48,8 @@
 }
 
 WebInspector.CSSStyleModel.Events = {
-    StyleSheetChanged: "StyleSheetChanged"
+    StyleSheetChanged: "StyleSheetChanged",
+    MediaQueryResultChanged: "MediaQueryResultChanged"
 }
 
 WebInspector.CSSStyleModel.prototype = {
@@ -248,6 +251,11 @@
         CSSAgent.addRule(nodeId, selector, callback.bind(this, successCallback, failureCallback, selector));
     },
 
+    mediaQueryResultChanged: function()
+    {
+        this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged);
+    },
+
     _documentElementId: function(nodeId)
     {
         var node = WebInspector.domAgent.nodeForId(nodeId);
@@ -850,6 +858,21 @@
 WebInspector.CSSStyleModelResourceBinding.prototype.__proto__ = WebInspector.ResourceDomainModelBinding.prototype;
 
 /**
+ * @constructor
+ */
+WebInspector.CSSDispatcher = function(cssModel)
+{
+    this._cssModel = cssModel;
+}
+
+WebInspector.CSSDispatcher.prototype = {
+    mediaQueryResultChanged: function()
+    {
+        this._cssModel.mediaQueryResultChanged();
+    }
+}
+
+/**
  * @type {WebInspector.CSSStyleModel}
  */
 WebInspector.cssModel = null;

Modified: trunk/Source/WebCore/inspector/front-end/MetricsSidebarPane.js (102902 => 102903)


--- trunk/Source/WebCore/inspector/front-end/MetricsSidebarPane.js	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/front-end/MetricsSidebarPane.js	2011-12-15 09:23:19 UTC (rev 102903)
@@ -34,7 +34,8 @@
 {
     WebInspector.SidebarPane.call(this, WebInspector.UIString("Metrics"));
 
-    WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this);
+    WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetOrMediaQueryResultChanged, this);
+    WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged, this._styleSheetOrMediaQueryResultChanged, this);
     WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrModified, this._attributesUpdated, this);
     WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrRemoved, this._attributesUpdated, this);
 }
@@ -82,7 +83,7 @@
         WebInspector.cssModel.getInlineStylesAsync(node.id, inlineStyleCallback.bind(this));
     },
 
-    _styleSheetChanged: function()
+    _styleSheetOrMediaQueryResultChanged: function()
     {
         this._innerUpdate();
     },

Modified: trunk/Source/WebCore/inspector/front-end/StylesSidebarPane.js (102902 => 102903)


--- trunk/Source/WebCore/inspector/front-end/StylesSidebarPane.js	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/inspector/front-end/StylesSidebarPane.js	2011-12-15 09:23:19 UTC (rev 102903)
@@ -89,7 +89,8 @@
     this._sectionsContainer = document.createElement("div");
     this.bodyElement.appendChild(this._sectionsContainer);
 
-    WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this);
+    WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetOrMediaQueryResultChanged, this);
+    WebInspector.cssModel.addEventListener(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged, this._styleSheetOrMediaQueryResultChanged, this);
     WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrModified, this._attributesModified, this);
     WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.AttrRemoved, this._attributesRemoved, this);
     WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.StyleInvalidated, this._styleInvalidated, this);
@@ -286,7 +287,7 @@
             this._executeRebuildUpdate(node, userCallback);
     },
 
-    _styleSheetChanged: function()
+    _styleSheetOrMediaQueryResultChanged: function()
     {
         if (this._userOperation || this._isEditingStyle)
             return;

Modified: trunk/Source/WebCore/page/FrameView.cpp (102902 => 102903)


--- trunk/Source/WebCore/page/FrameView.cpp	2011-12-15 09:21:41 UTC (rev 102902)
+++ trunk/Source/WebCore/page/FrameView.cpp	2011-12-15 09:23:19 UTC (rev 102903)
@@ -1000,8 +1000,10 @@
 
         // Viewport-dependent media queries may cause us to need completely different style information.
         // Check that here.
-        if (document->styleSelector()->affectedByViewportChange())
+        if (document->styleSelector()->affectedByViewportChange()) {
             document->styleSelectorChanged(RecalcStyleImmediately);
+            InspectorInstrumentation::mediaQueryResultChanged(document);
+        }
 
         // Always ensure our style info is up-to-date. This can happen in situations where
         // the layout beats any sort of style recalc update that needs to occur.
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to