| Index: third_party/WebKit/Source/core/dom/StyleEngine.cpp | 
| diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.cpp b/third_party/WebKit/Source/core/dom/StyleEngine.cpp | 
| index c056371b2c233b06f2db93f8bc9f27580b36a9b4..531253c4f769e31e74050b4c17570d5048b6a7b0 100644 | 
| --- a/third_party/WebKit/Source/core/dom/StyleEngine.cpp | 
| +++ b/third_party/WebKit/Source/core/dom/StyleEngine.cpp | 
| @@ -37,6 +37,7 @@ | 
| #include "core/css/StyleSheetContents.h" | 
| #include "core/css/invalidation/InvalidationSet.h" | 
| #include "core/css/resolver/ScopedStyleResolver.h" | 
| +#include "core/css/resolver/ViewportStyleResolver.h" | 
| #include "core/dom/DocumentStyleSheetCollector.h" | 
| #include "core/dom/Element.h" | 
| #include "core/dom/ElementTraversal.h" | 
| @@ -64,13 +65,15 @@ StyleEngine::StyleEngine(Document& document) | 
| m_isMaster(!document.importsController() || | 
| document.importsController()->master() == &document), | 
| m_documentStyleSheetCollection( | 
| -          DocumentStyleSheetCollection::create(document)), | 
| -      // We don't need to create CSSFontSelector for imported document or | 
| -      // HTMLTemplateElement's document, because those documents have no frame. | 
| -      m_fontSelector(document.frame() ? CSSFontSelector::create(&document) | 
| -                                      : nullptr) { | 
| -  if (m_fontSelector) | 
| +          DocumentStyleSheetCollection::create(document)) { | 
| +  if (document.frame()) { | 
| +    // We don't need to create CSSFontSelector for imported document or | 
| +    // HTMLTemplateElement's document, because those documents have no frame. | 
| +    m_fontSelector = CSSFontSelector::create(&document); | 
| m_fontSelector->registerForInvalidationCallbacks(this); | 
| +  } | 
| +  if (document.isInMainFrame()) | 
| +    m_viewportResolver = ViewportStyleResolver::create(document); | 
| } | 
|  | 
| StyleEngine::~StyleEngine() {} | 
| @@ -393,6 +396,8 @@ void StyleEngine::shadowRootRemovedFromDocument(ShadowRoot* shadowRoot) { | 
| void StyleEngine::appendActiveAuthorStyleSheets() { | 
| DCHECK(isMaster()); | 
|  | 
| +  viewportRulesChanged(); | 
| + | 
| m_resolver->appendAuthorStyleSheets( | 
| documentStyleSheetCollection().activeAuthorStyleSheets()); | 
| for (TreeScope* treeScope : m_activeTreeScopes) { | 
| @@ -442,6 +447,7 @@ void StyleEngine::clearMasterResolver() { | 
|  | 
| void StyleEngine::didDetach() { | 
| clearResolver(); | 
| +  m_viewportResolver.clear(); | 
| } | 
|  | 
| bool StyleEngine::shouldClearResolver() const { | 
| @@ -947,6 +953,29 @@ void StyleEngine::ensureFullscreenUAStyle() { | 
| m_resolver->resetRuleFeatures(); | 
| } | 
|  | 
| +void StyleEngine::initialViewportChanged() { | 
| +  if (!m_viewportResolver) | 
| +    return; | 
| + | 
| +  m_viewportResolver->initialViewportChanged(); | 
| + | 
| +  // TODO(rune@opera.com): for async stylesheet update, updateViewport() should | 
| +  // be called as part of the lifecycle update for active style. Synchronous for | 
| +  // now. | 
| +  m_viewportResolver->updateViewport(documentStyleSheetCollection()); | 
| +} | 
| + | 
| +void StyleEngine::viewportRulesChanged() { | 
| +  if (!m_viewportResolver) | 
| +    return; | 
| +  m_viewportResolver->setNeedsCollectRules(); | 
| + | 
| +  // TODO(rune@opera.com): for async stylesheet update, updateViewport() should | 
| +  // be called as part of the lifecycle update for active style. Synchronous for | 
| +  // now. | 
| +  m_viewportResolver->updateViewport(documentStyleSheetCollection()); | 
| +} | 
| + | 
| DEFINE_TRACE(StyleEngine) { | 
| visitor->trace(m_document); | 
| visitor->trace(m_injectedAuthorStyleSheets); | 
| @@ -954,6 +983,7 @@ DEFINE_TRACE(StyleEngine) { | 
| visitor->trace(m_documentStyleSheetCollection); | 
| visitor->trace(m_styleSheetCollectionMap); | 
| visitor->trace(m_resolver); | 
| +  visitor->trace(m_viewportResolver); | 
| visitor->trace(m_styleInvalidator); | 
| visitor->trace(m_dirtyTreeScopes); | 
| visitor->trace(m_activeTreeScopes); | 
|  |