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

Side by Side 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, 3 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Peter Kelly (pmk@post.com) 4 * (C) 2001 Peter Kelly (pmk@post.com)
5 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * (C) 2001 Dirk Mueller (mueller@kde.org)
6 * (C) 2007 David Smith (catfish.man@gmail.com) 6 * (C) 2007 David Smith (catfish.man@gmail.com)
7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved. 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved.
8 * (C) 2007 Eric Seidel (eric@webkit.org) 8 * (C) 2007 Eric Seidel (eric@webkit.org)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 26 matching lines...) Expand all
37 #include "core/animation/DocumentTimeline.h" 37 #include "core/animation/DocumentTimeline.h"
38 #include "core/animation/css/CSSAnimations.h" 38 #include "core/animation/css/CSSAnimations.h"
39 #include "core/css/CSSParser.h" 39 #include "core/css/CSSParser.h"
40 #include "core/css/CSSStyleSheet.h" 40 #include "core/css/CSSStyleSheet.h"
41 #include "core/css/CSSValuePool.h" 41 #include "core/css/CSSValuePool.h"
42 #include "core/css/PropertySetCSSStyleDeclaration.h" 42 #include "core/css/PropertySetCSSStyleDeclaration.h"
43 #include "core/css/StylePropertySet.h" 43 #include "core/css/StylePropertySet.h"
44 #include "core/css/resolver/StyleResolver.h" 44 #include "core/css/resolver/StyleResolver.h"
45 #include "core/dom/Attr.h" 45 #include "core/dom/Attr.h"
46 #include "core/dom/Attribute.h" 46 #include "core/dom/Attribute.h"
47 #include "core/dom/CSSSelectorWatch.h"
47 #include "core/dom/ClientRect.h" 48 #include "core/dom/ClientRect.h"
48 #include "core/dom/ClientRectList.h" 49 #include "core/dom/ClientRectList.h"
49 #include "core/dom/CustomElement.h" 50 #include "core/dom/CustomElement.h"
50 #include "core/dom/CustomElementRegistrationContext.h" 51 #include "core/dom/CustomElementRegistrationContext.h"
51 #include "core/dom/DatasetDOMStringMap.h" 52 #include "core/dom/DatasetDOMStringMap.h"
52 #include "core/dom/Document.h" 53 #include "core/dom/Document.h"
53 #include "core/dom/DocumentSharedObjectPool.h" 54 #include "core/dom/DocumentSharedObjectPool.h"
54 #include "core/dom/ElementRareData.h" 55 #include "core/dom/ElementRareData.h"
55 #include "core/dom/EventDispatcher.h" 56 #include "core/dom/EventDispatcher.h"
56 #include "core/dom/ExceptionCode.h" 57 #include "core/dom/ExceptionCode.h"
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 if (hasRareData() && styleChangeType() == LazyAttachStyleChange) { 1320 if (hasRareData() && styleChangeType() == LazyAttachStyleChange) {
1320 ElementRareData* data = elementRareData(); 1321 ElementRareData* data = elementRareData();
1321 data->clearComputedStyle(); 1322 data->clearComputedStyle();
1322 data->resetDynamicRestyleObservations(); 1323 data->resetDynamicRestyleObservations();
1323 if (!context.resolvedStyle) 1324 if (!context.resolvedStyle)
1324 data->resetStyleState(); 1325 data->resetStyleState();
1325 } 1326 }
1326 1327
1327 NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIf Needed(); 1328 NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIf Needed();
1328 1329
1330 updateCallbackSelectors(Add);
1331
1329 createPseudoElementIfNeeded(BEFORE); 1332 createPseudoElementIfNeeded(BEFORE);
1330 1333
1331 // When a shadow root exists, it does the work of attaching the children. 1334 // When a shadow root exists, it does the work of attaching the children.
1332 if (ElementShadow* shadow = this->shadow()) { 1335 if (ElementShadow* shadow = this->shadow()) {
1333 parentPusher.push(); 1336 parentPusher.push();
1334 shadow->attach(context); 1337 shadow->attach(context);
1335 } else if (firstChild()) 1338 } else if (firstChild())
1336 parentPusher.push(); 1339 parentPusher.push();
1337 1340
1338 ContainerNode::attach(context); 1341 ContainerNode::attach(context);
(...skipping 21 matching lines...) Expand all
1360 { 1363 {
1361 if (RuntimeEnabledFeatures::cssRegionsEnabled() && inNamedFlow() && document ()->renderView()) 1364 if (RuntimeEnabledFeatures::cssRegionsEnabled() && inNamedFlow() && document ()->renderView())
1362 document()->renderView()->flowThreadController()->unregisterNamedFlowCon tentNode(this); 1365 document()->renderView()->flowThreadController()->unregisterNamedFlowCon tentNode(this);
1363 } 1366 }
1364 1367
1365 void Element::detach(const AttachContext& context) 1368 void Element::detach(const AttachContext& context)
1366 { 1369 {
1367 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; 1370 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
1368 unregisterNamedFlowContentNode(); 1371 unregisterNamedFlowContentNode();
1369 cancelFocusAppearanceUpdate(); 1372 cancelFocusAppearanceUpdate();
1373 updateCallbackSelectors(Remove);
1370 if (hasRareData()) { 1374 if (hasRareData()) {
1371 ElementRareData* data = elementRareData(); 1375 ElementRareData* data = elementRareData();
1372 data->setPseudoElement(BEFORE, 0); 1376 data->setPseudoElement(BEFORE, 0);
1373 data->setPseudoElement(AFTER, 0); 1377 data->setPseudoElement(AFTER, 0);
1374 data->setPseudoElement(BACKDROP, 0); 1378 data->setPseudoElement(BACKDROP, 0);
1375 data->clearComputedStyle(); 1379 data->clearComputedStyle();
1376 data->resetDynamicRestyleObservations(); 1380 data->resetDynamicRestyleObservations();
1377 data->setIsInsideRegion(false); 1381 data->setIsInsideRegion(false);
1378 1382
1379 // Only clear the style state if we're not going to reuse the style from recalcStyle. 1383 // Only clear the style state if we're not going to reuse the style from recalcStyle.
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 return document()->styleResolver()->styleForElement(this); 1447 return document()->styleResolver()->styleForElement(this);
1444 } 1448 }
1445 1449
1446 bool Element::recalcStyle(StyleChange change) 1450 bool Element::recalcStyle(StyleChange change)
1447 { 1451 {
1448 ASSERT(document()->inStyleRecalc()); 1452 ASSERT(document()->inStyleRecalc());
1449 1453
1450 if (hasCustomStyleCallbacks()) 1454 if (hasCustomStyleCallbacks())
1451 willRecalcStyle(change); 1455 willRecalcStyle(change);
1452 1456
1457 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. :)
1458 public:
1459 SelectorWatchUpdater(Element* element)
1460 : m_element(element)
1461 {
1462 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.
1463 }
1464
1465 ~SelectorWatchUpdater()
1466 {
1467 m_element->updateCallbackSelectors(Add);
1468 }
1469
1470 private:
1471 Element* const m_element;
1472 };
1473 SelectorWatchUpdater watchUpdater(this);
1474
1453 if (hasRareData() && (change > NoChange || needsStyleRecalc())) { 1475 if (hasRareData() && (change > NoChange || needsStyleRecalc())) {
1454 ElementRareData* data = elementRareData(); 1476 ElementRareData* data = elementRareData();
1455 data->resetStyleState(); 1477 data->resetStyleState();
1456 data->clearComputedStyle(); 1478 data->clearComputedStyle();
1457 } 1479 }
1458 1480
1459 // Active InsertionPoints have no renderers so they never need to go through a recalc. 1481 // Active InsertionPoints have no renderers so they never need to go through a recalc.
1460 if ((change >= Inherit || needsStyleRecalc()) && parentRenderStyle() && !isA ctiveInsertionPoint(this)) 1482 if ((change >= Inherit || needsStyleRecalc()) && parentRenderStyle() && !isA ctiveInsertionPoint(this))
1461 change = recalcOwnStyle(change); 1483 change = recalcOwnStyle(change);
1462 1484
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
2428 } 2450 }
2429 2451
2430 void Element::cancelFocusAppearanceUpdate() 2452 void Element::cancelFocusAppearanceUpdate()
2431 { 2453 {
2432 if (hasRareData()) 2454 if (hasRareData())
2433 elementRareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(false); 2455 elementRareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(false);
2434 if (document()->focusedElement() == this) 2456 if (document()->focusedElement() == this)
2435 document()->cancelFocusAppearanceUpdate(); 2457 document()->cancelFocusAppearanceUpdate();
2436 } 2458 }
2437 2459
2460 void Element::updateCallbackSelectors(AddOrRemove addOrRemove)
2461 {
2462 if (!renderStyle())
2463 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. :)
2464 const Vector<String>& callbackSelectors = renderStyle()->callbackSelectors() ;
2465 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.
2466 return;
2467
2468 CSSSelectorWatch* selectorWatch = CSSSelectorWatch::from(document());
2469 switch (addOrRemove) {
2470 case Add: {
2471 ElementRareData* rareData = ensureElementRareData();
2472 if (!rareData->renderStyleWatchedSelectorsRepresentedInSelectorWatch()) {
2473 selectorWatch->addSelectorMatches(callbackSelectors);
2474 rareData->setRenderStyleWatchedSelectorsRepresentedInSelectorWatch(t rue);
2475 }
2476 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.
2477 }
2478 case Remove:
2479 if (hasRareData() && elementRareData()->renderStyleWatchedSelectorsRepre sentedInSelectorWatch()) {
2480 selectorWatch->removeSelectorMatches(callbackSelectors);
2481 elementRareData()->setRenderStyleWatchedSelectorsRepresentedInSelect orWatch(false);
2482 }
2483 break;
2484 }
2485 }
2486
2438 void Element::normalizeAttributes() 2487 void Element::normalizeAttributes()
2439 { 2488 {
2440 if (!hasAttributes()) 2489 if (!hasAttributes())
2441 return; 2490 return;
2442 for (unsigned i = 0; i < attributeCount(); ++i) { 2491 for (unsigned i = 0; i < attributeCount(); ++i) {
2443 if (RefPtr<Attr> attr = attrIfExists(attributeItem(i)->name())) 2492 if (RefPtr<Attr> attr = attrIfExists(attributeItem(i)->name()))
2444 attr->normalize(); 2493 attr->normalize();
2445 } 2494 }
2446 } 2495 }
2447 2496
(...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after
3634 return 0; 3683 return 0;
3635 } 3684 }
3636 3685
3637 Attribute* UniqueElementData::attributeItem(unsigned index) 3686 Attribute* UniqueElementData::attributeItem(unsigned index)
3638 { 3687 {
3639 ASSERT_WITH_SECURITY_IMPLICATION(index < length()); 3688 ASSERT_WITH_SECURITY_IMPLICATION(index < length());
3640 return &m_attributeVector.at(index); 3689 return &m_attributeVector.at(index);
3641 } 3690 }
3642 3691
3643 } // namespace WebCore 3692 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698