}
}
-void GraphicsLayerAndroid::syncCompositingState()
+void GraphicsLayerAndroid::gatherRootLayers(Vector<const RenderLayer*>& list)
{
- for (unsigned int i = 0; i < m_children.size(); i++)
- m_children[i]->syncCompositingState();
+ RenderLayer* renderLayer = renderLayerFromClient(m_client);
+ if (renderLayer) {
+ const RenderLayer* rootLayer = renderLayer->root();
+ bool found = false;
+ for (unsigned int i = 0; i < list.size(); i++) {
+ const RenderLayer* current = list[i];
+ if (current == rootLayer) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ list.append(rootLayer);
+ }
+ for (unsigned int i = 0; i < m_children.size(); i++) {
+ GraphicsLayerAndroid* layer = static_cast<GraphicsLayerAndroid*>(m_children[i]);
+ layer->gatherRootLayers(list);
+ }
+}
+
+void GraphicsLayerAndroid::syncCompositingStateForThisLayerOnly()
+{
updateScrollingLayers();
updateFixedPosition();
syncChildren();
repaint();
}
+void GraphicsLayerAndroid::syncCompositingState()
+{
+ for (unsigned int i = 0; i < m_children.size(); i++)
+ m_children[i]->syncCompositingState();
+
+ syncCompositingStateForThisLayerOnly();
+}
+
void GraphicsLayerAndroid::notifyClientAnimationStarted()
{
for (unsigned int i = 0; i < m_children.size(); i++)
virtual void setZPosition(float);
+ void gatherRootLayers(Vector<const RenderLayer*>&);
virtual void syncCompositingState();
+ virtual void syncCompositingStateForThisLayerOnly();
void notifyClientAnimationStarted();
LayerAndroid* contentLayer() { return m_contentLayer; }
#include "FrameLoader.h"
#include "FrameView.h"
#include "Geolocation.h"
+#include "GraphicsLayerAndroid.h"
#include "HTMLMediaElement.h"
#include "HTMLNames.h"
#include "Icon.h"
#include "LayerAndroid.h"
#include "Page.h"
#include "PopupMenuAndroid.h"
+#include "RenderLayer.h"
+#include "RenderLayerCompositor.h"
#include "ScriptController.h"
#include "SearchPopupMenuAndroid.h"
#include "WebCoreFrameBridge.h"
WebCore::GraphicsLayer* ChromeClientAndroid::layersSync()
{
if (m_rootGraphicsLayer && m_needsLayerSync && m_webFrame) {
- if (FrameView* frameView = m_webFrame->page()->mainFrame()->view())
+ // We may have more than one frame, so let's first update all of them
+ // (webkit may want to update the GraphicsLayer tree, and we do *not* want
+ // to find this out when we are painting, as it means we could be summarily
+ // deallocated while painting...)
+ GraphicsLayerAndroid* rootLayer = static_cast<GraphicsLayerAndroid*>(m_rootGraphicsLayer);
+ Vector<const RenderLayer*> listRootLayers;
+ rootLayer->gatherRootLayers(listRootLayers);
+
+ for (unsigned int i = 0; i < listRootLayers.size(); i++) {
+ RenderLayer* layer = const_cast<RenderLayer*>(listRootLayers[i]);
+ layer->compositor()->updateCompositingLayers();
+ }
+
+ Frame* frame = m_webFrame->page()->mainFrame();
+ if (FrameView* frameView = frame->view())
frameView->syncCompositingStateIncludingSubframes();
}
m_needsLayerSync = false;