summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/rendering/ShadowElement.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-06 11:45:16 +0100
committerSteve Block <steveblock@google.com>2011-05-12 13:44:10 +0100
commitcad810f21b803229eb11403f9209855525a25d57 (patch)
tree29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /Source/WebCore/rendering/ShadowElement.cpp
parent121b0cf4517156d0ac5111caf9830c51b69bae8f (diff)
downloadexternal_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.cpp121
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