Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(697)

Unified Diff: Source/core/dom/Element.cpp

Issue 18371008: Add a WebDocument::watchCssSelectors(selectors) (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@pinned
Patch Set: Sync Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/dom/Element.cpp
diff --git a/Source/core/dom/Element.cpp b/Source/core/dom/Element.cpp
index ce5e91a04f284c071f7fabb080953e601ae0b4b1..8cdfa4a77ecd7c653cc60df687592be13b5bf016 100644
--- a/Source/core/dom/Element.cpp
+++ b/Source/core/dom/Element.cpp
@@ -44,6 +44,7 @@
#include "core/css/resolver/StyleResolver.h"
#include "core/dom/Attr.h"
#include "core/dom/Attribute.h"
+#include "core/dom/CSSSelectorWatch.h"
#include "core/dom/ClientRect.h"
#include "core/dom/ClientRectList.h"
#include "core/dom/CustomElement.h"
@@ -1326,6 +1327,8 @@ void Element::attach(const AttachContext& context)
NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIfNeeded();
+ updateCallbackSelectors(Add);
+
createPseudoElementIfNeeded(BEFORE);
// When a shadow root exists, it does the work of attaching the children.
@@ -1367,6 +1370,7 @@ void Element::detach(const AttachContext& context)
WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
unregisterNamedFlowContentNode();
cancelFocusAppearanceUpdate();
+ updateCallbackSelectors(Remove);
if (hasRareData()) {
ElementRareData* data = elementRareData();
data->setPseudoElement(BEFORE, 0);
@@ -1450,6 +1454,24 @@ bool Element::recalcStyle(StyleChange change)
if (hasCustomStyleCallbacks())
willRecalcStyle(change);
+ class SelectorWatchUpdater {
esprehn 2013/09/04 06:08:28 Don't put classes inside methods. This needs to be
Jeffrey Yasskin 2013/09/12 22:09:59 It's no longer necessary. :)
+ public:
+ SelectorWatchUpdater(Element* element)
+ : m_element(element)
+ {
+ m_element->updateCallbackSelectors(Remove);
esprehn 2013/09/04 06:08:28 This is not right, why are you removing and adding
Jeffrey Yasskin 2013/09/12 22:09:59 Yep, using recalcOwnStyle() cleaned this up a lot.
+ }
+
+ ~SelectorWatchUpdater()
+ {
+ m_element->updateCallbackSelectors(Add);
+ }
+
+ private:
+ Element* const m_element;
+ };
+ SelectorWatchUpdater watchUpdater(this);
+
if (hasRareData() && (change > NoChange || needsStyleRecalc())) {
ElementRareData* data = elementRareData();
data->resetStyleState();
@@ -2435,6 +2457,33 @@ void Element::cancelFocusAppearanceUpdate()
document()->cancelFocusAppearanceUpdate();
}
+void Element::updateCallbackSelectors(AddOrRemove addOrRemove)
+{
+ if (!renderStyle())
+ return;
esprehn 2013/09/04 06:08:28 Don't call RenderStyle repeatedly, you want to cal
Jeffrey Yasskin 2013/09/12 22:09:59 Obsolete. :)
+ const Vector<String>& callbackSelectors = renderStyle()->callbackSelectors();
+ if (callbackSelectors.isEmpty())
esprehn 2013/09/04 06:08:28 The check should be outside the function call sinc
Jeffrey Yasskin 2013/09/12 22:09:59 Done.
+ return;
+
+ CSSSelectorWatch* selectorWatch = CSSSelectorWatch::from(document());
+ switch (addOrRemove) {
+ case Add: {
+ ElementRareData* rareData = ensureElementRareData();
+ if (!rareData->renderStyleWatchedSelectorsRepresentedInSelectorWatch()) {
+ selectorWatch->addSelectorMatches(callbackSelectors);
+ rareData->setRenderStyleWatchedSelectorsRepresentedInSelectorWatch(true);
+ }
+ break;
esprehn 2013/09/04 06:08:28 These should be two separate methods and get rid o
Jeffrey Yasskin 2013/09/12 22:09:59 Refactored away.
+ }
+ case Remove:
+ if (hasRareData() && elementRareData()->renderStyleWatchedSelectorsRepresentedInSelectorWatch()) {
+ selectorWatch->removeSelectorMatches(callbackSelectors);
+ elementRareData()->setRenderStyleWatchedSelectorsRepresentedInSelectorWatch(false);
+ }
+ break;
+ }
+}
+
void Element::normalizeAttributes()
{
if (!hasAttributes())

Powered by Google App Engine
This is Rietveld 408576698