<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[208199] trunk</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/208199">208199</a></dd>
<dt>Author</dt> <dd>joepeck@webkit.org</dd>
<dt>Date</dt> <dd>2016-10-31 17:23:29 -0700 (Mon, 31 Oct 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Web Inspector: Shadow DOM scoped styles are missing
https://bugs.webkit.org/show_bug.cgi?id=164247
<rdar://problem/29035061>
Reviewed by Antti Koivisto.
Source/WebCore:
Test: inspector/css/shadow-scoped-style.html
* css/ElementRuleCollector.cpp:
(WebCore::ElementRuleCollector::matchAuthorRules):
Only match :host pseudo class for NOPSEUDO. It doesn't make sense
with a pseudo element request (:host::before does not make sense).
* css/InspectorCSSOMWrappers.h:
* css/InspectorCSSOMWrappers.cpp:
(WebCore::InspectorCSSOMWrappers::collectFromStyleSheetContents):
(WebCore::InspectorCSSOMWrappers::collectDocumentWrappers):
(WebCore::InspectorCSSOMWrappers::getWrapperForRuleInSheets):
Simplify existing "once per document" wrapper collection.
(WebCore::InspectorCSSOMWrappers::maybeCollectFromStyleSheets):
(WebCore::InspectorCSSOMWrappers::collectScopeWrappers):
Include a path to add style sheets that weren't already collected.
This will be useful when trying the StyleScope stylesheets which
are different for different nodes.
* inspector/InspectorCSSAgent.cpp:
(WebCore::containingStyleScopeForElement):
(WebCore::InspectorCSSAgent::buildObjectForRule):
Collect rules for document and StyleScope sheets separately.
For elements with a shadow root, add the root's sheets as
well in case there are :host rules that affect the element.
Source/WebInspectorUI:
* UserInterface/Models/DOMNodeStyles.js:
(WebInspector.DOMNodeStyles.prototype.refresh.fetchedInlineStyles):
Fix incorrect WrapperPromise usage.
LayoutTests:
* inspector/css/shadow-scoped-style-expected.txt: Added.
* inspector/css/shadow-scoped-style.html: Added.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssElementRuleCollectorcpp">trunk/Source/WebCore/css/ElementRuleCollector.cpp</a></li>
<li><a href="#trunkSourceWebCorecssInspectorCSSOMWrapperscpp">trunk/Source/WebCore/css/InspectorCSSOMWrappers.cpp</a></li>
<li><a href="#trunkSourceWebCorecssInspectorCSSOMWrappersh">trunk/Source/WebCore/css/InspectorCSSOMWrappers.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorCSSAgentcpp">trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsDOMNodeStylesjs">trunk/Source/WebInspectorUI/UserInterface/Models/DOMNodeStyles.js</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsinspectorcssshadowscopedstyleexpectedtxt">trunk/LayoutTests/inspector/css/shadow-scoped-style-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectorcssshadowscopedstylehtml">trunk/LayoutTests/inspector/css/shadow-scoped-style.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/LayoutTests/ChangeLog        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-10-31 Joseph Pecoraro <pecoraro@apple.com>
+
+ Web Inspector: Shadow DOM scoped styles are missing
+ https://bugs.webkit.org/show_bug.cgi?id=164247
+ <rdar://problem/29035061>
+
+ Reviewed by Antti Koivisto.
+
+ * inspector/css/shadow-scoped-style-expected.txt: Added.
+ * inspector/css/shadow-scoped-style.html: Added.
+
</ins><span class="cx"> 2016-10-31 Nan Wang <n_wang@apple.com>
</span><span class="cx">
</span><span class="cx"> AX: aria-sort is not exposed on iOS
</span></span></pre></div>
<a id="trunkLayoutTestsinspectorcssshadowscopedstyleexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/css/shadow-scoped-style-expected.txt (0 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/css/shadow-scoped-style-expected.txt         (rev 0)
+++ trunk/LayoutTests/inspector/css/shadow-scoped-style-expected.txt        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+Test matched styles for nodes include shadow dom scoped styles.
+
+Before
+After
+
+== Running test suite: CSS.ShadowScopedStyle
+-- Running test case: CSS.ShadowScopedStyle.HostStyles
+PASS: Node should have shadow roots.
+PASS: Node should not be in a shadow tree.
+PASS: Node should have an open shadow root.
+PASS: Node should have no pseudo element styles.
+STYLES:
+#shadow-host {
+ padding: 5px;
+}
+#shadow-host {
+ padding: 10px;
+}
+:host {
+ padding: 20px;
+}
+address, article, aside, div, footer, header, hgroup, layer, main, nav, section {
+}
+
+-- Running test case: CSS.ShadowScopedStyle.ElementInShadowTree
+PASS: Node should not have shadow roots.
+PASS: Node should be in a shadow tree.
+STYLES:
+#shadow-node {
+ color: green;
+}
+div {
+ color: blue;
+}
+address, article, aside, div, footer, header, hgroup, layer, main, nav, section {
+}
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorcssshadowscopedstylehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/css/shadow-scoped-style.html (0 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/css/shadow-scoped-style.html         (rev 0)
+++ trunk/LayoutTests/inspector/css/shadow-scoped-style.html        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -0,0 +1,104 @@
</span><ins>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
+<script>
+function test()
+{
+ function isEmptyObject(object) {
+ for (let property in object)
+ return false;
+ return true;
+ }
+
+ function dumpStyleDeclarations(styles) {
+ InspectorTest.log("STYLES:");
+ for (let style of styles)
+ InspectorTest.log(style.generateCSSRuleString());
+ }
+
+ let documentNode;
+ let hostNode;
+
+ let suite = InspectorTest.createAsyncSuite("CSS.ShadowScopedStyle");
+
+ suite.addTestCase({
+ name: "CSS.ShadowScopedStyle.HostStyles",
+ description: "Ensure shadow root host element gets :host styles.",
+ test(resolve, reject) {
+ WebInspector.domTreeManager.querySelector(documentNode.id, "#shadow-host", (nodeId) => {
+ if (!nodeId) {
+ InspectorTest.fail("DOM node #shadow-host not found in document.");
+ reject();
+ return;
+ }
+
+ hostNode = WebInspector.domTreeManager.nodeForId(nodeId);
+ let nodeStyles = WebInspector.cssStyleManager.stylesForNode(hostNode);
+ nodeStyles.refresh().then(() => {
+ InspectorTest.expectThat(hostNode.hasShadowRoots(), "Node should have shadow roots.");
+ InspectorTest.expectFalse(hostNode.isInShadowTree(), "Node should not be in a shadow tree.");
+ InspectorTest.expectThat(hostNode.shadowRoots()[0].shadowRootType() === WebInspector.DOMNode.ShadowRootType.Open, "Node should have an open shadow root.");
+ InspectorTest.expectThat(isEmptyObject(nodeStyles.pseudoElements), "Node should have no pseudo element styles.");
+ dumpStyleDeclarations(nodeStyles.orderedStyles);
+ resolve();
+ }).catch(reject);
+ });
+ }
+ });
+
+ suite.addTestCase({
+ name: "CSS.ShadowScopedStyle.ElementInShadowTree",
+ description: "Ensure element in shadow tree gets shadow dom scoped styles.",
+ test(resolve, reject) {
+ WebInspector.domTreeManager.querySelector(hostNode.shadowRoots()[0].id, "#shadow-node", (nodeId) => {
+ if (!nodeId) {
+ InspectorTest.fail("DOM node #shadow-node not found in #shadow-host's shadowRoot.");
+ reject();
+ return;
+ }
+
+ let node = WebInspector.domTreeManager.nodeForId(nodeId);
+ let nodeStyles = WebInspector.cssStyleManager.stylesForNode(node);
+ nodeStyles.refresh().then(() => {
+ InspectorTest.expectFalse(node.hasShadowRoots(), "Node should not have shadow roots.");
+ InspectorTest.expectThat(node.isInShadowTree(), "Node should be in a shadow tree.");
+ dumpStyleDeclarations(nodeStyles.orderedStyles);
+ resolve();
+ }).catch(reject);
+ });
+ }
+ });
+
+ // Add Test: CSS.ShadowScopedStyle.SlottedElement
+ // FIXME: <https://webkit.org/b/164249> Web Inspector: Ensure inspector shows :slotted() styles in sidebar
+
+ WebInspector.domTreeManager.requestDocument((node) => {
+ documentNode = node;
+ suite.runTestCasesAndFinish();
+ });
+}
+</script>
+</head>
+<body onload="runTest()">
+<p>Test matched styles for nodes include shadow dom scoped styles.</p>
+<div>
+ Before
+ <div id="shadow-host" style="padding: 5px"></div>
+ After
+</div>
+<style>#shadow-host { padding: 10px; }</style>
+<script>
+(function() {
+ let shadowRoot = document.getElementById("shadow-host").attachShadow({mode: "open"});
+ shadowRoot.innerHTML = `
+ <style>
+ :host { padding: 20px; }
+ div { color: blue; }
+ </style>
+ <div id="shadow-node" style="color: green">Shadow Content</div>
+ `;
+})();
+</script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/Source/WebCore/ChangeLog        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -1,3 +1,38 @@
</span><ins>+2016-10-31 Joseph Pecoraro <pecoraro@apple.com>
+
+ Web Inspector: Shadow DOM scoped styles are missing
+ https://bugs.webkit.org/show_bug.cgi?id=164247
+ <rdar://problem/29035061>
+
+ Reviewed by Antti Koivisto.
+
+ Test: inspector/css/shadow-scoped-style.html
+
+ * css/ElementRuleCollector.cpp:
+ (WebCore::ElementRuleCollector::matchAuthorRules):
+ Only match :host pseudo class for NOPSEUDO. It doesn't make sense
+ with a pseudo element request (:host::before does not make sense).
+
+ * css/InspectorCSSOMWrappers.h:
+ * css/InspectorCSSOMWrappers.cpp:
+ (WebCore::InspectorCSSOMWrappers::collectFromStyleSheetContents):
+ (WebCore::InspectorCSSOMWrappers::collectDocumentWrappers):
+ (WebCore::InspectorCSSOMWrappers::getWrapperForRuleInSheets):
+ Simplify existing "once per document" wrapper collection.
+
+ (WebCore::InspectorCSSOMWrappers::maybeCollectFromStyleSheets):
+ (WebCore::InspectorCSSOMWrappers::collectScopeWrappers):
+ Include a path to add style sheets that weren't already collected.
+ This will be useful when trying the StyleScope stylesheets which
+ are different for different nodes.
+
+ * inspector/InspectorCSSAgent.cpp:
+ (WebCore::containingStyleScopeForElement):
+ (WebCore::InspectorCSSAgent::buildObjectForRule):
+ Collect rules for document and StyleScope sheets separately.
+ For elements with a shadow root, add the root's sheets as
+ well in case there are :host rules that affect the element.
+
</ins><span class="cx"> 2016-10-31 Ryan Haddad <ryanhaddad@apple.com>
</span><span class="cx">
</span><span class="cx"> Unreviewed, rolling out r208180.
</span></span></pre></div>
<a id="trunkSourceWebCorecssElementRuleCollectorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/ElementRuleCollector.cpp (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/ElementRuleCollector.cpp        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/Source/WebCore/css/ElementRuleCollector.cpp        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -213,7 +213,7 @@
</span><span class="cx"> if (parent && parent->shadowRoot())
</span><span class="cx"> matchSlottedPseudoElementRules(matchRequest, ruleRange);
</span><span class="cx">
</span><del>- if (m_element.shadowRoot())
</del><ins>+ if (m_element.shadowRoot() && m_pseudoStyleRequest.pseudoId == NOPSEUDO)
</ins><span class="cx"> matchHostPseudoClassRules(matchRequest, ruleRange);
</span><span class="cx">
</span><span class="cx"> if (m_element.isInShadowTree())
</span></span></pre></div>
<a id="trunkSourceWebCorecssInspectorCSSOMWrapperscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/InspectorCSSOMWrappers.cpp (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/InspectorCSSOMWrappers.cpp        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/Source/WebCore/css/InspectorCSSOMWrappers.cpp        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -81,38 +81,56 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void InspectorCSSOMWrappers::collectFromStyleSheetContents(HashSet<RefPtr<CSSStyleSheet>>& sheetWrapperSet, StyleSheetContents* styleSheet)
</del><ins>+void InspectorCSSOMWrappers::collectFromStyleSheetContents(StyleSheetContents* styleSheet)
</ins><span class="cx"> {
</span><span class="cx"> if (!styleSheet)
</span><span class="cx"> return;
</span><span class="cx"> RefPtr<CSSStyleSheet> styleSheetWrapper = CSSStyleSheet::create(*styleSheet);
</span><del>- sheetWrapperSet.add(styleSheetWrapper);
</del><ins>+ m_styleSheetCSSOMWrapperSet.add(styleSheetWrapper);
</ins><span class="cx"> collect(styleSheetWrapper.get());
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void InspectorCSSOMWrappers::collectFromStyleSheets(const Vector<RefPtr<CSSStyleSheet>>& sheets)
</span><span class="cx"> {
</span><del>- for (unsigned i = 0; i < sheets.size(); ++i)
- collect(sheets[i].get());
</del><ins>+ for (auto& sheet : sheets)
+ collect(sheet.get());
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-CSSStyleRule* InspectorCSSOMWrappers::getWrapperForRuleInSheets(StyleRule* rule, Style::Scope& styleScope, ExtensionStyleSheets& extensionStyleSheets)
</del><ins>+void InspectorCSSOMWrappers::maybeCollectFromStyleSheets(const Vector<RefPtr<CSSStyleSheet>>& sheets)
</ins><span class="cx"> {
</span><ins>+ for (auto& sheet : sheets) {
+ if (!m_styleSheetCSSOMWrapperSet.contains(sheet.get())) {
+ m_styleSheetCSSOMWrapperSet.add(sheet);
+ collect(sheet.get());
+ }
+ }
+}
+
+void InspectorCSSOMWrappers::collectDocumentWrappers(ExtensionStyleSheets& extensionStyleSheets)
+{
</ins><span class="cx"> if (m_styleRuleToCSSOMWrapperMap.isEmpty()) {
</span><del>- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::simpleDefaultStyleSheet);
- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::defaultStyleSheet);
- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::quirksStyleSheet);
- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::svgStyleSheet);
- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::mathMLStyleSheet);
- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::mediaControlsStyleSheet);
- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::fullscreenStyleSheet);
- collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, CSSDefaultStyleSheets::plugInsStyleSheet);
</del><ins>+ collectFromStyleSheetContents(CSSDefaultStyleSheets::simpleDefaultStyleSheet);
+ collectFromStyleSheetContents(CSSDefaultStyleSheets::defaultStyleSheet);
+ collectFromStyleSheetContents(CSSDefaultStyleSheets::quirksStyleSheet);
+ collectFromStyleSheetContents(CSSDefaultStyleSheets::svgStyleSheet);
+ collectFromStyleSheetContents(CSSDefaultStyleSheets::mathMLStyleSheet);
+ collectFromStyleSheetContents(CSSDefaultStyleSheets::mediaControlsStyleSheet);
+ collectFromStyleSheetContents(CSSDefaultStyleSheets::fullscreenStyleSheet);
+ collectFromStyleSheetContents(CSSDefaultStyleSheets::plugInsStyleSheet);
</ins><span class="cx">
</span><del>- collectFromStyleSheets(styleScope.activeStyleSheets());
</del><span class="cx"> collect(extensionStyleSheets.pageUserSheet());
</span><span class="cx"> collectFromStyleSheets(extensionStyleSheets.injectedUserStyleSheets());
</span><span class="cx"> collectFromStyleSheets(extensionStyleSheets.documentUserStyleSheets());
</span><span class="cx"> }
</span><ins>+}
+
+void InspectorCSSOMWrappers::collectScopeWrappers(Style::Scope& styleScope)
+{
+ maybeCollectFromStyleSheets(styleScope.activeStyleSheets());
+}
+
+CSSStyleRule* InspectorCSSOMWrappers::getWrapperForRuleInSheets(StyleRule* rule)
+{
</ins><span class="cx"> return m_styleRuleToCSSOMWrapperMap.get(rule);
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorecssInspectorCSSOMWrappersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/InspectorCSSOMWrappers.h (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/InspectorCSSOMWrappers.h        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/Source/WebCore/css/InspectorCSSOMWrappers.h        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -20,8 +20,7 @@
</span><span class="cx"> *
</span><span class="cx"> */
</span><span class="cx">
</span><del>-#ifndef InspectorCSSOMWrappers_h
-#define InspectorCSSOMWrappers_h
</del><ins>+#pragma once
</ins><span class="cx">
</span><span class="cx"> #include <wtf/Forward.h>
</span><span class="cx"> #include <wtf/HashMap.h>
</span><span class="lines">@@ -45,15 +44,18 @@
</span><span class="cx"> public:
</span><span class="cx"> // WARNING. This will construct CSSOM wrappers for all style rules and cache them in a map for significant memory cost.
</span><span class="cx"> // It is here to support inspector. Don't use for any regular engine functions.
</span><del>- CSSStyleRule* getWrapperForRuleInSheets(StyleRule*, Style::Scope&, ExtensionStyleSheets&);
</del><ins>+ CSSStyleRule* getWrapperForRuleInSheets(StyleRule*);
</ins><span class="cx"> void collectFromStyleSheetIfNeeded(CSSStyleSheet*);
</span><ins>+ void collectDocumentWrappers(ExtensionStyleSheets&);
+ void collectScopeWrappers(Style::Scope&);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> template <class ListType>
</span><span class="cx"> void collect(ListType*);
</span><span class="cx">
</span><del>- void collectFromStyleSheetContents(HashSet<RefPtr<CSSStyleSheet>>& sheetWrapperSet, StyleSheetContents*);
</del><ins>+ void collectFromStyleSheetContents(StyleSheetContents*);
</ins><span class="cx"> void collectFromStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&);
</span><ins>+ void maybeCollectFromStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&);
</ins><span class="cx">
</span><span class="cx"> HashMap<StyleRule*, RefPtr<CSSStyleRule>> m_styleRuleToCSSOMWrapperMap;
</span><span class="cx"> HashSet<RefPtr<CSSStyleSheet>> m_styleSheetCSSOMWrapperSet;
</span><span class="lines">@@ -60,5 +62,3 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // InspectorCSSOMWrappers_h
</del></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorCSSAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx"> #include "RenderNamedFlowFragment.h"
</span><span class="cx"> #include "SVGStyleElement.h"
</span><span class="cx"> #include "SelectorChecker.h"
</span><ins>+#include "ShadowRoot.h"
</ins><span class="cx"> #include "StyleProperties.h"
</span><span class="cx"> #include "StylePropertyShorthand.h"
</span><span class="cx"> #include "StyleResolver.h"
</span><span class="lines">@@ -59,7 +60,6 @@
</span><span class="cx"> #include "StyleSheetList.h"
</span><span class="cx"> #include "WebKitNamedFlow.h"
</span><span class="cx"> #include <inspector/InspectorProtocolObjects.h>
</span><del>-#include <wtf/HashSet.h>
</del><span class="cx"> #include <wtf/Ref.h>
</span><span class="cx"> #include <wtf/Vector.h>
</span><span class="cx"> #include <wtf/text/CString.h>
</span><span class="lines">@@ -1016,9 +1016,17 @@
</span><span class="cx">
</span><span class="cx"> // StyleRules returned by StyleResolver::styleRulesForElement lack parent pointers since that infomation is not cheaply available.
</span><span class="cx"> // Since the inspector wants to walk the parent chain, we construct the full wrappers here.
</span><del>- CSSStyleRule* cssomWrapper = styleResolver.inspectorCSSOMWrappers().getWrapperForRuleInSheets(styleRule, styleResolver.document().styleScope(), styleResolver.document().extensionStyleSheets());
</del><ins>+ styleResolver.inspectorCSSOMWrappers().collectDocumentWrappers(styleResolver.document().extensionStyleSheets());
+ styleResolver.inspectorCSSOMWrappers().collectScopeWrappers(Style::Scope::forNode(*element));
+
+ // Possiblity of :host styles if this element has a shadow root.
+ if (ShadowRoot* shadowRoot = element->shadowRoot())
+ styleResolver.inspectorCSSOMWrappers().collectScopeWrappers(shadowRoot->styleScope());
+
+ CSSStyleRule* cssomWrapper = styleResolver.inspectorCSSOMWrappers().getWrapperForRuleInSheets(styleRule);
</ins><span class="cx"> if (!cssomWrapper)
</span><span class="cx"> return nullptr;
</span><ins>+
</ins><span class="cx"> InspectorStyleSheet* inspectorStyleSheet = bindStyleSheet(cssomWrapper->parentStyleSheet());
</span><span class="cx"> return inspectorStyleSheet ? inspectorStyleSheet->buildObjectForRule(cssomWrapper, element) : nullptr;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/Source/WebInspectorUI/ChangeLog        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2016-10-31 Joseph Pecoraro <pecoraro@apple.com>
+
+ Web Inspector: Shadow DOM scoped styles are missing
+ https://bugs.webkit.org/show_bug.cgi?id=164247
+ <rdar://problem/29035061>
+
+ Reviewed by Antti Koivisto.
+
+ * UserInterface/Models/DOMNodeStyles.js:
+ (WebInspector.DOMNodeStyles.prototype.refresh.fetchedInlineStyles):
+ Fix incorrect WrapperPromise usage.
+
</ins><span class="cx"> 2016-10-31 Devin Rousso <dcrousso+webkit@gmail.com>
</span><span class="cx">
</span><span class="cx"> Web Inspector: Arrows for Styles scope bar item are misaligned
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsDOMNodeStylesjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/DOMNodeStyles.js (208198 => 208199)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/DOMNodeStyles.js        2016-11-01 00:10:24 UTC (rev 208198)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/DOMNodeStyles.js        2016-11-01 00:23:29 UTC (rev 208199)
</span><span class="lines">@@ -145,7 +145,7 @@
</span><span class="cx">
</span><span class="cx"> this._updateStyleCascade();
</span><span class="cx">
</span><del>- fetchedComputedStylesPromise.resolve();
</del><ins>+ fetchedInlineStylesPromise.resolve();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> function fetchedComputedStyle(error, computedPropertiesPayload)
</span><span class="lines">@@ -243,7 +243,7 @@
</span><span class="cx"> CSSAgent.getInlineStylesForNode.invoke({nodeId: this._node.id}, fetchedInlineStyles.bind(this));
</span><span class="cx"> CSSAgent.getComputedStyleForNode.invoke({nodeId: this._node.id}, fetchedComputedStyle.bind(this));
</span><span class="cx">
</span><del>- this._pendingRefreshTask = Promise.all([fetchedMatchedStylesPromise, fetchedInlineStylesPromise, fetchedComputedStylesPromise])
</del><ins>+ this._pendingRefreshTask = Promise.all([fetchedMatchedStylesPromise.promise, fetchedInlineStylesPromise.promise, fetchedComputedStylesPromise.promise])
</ins><span class="cx"> .then(() => {
</span><span class="cx"> this._pendingRefreshTask = null;
</span><span class="cx"> });
</span></span></pre>
</div>
</div>
</body>
</html>