| Index: Source/core/dom/Document.cpp
|
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
|
| index 0358d20e1f34b833c95a6477d63acf0bc488008a..6f3c705acd96ddd8bacd81eb8c94948c69795a3b 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"
|
| @@ -121,6 +122,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"
|
| @@ -446,6 +448,7 @@ Document::Document(Frame* frame, const KURL& url, DocumentClassFlags documentCla
|
| , m_textAutosizer(TextAutosizer::create(this))
|
| , m_pendingTasksTimer(this, &Document::pendingTasksTimerFired)
|
| , m_scheduledTasksAreSuspended(false)
|
| + , m_callbackSelectorChangeTimer(this, &Document::callbackSelectorChangeTimerFired)
|
| , m_sharedObjectPoolClearTimer(this, &Document::sharedObjectPoolClearTimerFired)
|
| #ifndef NDEBUG
|
| , m_didDispatchViewportPropertiesChanged(false)
|
| @@ -1850,6 +1853,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)
|
| +
|
| void Document::attach(const AttachContext& context)
|
| {
|
| ASSERT(!attached());
|
| @@ -3004,6 +3061,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);
|
| +}
|
| +
|
| void Document::setHoverNode(PassRefPtr<Node> newHoverNode)
|
| {
|
| m_hoverNode = newHoverNode;
|
|
|