summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderLayerModelObject.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
commit8995b83bcbfbb68245f779b64e5517627c6cc6ea (patch)
tree17985605dab9263cc2444bd4d45f189e142cca7c /Source/WebCore/rendering/RenderLayerModelObject.cpp
parentb9c9652036d5e9f1e29c574f40bc73a35c81ace6 (diff)
downloadqtwebkit-8995b83bcbfbb68245f779b64e5517627c6cc6ea.tar.gz
Imported WebKit commit cf4f8fc6f19b0629f51860cb2d4b25e139d07e00 (http://svn.webkit.org/repository/webkit/trunk@131592)
New snapshot that includes the build fixes for Mac OS X 10.6 and earlier as well as the previously cherry-picked changes
Diffstat (limited to 'Source/WebCore/rendering/RenderLayerModelObject.cpp')
-rw-r--r--Source/WebCore/rendering/RenderLayerModelObject.cpp178
1 files changed, 178 insertions, 0 deletions
diff --git a/Source/WebCore/rendering/RenderLayerModelObject.cpp b/Source/WebCore/rendering/RenderLayerModelObject.cpp
new file mode 100644
index 000000000..aeb32b7a2
--- /dev/null
+++ b/Source/WebCore/rendering/RenderLayerModelObject.cpp
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
+ * (C) 1999 Antti Koivisto (koivisto@kde.org)
+ * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
+ * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
+ * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2012 Google 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 "RenderLayerModelObject.h"
+
+#include "RenderLayer.h"
+#include "RenderView.h"
+
+using namespace std;
+
+namespace WebCore {
+
+bool RenderLayerModelObject::s_wasFloating = false;
+bool RenderLayerModelObject::s_hadLayer = false;
+bool RenderLayerModelObject::s_hadTransform = false;
+bool RenderLayerModelObject::s_layerWasSelfPainting = false;
+
+RenderLayerModelObject::RenderLayerModelObject(Node* node)
+ : RenderObject(node)
+ , m_layer(0)
+{
+}
+
+RenderLayerModelObject::~RenderLayerModelObject()
+{
+ // Our layer should have been destroyed and cleared by now
+ ASSERT(!hasLayer());
+ ASSERT(!m_layer);
+}
+
+void RenderLayerModelObject::destroyLayer()
+{
+ ASSERT(!hasLayer()); // Callers should have already called setHasLayer(false)
+ ASSERT(m_layer);
+ m_layer->destroy(renderArena());
+ m_layer = 0;
+}
+
+void RenderLayerModelObject::ensureLayer()
+{
+ if (m_layer)
+ return;
+
+ m_layer = new (renderArena()) RenderLayer(this);
+ setHasLayer(true);
+ m_layer->insertOnlyThisLayer();
+}
+
+bool RenderLayerModelObject::hasSelfPaintingLayer() const
+{
+ return m_layer && m_layer->isSelfPaintingLayer();
+}
+
+void RenderLayerModelObject::willBeDestroyed()
+{
+ // RenderObject::willBeDestroyed calls back to destroyLayer() for layer destruction
+ RenderObject::willBeDestroyed();
+}
+
+void RenderLayerModelObject::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
+{
+ s_wasFloating = isFloating();
+ s_hadLayer = hasLayer();
+ s_hadTransform = hasTransform();
+ if (s_hadLayer)
+ s_layerWasSelfPainting = layer()->isSelfPaintingLayer();
+
+ // If our z-index changes value or our visibility changes,
+ // we need to dirty our stacking context's z-order list.
+ RenderStyle* oldStyle = style();
+ if (oldStyle && newStyle) {
+ if (parent()) {
+ // Do a repaint with the old style first, e.g., for example if we go from
+ // having an outline to not having an outline.
+ if (diff == StyleDifferenceRepaintLayer) {
+ layer()->repaintIncludingDescendants();
+ if (!(oldStyle->clip() == newStyle->clip()))
+ layer()->clearClipRectsIncludingDescendants();
+ } else if (diff == StyleDifferenceRepaint || newStyle->outlineSize() < oldStyle->outlineSize())
+ repaint();
+ }
+
+ if (diff == StyleDifferenceLayout || diff == StyleDifferenceSimplifiedLayout) {
+ // When a layout hint happens, we go ahead and do a repaint of the layer, since the layer could
+ // end up being destroyed.
+ if (hasLayer()) {
+ if (oldStyle->position() != newStyle->position()
+ || oldStyle->zIndex() != newStyle->zIndex()
+ || oldStyle->hasAutoZIndex() != newStyle->hasAutoZIndex()
+ || !(oldStyle->clip() == newStyle->clip())
+ || oldStyle->hasClip() != newStyle->hasClip()
+ || oldStyle->opacity() != newStyle->opacity()
+ || oldStyle->transform() != newStyle->transform()
+#if ENABLE(CSS_FILTERS)
+ || oldStyle->filter() != newStyle->filter()
+#endif
+ )
+ layer()->repaintIncludingDescendants();
+ } else if (newStyle->hasTransform() || newStyle->opacity() < 1 || newStyle->hasFilter()) {
+ // If we don't have a layer yet, but we are going to get one because of transform or opacity,
+ // then we need to repaint the old position of the object.
+ repaint();
+ }
+ }
+ }
+
+ RenderObject::styleWillChange(diff, newStyle);
+}
+
+void RenderLayerModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
+{
+ RenderObject::styleDidChange(diff, oldStyle);
+ updateFromStyle();
+
+ if (requiresLayer()) {
+ if (!layer() && layerCreationAllowedForSubtree()) {
+ if (s_wasFloating && isFloating())
+ setChildNeedsLayout(true);
+ ensureLayer();
+ if (parent() && !needsLayout() && containingBlock()) {
+ layer()->setRepaintStatus(NeedsFullRepaint);
+ // There is only one layer to update, it is not worth using |cachedOffset| since
+ // we are not sure the value will be used.
+ layer()->updateLayerPositions(0);
+ }
+ }
+ } else if (layer() && layer()->parent()) {
+ setHasTransform(false); // Either a transform wasn't specified or the object doesn't support transforms, so just null out the bit.
+ setHasReflection(false);
+ layer()->removeOnlyThisLayer(); // calls destroyLayer() which clears m_layer
+ if (s_wasFloating && isFloating())
+ setChildNeedsLayout(true);
+ if (s_hadTransform)
+ setNeedsLayoutAndPrefWidthsRecalc();
+ }
+
+ if (layer()) {
+ layer()->styleChanged(diff, oldStyle);
+ if (s_hadLayer && layer()->isSelfPaintingLayer() != s_layerWasSelfPainting)
+ setChildNeedsLayout(true);
+ }
+
+ if (FrameView *frameView = view()->frameView()) {
+ bool newStyleIsViewportConstained = style()->hasViewportConstrainedPosition();
+ bool oldStyleIsViewportConstrained = oldStyle && oldStyle->hasViewportConstrainedPosition();
+ if (newStyleIsViewportConstained != oldStyleIsViewportConstrained) {
+ if (newStyleIsViewportConstained && layer())
+ frameView->addViewportConstrainedObject(this);
+ else
+ frameView->removeViewportConstrainedObject(this);
+ }
+ }
+}
+
+} // namespace WebCore
+