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. | 7 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. |
8 * All rights reserved. | 8 * All rights reserved. |
9 * (C) 2007 Eric Seidel (eric@webkit.org) | 9 * (C) 2007 Eric Seidel (eric@webkit.org) |
10 * | 10 * |
(...skipping 3243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3254 PseudoElement* element = pseudoElement(pseudoId); | 3254 PseudoElement* element = pseudoElement(pseudoId); |
3255 | 3255 |
3256 if (element && (change == UpdatePseudoElements || | 3256 if (element && (change == UpdatePseudoElements || |
3257 element->shouldCallRecalcStyle(change))) { | 3257 element->shouldCallRecalcStyle(change))) { |
3258 if (pseudoId == PseudoIdFirstLetter && updateFirstLetter(element)) | 3258 if (pseudoId == PseudoIdFirstLetter && updateFirstLetter(element)) |
3259 return; | 3259 return; |
3260 | 3260 |
3261 // Need to clear the cached style if the PseudoElement wants a recalc so it | 3261 // Need to clear the cached style if the PseudoElement wants a recalc so it |
3262 // computes a new style. | 3262 // computes a new style. |
3263 if (element->needsStyleRecalc()) | 3263 if (element->needsStyleRecalc()) |
3264 layoutObject()->mutableStyle()->removeCachedPseudoStyle(pseudoId); | 3264 mutableComputedStyle()->removeCachedPseudoStyle(pseudoId); |
3265 | 3265 |
3266 // PseudoElement styles hang off their parent element's style so if we | 3266 // PseudoElement styles hang off their parent element's style so if we |
3267 // needed a style recalc we should Force one on the pseudo. FIXME: We | 3267 // needed a style recalc we should Force one on the pseudo. FIXME: We |
3268 // should figure out the right text sibling to pass. | 3268 // should figure out the right text sibling to pass. |
3269 element->recalcStyle(change == UpdatePseudoElements ? Force : change); | 3269 element->recalcStyle(change == UpdatePseudoElements ? Force : change); |
3270 | 3270 |
3271 // Wait until our parent is not displayed or | 3271 // Wait until our parent is not displayed or |
3272 // pseudoElementLayoutObjectIsNeeded is false, otherwise we could | 3272 // pseudoElementLayoutObjectIsNeeded is false, otherwise we could |
3273 // continuously create and destroy PseudoElements when | 3273 // continuously create and destroy PseudoElements when |
3274 // LayoutObject::isChildAllowed on our parent returns false for the | 3274 // LayoutObject::isChildAllowed on our parent returns false for the |
3275 // PseudoElement's layoutObject for each style recalc. | 3275 // PseudoElement's layoutObject for each style recalc. |
3276 if (!layoutObject() || | 3276 if (!layoutObject() || !pseudoElementLayoutObjectIsNeeded( |
3277 !pseudoElementLayoutObjectIsNeeded( | 3277 pseudoStyle(PseudoStyleRequest(pseudoId)))) |
3278 layoutObject()->getCachedPseudoStyle(pseudoId))) | |
3279 elementRareData()->setPseudoElement(pseudoId, nullptr); | 3278 elementRareData()->setPseudoElement(pseudoId, nullptr); |
3280 } else if (pseudoId == PseudoIdFirstLetter && element && | 3279 } else if (pseudoId == PseudoIdFirstLetter && element && |
3281 change >= UpdatePseudoElements && | 3280 change >= UpdatePseudoElements && |
3282 !FirstLetterPseudoElement::firstLetterTextLayoutObject(*element)) { | 3281 !FirstLetterPseudoElement::firstLetterTextLayoutObject(*element)) { |
3283 // This can happen if we change to a float, for example. We need to cleanup | 3282 // This can happen if we change to a float, for example. We need to cleanup |
3284 // the first-letter pseudoElement and then fix the text of the original | 3283 // the first-letter pseudoElement and then fix the text of the original |
3285 // remaining text layoutObject. This can be seen in Test 7 of | 3284 // remaining text layoutObject. This can be seen in Test 7 of |
3286 // fast/css/first-letter-removed-added.html | 3285 // fast/css/first-letter-removed-added.html |
3287 elementRareData()->setPseudoElement(pseudoId, nullptr); | 3286 elementRareData()->setPseudoElement(pseudoId, nullptr); |
3288 } else if (change >= UpdatePseudoElements) { | 3287 } else if (change >= UpdatePseudoElements) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3337 PseudoElement* Element::pseudoElement(PseudoId pseudoId) const { | 3336 PseudoElement* Element::pseudoElement(PseudoId pseudoId) const { |
3338 return hasRareData() ? elementRareData()->pseudoElement(pseudoId) : nullptr; | 3337 return hasRareData() ? elementRareData()->pseudoElement(pseudoId) : nullptr; |
3339 } | 3338 } |
3340 | 3339 |
3341 LayoutObject* Element::pseudoElementLayoutObject(PseudoId pseudoId) const { | 3340 LayoutObject* Element::pseudoElementLayoutObject(PseudoId pseudoId) const { |
3342 if (PseudoElement* element = pseudoElement(pseudoId)) | 3341 if (PseudoElement* element = pseudoElement(pseudoId)) |
3343 return element->layoutObject(); | 3342 return element->layoutObject(); |
3344 return nullptr; | 3343 return nullptr; |
3345 } | 3344 } |
3346 | 3345 |
| 3346 ComputedStyle* Element::pseudoStyle(const PseudoStyleRequest& request, |
| 3347 const ComputedStyle* parentStyle) { |
| 3348 ComputedStyle* style = mutableComputedStyle(); |
| 3349 |
| 3350 if (!style || (request.pseudoId < FirstInternalPseudoId && |
| 3351 !style->hasPseudoStyle(request.pseudoId))) { |
| 3352 return nullptr; |
| 3353 } |
| 3354 |
| 3355 if (ComputedStyle* cached = style->getCachedPseudoStyle(request.pseudoId)) |
| 3356 return cached; |
| 3357 |
| 3358 RefPtr<ComputedStyle> result = getUncachedPseudoStyle(request, parentStyle); |
| 3359 if (result) |
| 3360 return style->addCachedPseudoStyle(result.release()); |
| 3361 return nullptr; |
| 3362 } |
| 3363 |
| 3364 PassRefPtr<ComputedStyle> Element::getUncachedPseudoStyle( |
| 3365 const PseudoStyleRequest& request, |
| 3366 const ComputedStyle* parentStyle) { |
| 3367 const ComputedStyle* style = computedStyle(); |
| 3368 const bool isBeforeOrAfter = |
| 3369 request.pseudoId == PseudoIdBefore || request.pseudoId == PseudoIdAfter; |
| 3370 |
| 3371 DCHECK(style); |
| 3372 DCHECK(!parentStyle || !isBeforeOrAfter); |
| 3373 |
| 3374 if (isBeforeOrAfter) { |
| 3375 LayoutObject* parentLayoutObject = layoutObject(); |
| 3376 if (!parentLayoutObject && hasDisplayContentsStyle()) { |
| 3377 parentLayoutObject = |
| 3378 LayoutTreeBuilderTraversal::parentLayoutObject(*this); |
| 3379 } |
| 3380 if (!parentLayoutObject) |
| 3381 return nullptr; |
| 3382 return document().ensureStyleResolver().pseudoStyleForElement( |
| 3383 this, request, style, parentLayoutObject->style()); |
| 3384 } |
| 3385 |
| 3386 if (!layoutObject()) |
| 3387 return nullptr; |
| 3388 |
| 3389 if (!parentStyle) |
| 3390 parentStyle = style; |
| 3391 |
| 3392 if (request.pseudoId == PseudoIdFirstLineInherited) { |
| 3393 RefPtr<ComputedStyle> result = |
| 3394 document().ensureStyleResolver().styleForElement( |
| 3395 this, parentStyle, parentStyle, DisallowStyleSharing); |
| 3396 result->setStyleType(PseudoIdFirstLineInherited); |
| 3397 return result.release(); |
| 3398 } |
| 3399 |
| 3400 return document().ensureStyleResolver().pseudoStyleForElement( |
| 3401 this, request, parentStyle, parentStyle); |
| 3402 } |
| 3403 |
3347 bool Element::matches(const AtomicString& selectors, | 3404 bool Element::matches(const AtomicString& selectors, |
3348 ExceptionState& exceptionState) { | 3405 ExceptionState& exceptionState) { |
3349 SelectorQuery* selectorQuery = document().selectorQueryCache().add( | 3406 SelectorQuery* selectorQuery = document().selectorQueryCache().add( |
3350 selectors, document(), exceptionState); | 3407 selectors, document(), exceptionState); |
3351 if (!selectorQuery) | 3408 if (!selectorQuery) |
3352 return false; | 3409 return false; |
3353 return selectorQuery->matches(*this); | 3410 return selectorQuery->matches(*this); |
3354 } | 3411 } |
3355 | 3412 |
3356 Element* Element::closest(const AtomicString& selectors, | 3413 Element* Element::closest(const AtomicString& selectors, |
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4171 } | 4228 } |
4172 | 4229 |
4173 DEFINE_TRACE_WRAPPERS(Element) { | 4230 DEFINE_TRACE_WRAPPERS(Element) { |
4174 if (hasRareData()) { | 4231 if (hasRareData()) { |
4175 visitor->traceWrappers(elementRareData()); | 4232 visitor->traceWrappers(elementRareData()); |
4176 } | 4233 } |
4177 ContainerNode::traceWrappers(visitor); | 4234 ContainerNode::traceWrappers(visitor); |
4178 } | 4235 } |
4179 | 4236 |
4180 } // namespace blink | 4237 } // namespace blink |
OLD | NEW |