diff options
author | Steve Block <steveblock@google.com> | 2011-05-06 11:45:16 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-05-12 13:44:10 +0100 |
commit | cad810f21b803229eb11403f9209855525a25d57 (patch) | |
tree | 29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /Source/WebCore/rendering/ShadowElement.cpp | |
parent | 121b0cf4517156d0ac5111caf9830c51b69bae8f (diff) | |
download | external_webkit-cad810f21b803229eb11403f9209855525a25d57.zip external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2 |
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'Source/WebCore/rendering/ShadowElement.cpp')
-rw-r--r-- | Source/WebCore/rendering/ShadowElement.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/Source/WebCore/rendering/ShadowElement.cpp b/Source/WebCore/rendering/ShadowElement.cpp new file mode 100644 index 0000000..e1b247c --- /dev/null +++ b/Source/WebCore/rendering/ShadowElement.cpp @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" +#include "ShadowElement.h" + +#include "HTMLNames.h" +#include "RenderTheme.h" +#include "RenderView.h" + +namespace WebCore { + +using namespace HTMLNames; + +PassRefPtr<ShadowBlockElement> ShadowBlockElement::create(HTMLElement* shadowParent) +{ + return adoptRef(new ShadowBlockElement(shadowParent)); +} + +ShadowBlockElement::ShadowBlockElement(HTMLElement* shadowParent) + : ShadowElement<HTMLDivElement>(divTag, shadowParent) +{ +} + +void ShadowBlockElement::layoutAsPart(const IntRect& partRect) +{ + RenderBox* parentRenderer = toRenderBox(renderer()->parent()); + RenderBox* selfRenderer = toRenderBox(renderer()); + IntRect oldRect = selfRenderer->frameRect(); + + LayoutStateMaintainer statePusher(parentRenderer->view(), parentRenderer, parentRenderer->size(), parentRenderer->style()->isFlippedBlocksWritingMode()); + + if (oldRect.size() != partRect.size()) + selfRenderer->setChildNeedsLayout(true, false); + + selfRenderer->layoutIfNeeded(); + selfRenderer->setFrameRect(partRect); + + if (selfRenderer->checkForRepaintDuringLayout()) + selfRenderer->repaintDuringLayoutIfMoved(oldRect); + + statePusher.pop(); + parentRenderer->addOverflowFromChild(selfRenderer); +} + +void ShadowBlockElement::updateStyleForPart(PseudoId pseudoId) +{ + if (renderer()->style()->styleType() != pseudoId) + renderer()->setStyle(createStyleForPart(renderer()->parent(), pseudoId)); +} + +PassRefPtr<ShadowBlockElement> ShadowBlockElement::createForPart(HTMLElement* shadowParent, PseudoId pseudoId) +{ + RefPtr<ShadowBlockElement> part = create(shadowParent); + part->initAsPart(pseudoId); + return part.release(); +} + +void ShadowBlockElement::initAsPart(PseudoId pseudoId) +{ + RenderObject* parentRenderer = shadowHost()->renderer(); + RefPtr<RenderStyle> styleForPart = createStyleForPart(parentRenderer, pseudoId); + setRenderer(createRenderer(parentRenderer->renderArena(), styleForPart.get())); + renderer()->setStyle(styleForPart.release()); + setAttached(); + setInDocument(); +} + +PassRefPtr<RenderStyle> ShadowBlockElement::createStyleForPart(RenderObject* parentRenderer, PseudoId pseudoId) +{ + RefPtr<RenderStyle> styleForPart; + RenderStyle* pseudoStyle = parentRenderer->getCachedPseudoStyle(pseudoId); + if (pseudoStyle) + styleForPart = RenderStyle::clone(pseudoStyle); + else + styleForPart = RenderStyle::create(); + + styleForPart->inheritFrom(parentRenderer->style()); + styleForPart->setDisplay(BLOCK); + styleForPart->setAppearance(NoControlPart); + return styleForPart.release(); +} + +bool ShadowBlockElement::partShouldHaveStyle(const RenderObject* parentRenderer, PseudoId pseudoId) +{ + // We have some -webkit-appearance values for default styles of parts and + // that appearance get turned off during RenderStyle creation + // if they have background styles specified. + // So !hasAppearance() implies that there are something to be styled. + RenderStyle* pseudoStyle = parentRenderer->getCachedPseudoStyle(pseudoId); + return !(pseudoStyle && pseudoStyle->hasAppearance()); +} + +PassRefPtr<ShadowInputElement> ShadowInputElement::create(HTMLElement* shadowParent) +{ + return adoptRef(new ShadowInputElement(shadowParent)); +} + +ShadowInputElement::ShadowInputElement(HTMLElement* shadowParent) + : ShadowElement<HTMLInputElement>(inputTag, shadowParent) +{ +} + +} // namespace WebCore |