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 26 matching lines...) Expand all Loading... |
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/events/EventDispatcher.h" | 56 #include "core/events/EventDispatcher.h" |
56 #include "core/dom/ExceptionCode.h" | 57 #include "core/dom/ExceptionCode.h" |
(...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1322 if (hasRareData() && styleChangeType() == LazyAttachStyleChange) { | 1323 if (hasRareData() && styleChangeType() == LazyAttachStyleChange) { |
1323 ElementRareData* data = elementRareData(); | 1324 ElementRareData* data = elementRareData(); |
1324 data->clearComputedStyle(); | 1325 data->clearComputedStyle(); |
1325 data->resetDynamicRestyleObservations(); | 1326 data->resetDynamicRestyleObservations(); |
1326 if (!context.resolvedStyle) | 1327 if (!context.resolvedStyle) |
1327 data->resetStyleState(); | 1328 data->resetStyleState(); |
1328 } | 1329 } |
1329 | 1330 |
1330 NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIf
Needed(); | 1331 NodeRenderingContext(this, context.resolvedStyle).createRendererForElementIf
Needed(); |
1331 | 1332 |
| 1333 if (RenderStyle* style = renderStyle()) |
| 1334 updateCallbackSelectors(0, style); |
| 1335 |
1332 createPseudoElementIfNeeded(BEFORE); | 1336 createPseudoElementIfNeeded(BEFORE); |
1333 | 1337 |
1334 // When a shadow root exists, it does the work of attaching the children. | 1338 // When a shadow root exists, it does the work of attaching the children. |
1335 if (ElementShadow* shadow = this->shadow()) { | 1339 if (ElementShadow* shadow = this->shadow()) { |
1336 parentPusher.push(); | 1340 parentPusher.push(); |
1337 shadow->attach(context); | 1341 shadow->attach(context); |
1338 } else if (firstChild()) | 1342 } else if (firstChild()) |
1339 parentPusher.push(); | 1343 parentPusher.push(); |
1340 | 1344 |
1341 ContainerNode::attach(context); | 1345 ContainerNode::attach(context); |
(...skipping 17 matching lines...) Expand all Loading... |
1359 { | 1363 { |
1360 if (RuntimeEnabledFeatures::cssRegionsEnabled() && inNamedFlow() && document
().renderView()) | 1364 if (RuntimeEnabledFeatures::cssRegionsEnabled() && inNamedFlow() && document
().renderView()) |
1361 document().renderView()->flowThreadController()->unregisterNamedFlowCont
entNode(this); | 1365 document().renderView()->flowThreadController()->unregisterNamedFlowCont
entNode(this); |
1362 } | 1366 } |
1363 | 1367 |
1364 void Element::detach(const AttachContext& context) | 1368 void Element::detach(const AttachContext& context) |
1365 { | 1369 { |
1366 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; | 1370 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; |
1367 unregisterNamedFlowContentNode(); | 1371 unregisterNamedFlowContentNode(); |
1368 cancelFocusAppearanceUpdate(); | 1372 cancelFocusAppearanceUpdate(); |
| 1373 if (RenderStyle* style = renderStyle()) { |
| 1374 if (!style->callbackSelectors().isEmpty()) |
| 1375 updateCallbackSelectors(style, 0); |
| 1376 } |
1369 if (hasRareData()) { | 1377 if (hasRareData()) { |
1370 ElementRareData* data = elementRareData(); | 1378 ElementRareData* data = elementRareData(); |
1371 data->setPseudoElement(BEFORE, 0); | 1379 data->setPseudoElement(BEFORE, 0); |
1372 data->setPseudoElement(AFTER, 0); | 1380 data->setPseudoElement(AFTER, 0); |
1373 data->setPseudoElement(BACKDROP, 0); | 1381 data->setPseudoElement(BACKDROP, 0); |
1374 data->clearComputedStyle(); | 1382 data->clearComputedStyle(); |
1375 data->resetDynamicRestyleObservations(); | 1383 data->resetDynamicRestyleObservations(); |
1376 data->setIsInsideRegion(false); | 1384 data->setIsInsideRegion(false); |
1377 | 1385 |
1378 // Only clear the style state if we're not going to reuse the style from
recalcStyle. | 1386 // Only clear the style state if we're not going to reuse the style from
recalcStyle. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1465 | 1473 |
1466 clearNeedsStyleRecalc(); | 1474 clearNeedsStyleRecalc(); |
1467 clearChildNeedsStyleRecalc(); | 1475 clearChildNeedsStyleRecalc(); |
1468 | 1476 |
1469 if (hasCustomStyleCallbacks()) | 1477 if (hasCustomStyleCallbacks()) |
1470 didRecalcStyle(change); | 1478 didRecalcStyle(change); |
1471 | 1479 |
1472 return change == Reattach; | 1480 return change == Reattach; |
1473 } | 1481 } |
1474 | 1482 |
| 1483 static bool callbackSelectorsDiffer(RenderStyle* style1, RenderStyle* style2) |
| 1484 { |
| 1485 const Vector<String> emptyVector; |
| 1486 const Vector<String>& callbackSelectors1 = style1 ? style1->callbackSelector
s() : emptyVector; |
| 1487 const Vector<String>& callbackSelectors2 = style2 ? style2->callbackSelector
s() : emptyVector; |
| 1488 if (callbackSelectors1.isEmpty() && callbackSelectors2.isEmpty()) { |
| 1489 // Help the inliner with this common case. |
| 1490 return false; |
| 1491 } |
| 1492 return callbackSelectors1 != callbackSelectors2; |
| 1493 } |
| 1494 |
1475 StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) | 1495 StyleRecalcChange Element::recalcOwnStyle(StyleRecalcChange change) |
1476 { | 1496 { |
1477 ASSERT(document().inStyleRecalc()); | 1497 ASSERT(document().inStyleRecalc()); |
1478 | 1498 |
1479 CSSAnimationUpdateScope cssAnimationUpdateScope(this); | 1499 CSSAnimationUpdateScope cssAnimationUpdateScope(this); |
1480 RefPtr<RenderStyle> oldStyle = renderStyle(); | 1500 RefPtr<RenderStyle> oldStyle = renderStyle(); |
1481 RefPtr<RenderStyle> newStyle = styleForRenderer(); | 1501 RefPtr<RenderStyle> newStyle = styleForRenderer(); |
1482 StyleRecalcChange localChange = RenderStyle::compare(oldStyle.get(), newStyl
e.get()); | 1502 StyleRecalcChange localChange = RenderStyle::compare(oldStyle.get(), newStyl
e.get()); |
1483 | 1503 |
1484 if (localChange == Reattach) { | 1504 if (localChange == Reattach) { |
1485 AttachContext reattachContext; | 1505 AttachContext reattachContext; |
1486 reattachContext.resolvedStyle = newStyle.get(); | 1506 reattachContext.resolvedStyle = newStyle.get(); |
1487 reattach(reattachContext); | 1507 reattach(reattachContext); |
1488 return Reattach; | 1508 return Reattach; |
1489 } | 1509 } |
1490 | 1510 |
1491 InspectorInstrumentation::didRecalculateStyleForElement(this); | 1511 InspectorInstrumentation::didRecalculateStyleForElement(this); |
1492 | 1512 |
| 1513 if (localChange != NoChange && callbackSelectorsDiffer(oldStyle.get(), newSt
yle.get())) |
| 1514 updateCallbackSelectors(oldStyle.get(), newStyle.get()); |
| 1515 |
1493 if (RenderObject* renderer = this->renderer()) { | 1516 if (RenderObject* renderer = this->renderer()) { |
1494 if (localChange != NoChange || pseudoStyleCacheIsInvalid(oldStyle.get(),
newStyle.get()) || (change == Force && renderer->requiresForcedStyleRecalcPropa
gation()) || shouldNotifyRendererWithIdenticalStyles()) { | 1517 if (localChange != NoChange || pseudoStyleCacheIsInvalid(oldStyle.get(),
newStyle.get()) || (change == Force && renderer->requiresForcedStyleRecalcPropa
gation()) || shouldNotifyRendererWithIdenticalStyles()) { |
1495 renderer->setAnimatableStyle(newStyle.get()); | 1518 renderer->setAnimatableStyle(newStyle.get()); |
1496 } else if (needsStyleRecalc()) { | 1519 } else if (needsStyleRecalc()) { |
1497 // Although no change occurred, we use the new style so that the cou
sin style sharing code won't get | 1520 // Although no change occurred, we use the new style so that the cou
sin style sharing code won't get |
1498 // fooled into believing this style is the same. | 1521 // fooled into believing this style is the same. |
1499 renderer->setStyleInternal(newStyle.get()); | 1522 renderer->setStyleInternal(newStyle.get()); |
1500 } | 1523 } |
1501 } | 1524 } |
1502 | 1525 |
(...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2427 } | 2450 } |
2428 | 2451 |
2429 void Element::cancelFocusAppearanceUpdate() | 2452 void Element::cancelFocusAppearanceUpdate() |
2430 { | 2453 { |
2431 if (hasRareData()) | 2454 if (hasRareData()) |
2432 elementRareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(false); | 2455 elementRareData()->setNeedsFocusAppearanceUpdateSoonAfterAttach(false); |
2433 if (document().focusedElement() == this) | 2456 if (document().focusedElement() == this) |
2434 document().cancelFocusAppearanceUpdate(); | 2457 document().cancelFocusAppearanceUpdate(); |
2435 } | 2458 } |
2436 | 2459 |
| 2460 void Element::updateCallbackSelectors(RenderStyle* oldStyle, RenderStyle* newSty
le) |
| 2461 { |
| 2462 const Vector<String> emptyVector; |
| 2463 const Vector<String>& oldCallbackSelectors = oldStyle ? oldStyle->callbackSe
lectors() : emptyVector; |
| 2464 const Vector<String>& newCallbackSelectors = newStyle ? newStyle->callbackSe
lectors() : emptyVector; |
| 2465 |
| 2466 CSSSelectorWatch::from(document()).updateSelectorMatches(oldCallbackSelector
s, newCallbackSelectors); |
| 2467 } |
| 2468 |
2437 void Element::normalizeAttributes() | 2469 void Element::normalizeAttributes() |
2438 { | 2470 { |
2439 if (!hasAttributes()) | 2471 if (!hasAttributes()) |
2440 return; | 2472 return; |
2441 for (unsigned i = 0; i < attributeCount(); ++i) { | 2473 for (unsigned i = 0; i < attributeCount(); ++i) { |
2442 if (RefPtr<Attr> attr = attrIfExists(attributeItem(i)->name())) | 2474 if (RefPtr<Attr> attr = attrIfExists(attributeItem(i)->name())) |
2443 attr->normalize(); | 2475 attr->normalize(); |
2444 } | 2476 } |
2445 } | 2477 } |
2446 | 2478 |
(...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3642 return 0; | 3674 return 0; |
3643 } | 3675 } |
3644 | 3676 |
3645 Attribute* UniqueElementData::attributeItem(unsigned index) | 3677 Attribute* UniqueElementData::attributeItem(unsigned index) |
3646 { | 3678 { |
3647 ASSERT_WITH_SECURITY_IMPLICATION(index < length()); | 3679 ASSERT_WITH_SECURITY_IMPLICATION(index < length()); |
3648 return &m_attributeVector.at(index); | 3680 return &m_attributeVector.at(index); |
3649 } | 3681 } |
3650 | 3682 |
3651 } // namespace WebCore | 3683 } // namespace WebCore |
OLD | NEW |