Style::Scope* CSSStyleSheet::styleScope() { auto* ownerNode = rootStyleSheet().ownerNode(); if (!ownerNode) return nullptr; return &Style::Scope::forNode(*ownerNode); }
bool StyleSheetContents::loadCompleted() const { StyleSheetContents* parentSheet = parentStyleSheet(); if (parentSheet) return parentSheet->loadCompleted(); StyleSheetContents* root = rootStyleSheet(); return root->m_loadingClients.isEmpty(); }
Node* StyleSheetContents::singleOwnerNode() const { StyleSheetContents* root = rootStyleSheet(); if (!root->hasOneClient()) return nullptr; if (root->m_loadingClients.size()) return (*root->m_loadingClients.begin())->ownerNode(); return (*root->m_completedClients.begin())->ownerNode(); }
void StyleSheetContents::startLoadingDynamicSheet() { StyleSheetContents* root = rootStyleSheet(); for (const auto& client : root->m_loadingClients) client->startLoadingDynamicSheet(); // Copy the completed clients to a vector for iteration. // startLoadingDynamicSheet will move the style sheet from the completed state // to the loading state which modifies the set of completed clients. We // therefore need the copy in order to not modify the set of completed clients // while iterating it. HeapVector<Member<CSSStyleSheet>> completedClients; copyToVector(root->m_completedClients, completedClients); for (unsigned i = 0; i < completedClients.size(); ++i) completedClients[i]->startLoadingDynamicSheet(); }
void StyleSheetContents::startLoadingDynamicSheet() { StyleSheetContents* root = rootStyleSheet(); for (ClientsIterator it = root->m_loadingClients.begin(); it != root->m_loadingClients.end(); ++it) (*it)->startLoadingDynamicSheet(); // Copy the completed clients to a vector for iteration. // startLoadingDynamicSheet will move the style sheet from the // completed state to the loading state which modifies the set of // completed clients. We therefore need the copy in order to not // modify the set of completed clients while iterating it. WillBeHeapVector<RawPtrWillBeMember<CSSStyleSheet> > completedClients; copyToVector(root->m_completedClients, completedClients); for (unsigned i = 0; i < completedClients.size(); ++i) completedClients[i]->startLoadingDynamicSheet(); }
void StyleSheetContents::checkLoaded() { if (isLoading()) return; // Avoid |this| being deleted by scripts that run via // ScriptableDocumentParser::executeScriptsWaitingForResources(). // See https://bugs.webkit.org/show_bug.cgi?id=95106 RefPtrWillBeRawPtr<StyleSheetContents> protect(this); StyleSheetContents* parentSheet = parentStyleSheet(); if (parentSheet) { parentSheet->checkLoaded(); return; } ASSERT(this == rootStyleSheet()); if (m_loadingClients.isEmpty()) return; // Avoid |CSSSStyleSheet| and |ownerNode| being deleted by scripts that run via // ScriptableDocumentParser::executeScriptsWaitingForResources(). Also protect // the |CSSStyleSheet| from being deleted during iteration via the |sheetLoaded| // method. // // When a sheet is loaded it is moved from the set of loading clients // to the set of completed clients. We therefore need the copy in order to // not modify the set while iterating it. WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet> > loadingClients; copyToVector(m_loadingClients, loadingClients); for (unsigned i = 0; i < loadingClients.size(); ++i) { if (loadingClients[i]->loadCompleted()) continue; // sheetLoaded might be invoked after its owner node is removed from document. if (RefPtrWillBeRawPtr<Node> ownerNode = loadingClients[i]->ownerNode()) { if (loadingClients[i]->sheetLoaded()) ownerNode->notifyLoadedSheetAndAllCriticalSubresources(m_didLoadErrorOccur); } } }
void StyleSheetContents::checkLoaded() { if (isLoading()) return; StyleSheetContents* parentSheet = parentStyleSheet(); if (parentSheet) { parentSheet->checkLoaded(); return; } ASSERT(this == rootStyleSheet()); if (m_loadingClients.isEmpty()) return; // Avoid |CSSSStyleSheet| and |ownerNode| being deleted by scripts that run // via ScriptableDocumentParser::executeScriptsWaitingForResources(). Also // protect the |CSSStyleSheet| from being deleted during iteration via the // |sheetLoaded| method. // // When a sheet is loaded it is moved from the set of loading clients // to the set of completed clients. We therefore need the copy in order to // not modify the set while iterating it. HeapVector<Member<CSSStyleSheet>> loadingClients; copyToVector(m_loadingClients, loadingClients); for (unsigned i = 0; i < loadingClients.size(); ++i) { if (loadingClients[i]->loadCompleted()) continue; // sheetLoaded might be invoked after its owner node is removed from // document. if (Node* ownerNode = loadingClients[i]->ownerNode()) { if (loadingClients[i]->sheetLoaded()) ownerNode->notifyLoadedSheetAndAllCriticalSubresources( m_didLoadErrorOccur ? Node::ErrorOccurredLoadingSubresource : Node::NoErrorLoadingSubresource); } } }
Document* CSSStyleSheet::ownerDocument() const { auto& root = rootStyleSheet(); return root.ownerNode() ? &root.ownerNode()->document() : nullptr; }
void StyleSheetContents::notifyRemoveFontFaceRule( const StyleRuleFontFace* fontFaceRule) { StyleSheetContents* root = rootStyleSheet(); removeFontFaceRules(root->m_loadingClients, fontFaceRule); removeFontFaceRules(root->m_completedClients, fontFaceRule); }
Document* StyleSheetContents::singleOwnerDocument() const { StyleSheetContents* root = rootStyleSheet(); return root->clientSingleOwnerDocument(); }
bool StyleSheetContents::hasSingleOwnerNode() const { return rootStyleSheet()->hasOneClient(); }