OLD | NEW |
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 25 matching lines...) Expand all Loading... |
36 #include "core/accessibility/AXObjectCache.h" | 36 #include "core/accessibility/AXObjectCache.h" |
37 #include "core/animation/DocumentTimeline.h" | 37 #include "core/animation/DocumentTimeline.h" |
38 #include "core/css/CSSParser.h" | 38 #include "core/css/CSSParser.h" |
39 #include "core/css/CSSStyleSheet.h" | 39 #include "core/css/CSSStyleSheet.h" |
40 #include "core/css/CSSValuePool.h" | 40 #include "core/css/CSSValuePool.h" |
41 #include "core/css/PropertySetCSSStyleDeclaration.h" | 41 #include "core/css/PropertySetCSSStyleDeclaration.h" |
42 #include "core/css/StylePropertySet.h" | 42 #include "core/css/StylePropertySet.h" |
43 #include "core/css/resolver/StyleResolver.h" | 43 #include "core/css/resolver/StyleResolver.h" |
44 #include "core/dom/Attr.h" | 44 #include "core/dom/Attr.h" |
45 #include "core/dom/Attribute.h" | 45 #include "core/dom/Attribute.h" |
| 46 #include "core/dom/CSSSelectorWatch.h" |
46 #include "core/dom/ClientRect.h" | 47 #include "core/dom/ClientRect.h" |
47 #include "core/dom/ClientRectList.h" | 48 #include "core/dom/ClientRectList.h" |
48 #include "core/dom/CustomElement.h" | 49 #include "core/dom/CustomElement.h" |
49 #include "core/dom/CustomElementRegistrationContext.h" | 50 #include "core/dom/CustomElementRegistrationContext.h" |
50 #include "core/dom/DatasetDOMStringMap.h" | 51 #include "core/dom/DatasetDOMStringMap.h" |
51 #include "core/dom/Document.h" | 52 #include "core/dom/Document.h" |
52 #include "core/dom/DocumentSharedObjectPool.h" | 53 #include "core/dom/DocumentSharedObjectPool.h" |
53 #include "core/dom/ElementRareData.h" | 54 #include "core/dom/ElementRareData.h" |
54 #include "core/dom/EventDispatcher.h" | 55 #include "core/dom/EventDispatcher.h" |
55 #include "core/dom/ExceptionCode.h" | 56 #include "core/dom/ExceptionCode.h" |
(...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 } | 1331 } |
1331 | 1332 |
1332 void Element::attach(const AttachContext& context) | 1333 void Element::attach(const AttachContext& context) |
1333 { | 1334 { |
1334 PostAttachCallbackDisabler callbackDisabler(this); | 1335 PostAttachCallbackDisabler callbackDisabler(this); |
1335 StyleResolverParentPusher parentPusher(this); | 1336 StyleResolverParentPusher parentPusher(this); |
1336 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; | 1337 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; |
1337 | 1338 |
1338 NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIf
Needed(); | 1339 NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIf
Needed(); |
1339 | 1340 |
| 1341 updateCallbackSelectors(Add); |
| 1342 |
1340 createPseudoElementIfNeeded(BEFORE); | 1343 createPseudoElementIfNeeded(BEFORE); |
1341 | 1344 |
1342 // When a shadow root exists, it does the work of attaching the children. | 1345 // When a shadow root exists, it does the work of attaching the children. |
1343 if (ElementShadow* shadow = this->shadow()) { | 1346 if (ElementShadow* shadow = this->shadow()) { |
1344 parentPusher.push(); | 1347 parentPusher.push(); |
1345 shadow->attach(context); | 1348 shadow->attach(context); |
1346 } else if (firstChild()) | 1349 } else if (firstChild()) |
1347 parentPusher.push(); | 1350 parentPusher.push(); |
1348 | 1351 |
1349 ContainerNode::attach(context); | 1352 ContainerNode::attach(context); |
(...skipping 21 matching lines...) Expand all Loading... |
1371 { | 1374 { |
1372 if (RuntimeEnabledFeatures::cssRegionsEnabled() && inNamedFlow() && document
()->renderView()) | 1375 if (RuntimeEnabledFeatures::cssRegionsEnabled() && inNamedFlow() && document
()->renderView()) |
1373 document()->renderView()->flowThreadController()->unregisterNamedFlowCon
tentNode(this); | 1376 document()->renderView()->flowThreadController()->unregisterNamedFlowCon
tentNode(this); |
1374 } | 1377 } |
1375 | 1378 |
1376 void Element::detach(const AttachContext& context) | 1379 void Element::detach(const AttachContext& context) |
1377 { | 1380 { |
1378 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; | 1381 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; |
1379 unregisterNamedFlowContentNode(); | 1382 unregisterNamedFlowContentNode(); |
1380 cancelFocusAppearanceUpdate(); | 1383 cancelFocusAppearanceUpdate(); |
| 1384 updateCallbackSelectors(Remove); |
1381 if (hasRareData()) { | 1385 if (hasRareData()) { |
1382 ElementRareData* data = elementRareData(); | 1386 ElementRareData* data = elementRareData(); |
1383 data->setPseudoElement(BEFORE, 0); | 1387 data->setPseudoElement(BEFORE, 0); |
1384 data->setPseudoElement(AFTER, 0); | 1388 data->setPseudoElement(AFTER, 0); |
1385 data->setPseudoElement(BACKDROP, 0); | 1389 data->setPseudoElement(BACKDROP, 0); |
1386 data->clearComputedStyle(); | 1390 data->clearComputedStyle(); |
1387 data->resetDynamicRestyleObservations(); | 1391 data->resetDynamicRestyleObservations(); |
1388 data->setIsInsideRegion(false); | 1392 data->setIsInsideRegion(false); |
1389 | 1393 |
1390 // Only clear the style state if we're not going to reuse the style from
recalcStyle. | 1394 // 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 Loading... |
1454 return document()->styleResolver()->styleForElement(this); | 1458 return document()->styleResolver()->styleForElement(this); |
1455 } | 1459 } |
1456 | 1460 |
1457 bool Element::recalcStyle(StyleChange change) | 1461 bool Element::recalcStyle(StyleChange change) |
1458 { | 1462 { |
1459 ASSERT(document()->inStyleRecalc()); | 1463 ASSERT(document()->inStyleRecalc()); |
1460 | 1464 |
1461 if (hasCustomStyleCallbacks()) | 1465 if (hasCustomStyleCallbacks()) |
1462 willRecalcStyle(change); | 1466 willRecalcStyle(change); |
1463 | 1467 |
| 1468 class SelectorWatchUpdater { |
| 1469 public: |
| 1470 SelectorWatchUpdater(Element* element) |
| 1471 : m_element(element) |
| 1472 { |
| 1473 m_element->updateCallbackSelectors(Remove); |
| 1474 } |
| 1475 |
| 1476 ~SelectorWatchUpdater() |
| 1477 { |
| 1478 m_element->updateCallbackSelectors(Add); |
| 1479 } |
| 1480 |
| 1481 private: |
| 1482 Element* const m_element; |
| 1483 }; |
| 1484 SelectorWatchUpdater watchUpdater(this); |
| 1485 |
1464 // Ref currentStyle in case it would otherwise be deleted when setting the n
ew style in the renderer. | 1486 // Ref currentStyle in case it would otherwise be deleted when setting the n
ew style in the renderer. |
1465 RefPtr<RenderStyle> currentStyle = renderStyle(); | 1487 RefPtr<RenderStyle> currentStyle = renderStyle(); |
1466 bool hasParentStyle = static_cast<bool>(parentRenderStyle()); | 1488 bool hasParentStyle = static_cast<bool>(parentRenderStyle()); |
1467 bool hasDirectAdjacentRules = childrenAffectedByDirectAdjacentRules(); | 1489 bool hasDirectAdjacentRules = childrenAffectedByDirectAdjacentRules(); |
1468 bool hasIndirectAdjacentRules = childrenAffectedByForwardPositionalRules(); | 1490 bool hasIndirectAdjacentRules = childrenAffectedByForwardPositionalRules(); |
1469 | 1491 |
1470 if (hasRareData() && (change > NoChange || needsStyleRecalc())) { | 1492 if (hasRareData() && (change > NoChange || needsStyleRecalc())) { |
1471 ElementRareData* data = elementRareData(); | 1493 ElementRareData* data = elementRareData(); |
1472 data->resetStyleState(); | 1494 data->resetStyleState(); |
1473 data->clearComputedStyle(); | 1495 data->clearComputedStyle(); |
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2439 } | 2461 } |
2440 | 2462 |
2441 void Element::cancelFocusAppearanceUpdate() | 2463 void Element::cancelFocusAppearanceUpdate() |
2442 { | 2464 { |
2443 if (hasRareData()) | 2465 if (hasRareData()) |
2444 elementRareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(false); | 2466 elementRareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(false); |
2445 if (document()->focusedElement() == this) | 2467 if (document()->focusedElement() == this) |
2446 document()->cancelFocusAppearanceUpdate(); | 2468 document()->cancelFocusAppearanceUpdate(); |
2447 } | 2469 } |
2448 | 2470 |
| 2471 void Element::updateCallbackSelectors(AddOrRemove addOrRemove) |
| 2472 { |
| 2473 if (!renderStyle()) |
| 2474 return; |
| 2475 const Vector<String>& callbackSelectors = renderStyle()->callbackSelectors()
; |
| 2476 if (callbackSelectors.isEmpty()) |
| 2477 return; |
| 2478 |
| 2479 CSSSelectorWatch* selectorWatch = CSSSelectorWatch::from(document()); |
| 2480 switch (addOrRemove) { |
| 2481 case Add: { |
| 2482 ElementRareData* rareData = ensureElementRareData(); |
| 2483 if (!rareData->renderStyleWatchedSelectorsRepresentedInSelectorWatch())
{ |
| 2484 selectorWatch->addSelectorMatches(callbackSelectors); |
| 2485 rareData->setRenderStyleWatchedSelectorsRepresentedInSelectorWatch(t
rue); |
| 2486 } |
| 2487 break; |
| 2488 } |
| 2489 case Remove: |
| 2490 if (hasRareData() && elementRareData()->renderStyleWatchedSelectorsRepre
sentedInSelectorWatch()) { |
| 2491 selectorWatch->removeSelectorMatches(callbackSelectors); |
| 2492 elementRareData()->setRenderStyleWatchedSelectorsRepresentedInSelect
orWatch(false); |
| 2493 } |
| 2494 break; |
| 2495 } |
| 2496 } |
| 2497 |
2449 void Element::normalizeAttributes() | 2498 void Element::normalizeAttributes() |
2450 { | 2499 { |
2451 if (!hasAttributes()) | 2500 if (!hasAttributes()) |
2452 return; | 2501 return; |
2453 for (unsigned i = 0; i < attributeCount(); ++i) { | 2502 for (unsigned i = 0; i < attributeCount(); ++i) { |
2454 if (RefPtr<Attr> attr = attrIfExists(attributeItem(i)->name())) | 2503 if (RefPtr<Attr> attr = attrIfExists(attributeItem(i)->name())) |
2455 attr->normalize(); | 2504 attr->normalize(); |
2456 } | 2505 } |
2457 } | 2506 } |
2458 | 2507 |
(...skipping 1234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3693 return 0; | 3742 return 0; |
3694 } | 3743 } |
3695 | 3744 |
3696 Attribute* UniqueElementData::attributeItem(unsigned index) | 3745 Attribute* UniqueElementData::attributeItem(unsigned index) |
3697 { | 3746 { |
3698 ASSERT_WITH_SECURITY_IMPLICATION(index < length()); | 3747 ASSERT_WITH_SECURITY_IMPLICATION(index < length()); |
3699 return &m_attributeVector.at(index); | 3748 return &m_attributeVector.at(index); |
3700 } | 3749 } |
3701 | 3750 |
3702 } // namespace WebCore | 3751 } // namespace WebCore |
OLD | NEW |