Chromium Code Reviews| Index: Source/core/dom/Document.cpp |
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
| index 95f472d66f5410d5b3092bf470ae642040180b90..72266456254f94d98ad58fde293f47ff1cfa3ba2 100644 |
| --- a/Source/core/dom/Document.cpp |
| +++ b/Source/core/dom/Document.cpp |
| @@ -40,6 +40,7 @@ |
| #include "bindings/v8/ScriptController.h" |
| #include "core/accessibility/AXObjectCache.h" |
| #include "core/animation/DocumentTimeline.h" |
| +#include "core/css/CSSParser.h" |
| #include "core/css/CSSStyleDeclaration.h" |
| #include "core/css/CSSStyleSheet.h" |
| #include "core/css/FontLoader.h" |
| @@ -122,6 +123,7 @@ |
| #include "core/loader/CookieJar.h" |
| #include "core/loader/DocumentLoader.h" |
| #include "core/loader/FrameLoader.h" |
| +#include "core/loader/FrameLoaderClient.h" |
| #include "core/loader/ImageLoader.h" |
| #include "core/loader/Prerenderer.h" |
| #include "core/loader/TextResourceDecoder.h" |
| @@ -444,6 +446,7 @@ Document::Document(Frame* frame, const KURL& url, DocumentClassFlags documentCla |
| , m_pendingTasksTimer(this, &Document::pendingTasksTimerFired) |
| , m_import(0) |
| , m_scheduledTasksAreSuspended(false) |
| + , m_callbackSelectorChangeTimer(this, &Document::callbackSelectorChangeTimerFired) |
| , m_sharedObjectPoolClearTimer(this, &Document::sharedObjectPoolClearTimerFired) |
| #ifndef NDEBUG |
| , m_didDispatchViewportPropertiesChanged(false) |
| @@ -1847,6 +1850,60 @@ void Document::clearStyleResolver() |
| m_styleResolver.clear(); |
| } |
| +#if ENABLE(CSS_CALLBACKS) |
| +void Document::callbackSelectorChangeTimerFired(Timer<Document>*) |
| +{ |
| + if (m_addedSelectors.isEmpty() && m_removedSelectors.isEmpty()) |
| + return; |
| + if (frame()) { |
| + Vector<String> addedSelectors, removedSelectors; |
| + copyToVector(m_addedSelectors, addedSelectors); |
| + copyToVector(m_removedSelectors, removedSelectors); |
| + frame()->loader()->client()->selectorMatchChanged(addedSelectors, removedSelectors); |
| + } |
| + m_addedSelectors.clear(); |
| + m_removedSelectors.clear(); |
| +} |
| + |
| +void Document::addSelectorMatch(const String& selector, StyleRareNonInheritedData* data) |
| +{ |
| + // Set m_document here to avoid exposing the weakFactory outside of Document. |
| + data->m_document = m_weakFactory.createWeakPtr(); |
| + |
| + HashMap<String, int>::iterator count = m_matchingCallbackSelectors.find(selector); |
| + if (count != m_matchingCallbackSelectors.end()) { |
| + ++count->value; |
| + return; |
| + } |
| + if (!m_callbackSelectorChangeTimer.isActive()) |
| + m_callbackSelectorChangeTimer.startOneShot(0); |
| + |
| + m_matchingCallbackSelectors.set(selector, 1); |
| + if (m_removedSelectors.contains(selector)) |
| + m_removedSelectors.remove(selector); |
| + else |
| + m_addedSelectors.add(selector); |
| +} |
| + |
| +void Document::removeSelectorMatch(const String& selector) |
| +{ |
| + HashMap<String, int>::iterator count = m_matchingCallbackSelectors.find(selector); |
| + if (count == m_matchingCallbackSelectors.end()) |
| + return; |
| + --count->value; |
| + if (!count->value) { |
| + if (!m_callbackSelectorChangeTimer.isActive()) |
| + m_callbackSelectorChangeTimer.startOneShot(0); |
| + |
| + m_matchingCallbackSelectors.remove(count); |
| + if (m_addedSelectors.contains(selector)) |
| + m_addedSelectors.remove(selector); |
| + else |
| + m_removedSelectors.add(selector); |
| + } |
| +} |
| +#endif // ENABLE(CSS_CALLBACKS) |
|
abarth-chromium
2013/07/12 23:44:11
This code should move into a supplement too. It's
Jeffrey Yasskin
2013/07/16 00:38:51
Done.
|
| + |
| void Document::attach(const AttachContext& context) |
| { |
| ASSERT(!attached()); |
| @@ -3025,6 +3082,29 @@ void Document::notifySeamlessChildDocumentsOfStylesheetUpdate() const |
| } |
| } |
| +void Document::watchCssSelectors(const Vector<String>& selectors) |
| +{ |
| + m_watchedCallbackSelectors.clear(); |
| + CSSParserContext context(UASheetMode); |
| + CSSParser parser(context); |
| + |
| + const CSSProperty callbackProperty(CSSPropertyInternalCallback, CSSPrimitiveValue::createIdentifier(CSSValueInternalPresence)); |
| + const RefPtr<StylePropertySet> callbackPropertySet = ImmutableStylePropertySet::create(&callbackProperty, 1, UASheetMode); |
| + |
| + CSSSelectorList selectorList; |
| + for (unsigned i = 0; i < selectors.size(); ++i) { |
| + RefPtr<StyleRule> rule = StyleRule::create(i); |
| + |
| + parser.parseSelector(selectors[i], selectorList); |
| + rule->wrapperAdoptSelectorList(selectorList); |
| + |
| + rule->setProperties(callbackPropertySet); |
| + |
| + m_watchedCallbackSelectors.append(rule.release()); |
| + } |
| + styleResolverChanged(RecalcStyleImmediately, FullStyleUpdate); |
|
esprehn
2013/07/13 01:43:01
DeferRecalcStyle, this definitely doesn't need a s
Jeffrey Yasskin
2013/07/16 00:38:51
Done.
|
| +} |
| + |
| void Document::setHoverNode(PassRefPtr<Node> newHoverNode) |
| { |
| m_hoverNode = newHoverNode; |