| Index: third_party/WebKit/Source/core/html/HTMLLinkElement.cpp | 
| diff --git a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp | 
| index 4427d8339ef9e42ec4953fecb3e658063ba1102b..5a9d71fb75063c7ea70baf978b181de4b6595559 100644 | 
| --- a/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp | 
| +++ b/third_party/WebKit/Source/core/html/HTMLLinkElement.cpp | 
| @@ -133,7 +133,7 @@ void HTMLLinkElement::parseAttribute(const QualifiedName& name, const AtomicStri | 
|  | 
| bool HTMLLinkElement::shouldLoadLink() | 
| { | 
| -    return isConnected(); | 
| +    return isInDocumentTree() || (isConnected() && m_relAttribute.isStyleSheet()); | 
| } | 
|  | 
| bool HTMLLinkElement::loadLink(const String& type, const String& as, const String& media, const KURL& url) | 
| @@ -143,8 +143,7 @@ bool HTMLLinkElement::loadLink(const String& type, const String& as, const Strin | 
|  | 
| LinkResource* HTMLLinkElement::linkResourceToProcess() | 
| { | 
| -    bool visible = isConnected() && !isInShadowTree(); | 
| -    if (!visible) { | 
| +    if (!shouldLoadLink()) { | 
| ASSERT(!linkStyle() || !linkStyle()->hasSheet()); | 
| return nullptr; | 
| } | 
| @@ -203,8 +202,9 @@ Node::InsertionNotificationRequest HTMLLinkElement::insertedInto(ContainerNode* | 
| logAddElementIfIsolatedWorldAndInDocument("link", relAttr, hrefAttr); | 
| if (!insertionPoint->isConnected()) | 
| return InsertionDone; | 
| - | 
| -    if (isInShadowTree()) { | 
| +    DCHECK(isConnected()); | 
| +    if (!shouldLoadLink()) { | 
| +        DCHECK(isInShadowTree()); | 
| String message = "HTML element <link> is ignored in shadow tree."; | 
| document().addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); | 
| return InsertionDone; | 
| @@ -222,15 +222,15 @@ Node::InsertionNotificationRequest HTMLLinkElement::insertedInto(ContainerNode* | 
|  | 
| void HTMLLinkElement::removedFrom(ContainerNode* insertionPoint) | 
| { | 
| -    // Store the result of isInShadowTree() here before Node::removedFrom(..) clears the flags. | 
| -    bool wasInShadowTree = isInShadowTree(); | 
| +    // Store the result of isConnected() here before Node::removedFrom(..) clears the flags. | 
| +    bool wasConnected = isConnected(); | 
| HTMLElement::removedFrom(insertionPoint); | 
| if (!insertionPoint->isConnected()) | 
| return; | 
|  | 
| m_linkLoader->released(); | 
|  | 
| -    if (wasInShadowTree) { | 
| +    if (!wasConnected) { | 
| ASSERT(!linkStyle() || !linkStyle()->hasSheet()); | 
| return; | 
| } | 
| @@ -440,8 +440,8 @@ enum StyleSheetCacheStatus { | 
|  | 
| void LinkStyle::setCSSStyleSheet(const String& href, const KURL& baseURL, const String& charset, const CSSStyleSheetResource* cachedStyleSheet) | 
| { | 
| -    if (!m_owner->isInDocumentTree()) { | 
| -        // While the stylesheet is asynchronously loading, the owner can be moved out of a document tree. | 
| +    if (!m_owner->isConnected()) { | 
| +        // While the stylesheet is asynchronously loading, the owner can be disconnected from a document. | 
| // In that case, cancel any processing on the loaded content. | 
| m_loading = false; | 
| removePendingSheet(); | 
| @@ -658,7 +658,7 @@ void LinkStyle::process() | 
| m_loading = true; | 
|  | 
| String title = m_owner->title(); | 
| -        if (!title.isEmpty() && !m_owner->isAlternate() && m_disabledState != EnabledViaScript) | 
| +        if (!title.isEmpty() && !m_owner->isAlternate() && m_disabledState != EnabledViaScript && m_owner->isInDocumentTree()) | 
| document().styleEngine().setPreferredStylesheetSetNameIfNotSet(title); | 
|  | 
| bool mediaQueryMatches = true; | 
|  |