| Index: third_party/WebKit/Source/core/css/ActiveStyleSheetsTest.cpp | 
| diff --git a/third_party/WebKit/Source/core/css/ActiveStyleSheetsTest.cpp b/third_party/WebKit/Source/core/css/ActiveStyleSheetsTest.cpp | 
| index b703cebec826fe40941e7d0962e5b9ba41550689..2bd50f808ca48327badfb29223c54a495427d841 100644 | 
| --- a/third_party/WebKit/Source/core/css/ActiveStyleSheetsTest.cpp | 
| +++ b/third_party/WebKit/Source/core/css/ActiveStyleSheetsTest.cpp | 
| @@ -8,21 +8,50 @@ | 
| #include "core/css/MediaQueryEvaluator.h" | 
| #include "core/css/StyleSheetContents.h" | 
| #include "core/css/parser/CSSParserMode.h" | 
| +#include "core/dom/shadow/ShadowRoot.h" | 
| +#include "core/dom/shadow/ShadowRootInit.h" | 
| +#include "core/frame/FrameView.h" | 
| +#include "core/html/HTMLElement.h" | 
| +#include "core/testing/DummyPageHolder.h" | 
| #include "testing/gtest/include/gtest/gtest.h" | 
|  | 
| namespace blink { | 
|  | 
| class ActiveStyleSheetsTest : public ::testing::Test { | 
| - public: | 
| -  static CSSStyleSheet* createSheet() { | 
| + protected: | 
| +  static CSSStyleSheet* createSheet(const String& cssText = String()) { | 
| StyleSheetContents* contents = | 
| StyleSheetContents::create(CSSParserContext(HTMLStandardMode, nullptr)); | 
| +    contents->parseString(cssText); | 
| contents->ensureRuleSet(MediaQueryEvaluator(), | 
| RuleHasDocumentSecurityOrigin); | 
| return CSSStyleSheet::create(contents); | 
| } | 
| }; | 
|  | 
| +class ApplyRulesetsTest : public ActiveStyleSheetsTest { | 
| + protected: | 
| +  void SetUp() override { | 
| +    m_dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); | 
| +  } | 
| + | 
| +  Document& document() { return m_dummyPageHolder->document(); } | 
| +  StyleEngine& styleEngine() { return document().styleEngine(); } | 
| +  ShadowRoot& attachShadow(Element& host); | 
| + | 
| + private: | 
| +  std::unique_ptr<DummyPageHolder> m_dummyPageHolder; | 
| +}; | 
| + | 
| +ShadowRoot& ApplyRulesetsTest::attachShadow(Element& host) { | 
| +  ShadowRootInit init; | 
| +  init.setMode("open"); | 
| +  ShadowRoot* shadowRoot = host.attachShadow( | 
| +      ScriptState::forMainWorld(document().frame()), init, ASSERT_NO_EXCEPTION); | 
| +  EXPECT_TRUE(shadowRoot); | 
| +  return *shadowRoot; | 
| +} | 
| + | 
| TEST_F(ActiveStyleSheetsTest, CompareActiveStyleSheets_NoChange) { | 
| ActiveStyleSheetVector oldSheets; | 
| ActiveStyleSheetVector newSheets; | 
| @@ -271,4 +300,107 @@ TEST_F(ActiveStyleSheetsTest, | 
| EXPECT_EQ(&sheet3->contents()->ruleSet(), changedRuleSets[0]); | 
| } | 
|  | 
| +TEST_F(ApplyRulesetsTest, AddUniversalRuleToDocument) { | 
| +  document().view()->updateAllLifecyclePhases(); | 
| + | 
| +  CSSStyleSheet* sheet = createSheet("body * { color:red }"); | 
| + | 
| +  ActiveStyleSheetVector newStyleSheets; | 
| +  newStyleSheets.append(std::make_pair(sheet, &sheet->contents()->ruleSet())); | 
| + | 
| +  applyRuleSetChanges(styleEngine(), document(), ActiveStyleSheetVector(), | 
| +                      newStyleSheets); | 
| + | 
| +  EXPECT_EQ(SubtreeStyleChange, document().getStyleChangeType()); | 
| +} | 
| + | 
| +TEST_F(ApplyRulesetsTest, AddUniversalRuleToShadowTree) { | 
| +  document().body()->setInnerHTML("<div id=host></div>", ASSERT_NO_EXCEPTION); | 
| +  Element* host = document().getElementById("host"); | 
| +  ASSERT_TRUE(host); | 
| + | 
| +  ShadowRoot& shadowRoot = attachShadow(*host); | 
| +  document().view()->updateAllLifecyclePhases(); | 
| + | 
| +  CSSStyleSheet* sheet = createSheet("body * { color:red }"); | 
| + | 
| +  ActiveStyleSheetVector newStyleSheets; | 
| +  newStyleSheets.append(std::make_pair(sheet, &sheet->contents()->ruleSet())); | 
| + | 
| +  applyRuleSetChanges(styleEngine(), shadowRoot, ActiveStyleSheetVector(), | 
| +                      newStyleSheets); | 
| + | 
| +  EXPECT_FALSE(document().needsStyleRecalc()); | 
| +  EXPECT_EQ(SubtreeStyleChange, host->getStyleChangeType()); | 
| +} | 
| + | 
| +TEST_F(ApplyRulesetsTest, AddShadowV0BoundaryCrossingRuleToDocument) { | 
| +  document().view()->updateAllLifecyclePhases(); | 
| + | 
| +  CSSStyleSheet* sheet = createSheet(".a /deep/ .b { color:red }"); | 
| + | 
| +  ActiveStyleSheetVector newStyleSheets; | 
| +  newStyleSheets.append(std::make_pair(sheet, &sheet->contents()->ruleSet())); | 
| + | 
| +  applyRuleSetChanges(styleEngine(), document(), ActiveStyleSheetVector(), | 
| +                      newStyleSheets); | 
| + | 
| +  EXPECT_EQ(SubtreeStyleChange, document().getStyleChangeType()); | 
| +} | 
| + | 
| +TEST_F(ApplyRulesetsTest, AddShadowV0BoundaryCrossingRuleToShadowTree) { | 
| +  document().body()->setInnerHTML("<div id=host></div>", ASSERT_NO_EXCEPTION); | 
| +  Element* host = document().getElementById("host"); | 
| +  ASSERT_TRUE(host); | 
| + | 
| +  ShadowRoot& shadowRoot = attachShadow(*host); | 
| +  document().view()->updateAllLifecyclePhases(); | 
| + | 
| +  CSSStyleSheet* sheet = createSheet(".a /deep/ .b { color:red }"); | 
| + | 
| +  ActiveStyleSheetVector newStyleSheets; | 
| +  newStyleSheets.append(std::make_pair(sheet, &sheet->contents()->ruleSet())); | 
| + | 
| +  applyRuleSetChanges(styleEngine(), shadowRoot, ActiveStyleSheetVector(), | 
| +                      newStyleSheets); | 
| + | 
| +  EXPECT_FALSE(document().needsStyleRecalc()); | 
| +  EXPECT_EQ(SubtreeStyleChange, host->getStyleChangeType()); | 
| +} | 
| + | 
| +TEST_F(ApplyRulesetsTest, AddFontFaceRuleToDocument) { | 
| +  document().view()->updateAllLifecyclePhases(); | 
| + | 
| +  CSSStyleSheet* sheet = | 
| +      createSheet("@font-face { font-family: ahum; src: url(ahum.ttf) }"); | 
| + | 
| +  ActiveStyleSheetVector newStyleSheets; | 
| +  newStyleSheets.append(std::make_pair(sheet, &sheet->contents()->ruleSet())); | 
| + | 
| +  applyRuleSetChanges(styleEngine(), document(), ActiveStyleSheetVector(), | 
| +                      newStyleSheets); | 
| + | 
| +  EXPECT_EQ(SubtreeStyleChange, document().getStyleChangeType()); | 
| +} | 
| + | 
| +TEST_F(ApplyRulesetsTest, AddFontFaceRuleToShadowTree) { | 
| +  document().body()->setInnerHTML("<div id=host></div>", ASSERT_NO_EXCEPTION); | 
| +  Element* host = document().getElementById("host"); | 
| +  ASSERT_TRUE(host); | 
| + | 
| +  ShadowRoot& shadowRoot = attachShadow(*host); | 
| +  document().view()->updateAllLifecyclePhases(); | 
| + | 
| +  CSSStyleSheet* sheet = | 
| +      createSheet("@font-face { font-family: ahum; src: url(ahum.ttf) }"); | 
| + | 
| +  ActiveStyleSheetVector newStyleSheets; | 
| +  newStyleSheets.append(std::make_pair(sheet, &sheet->contents()->ruleSet())); | 
| + | 
| +  applyRuleSetChanges(styleEngine(), shadowRoot, ActiveStyleSheetVector(), | 
| +                      newStyleSheets); | 
| + | 
| +  EXPECT_FALSE(document().needsLayoutTreeUpdate()); | 
| +} | 
| + | 
| }  // namespace blink | 
|  |