Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / web / WebPopupMenuImpl.cpp
index 91dc658..06d36f4 100644 (file)
 #include "platform/graphics/GraphicsContext.h"
 #include "platform/graphics/skia/SkiaUtils.h"
 #include "platform/scroll/FramelessScrollView.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebCompositorSupport.h"
+#include "public/platform/WebContentLayer.h"
+#include "public/platform/WebLayerTreeView.h"
 #include "public/platform/WebRect.h"
 #include <skia/ext/platform_canvas.h>
 
@@ -68,6 +72,8 @@ WebPopupMenu* WebPopupMenu::create(WebWidgetClient* client)
 
 WebPopupMenuImpl::WebPopupMenuImpl(WebWidgetClient* client)
     : m_client(client)
+    , m_layerTreeView(0)
+    , m_isAcceleratedCompositingActive(false)
     // Set to impossible point so we always get the first mouse position.
     , m_lastMousePosition(WebPoint(-1, -1))
     , m_widget(0)
@@ -80,6 +86,12 @@ WebPopupMenuImpl::~WebPopupMenuImpl()
         m_widget->setClient(0);
 }
 
+void WebPopupMenuImpl::willCloseLayerTreeView()
+{
+    enterForceCompositingMode(false);
+    m_layerTreeView = 0;
+}
+
 void WebPopupMenuImpl::initialize(FramelessScrollView* widget, const WebRect& bounds)
 {
     m_widget = widget;
@@ -99,7 +111,7 @@ void WebPopupMenuImpl::handleMouseMove(const WebMouseEvent& event)
         m_widget->handleMouseMoveEvent(PlatformMouseEventBuilder(m_widget, event));
 
         // We cannot call setToolTipText() in PopupContainer, because PopupContainer is in WebCore, and we cannot refer to WebKit from Webcore.
-        WebCore::PopupContainer* container = static_cast<WebCore::PopupContainer*>(m_widget);
+        PopupContainer* container = static_cast<PopupContainer*>(m_widget);
         client()->setToolTipText(container->getSelectedItemToolTip(), container->menuStyle().textDirection() == WebCore::RTL ? WebTextDirectionRightToLeft : WebTextDirectionLeftToRight);
     }
 }
@@ -174,6 +186,9 @@ void WebPopupMenuImpl::resize(const WebSize& newSize)
         WebRect damagedRect(0, 0, m_size.width, m_size.height);
         m_client->didInvalidateRect(damagedRect);
     }
+
+    if (m_rootLayer)
+        m_rootLayer->layer()->setBounds(newSize);
 }
 
 void WebPopupMenuImpl::willEndLiveResize()
@@ -188,6 +203,54 @@ void WebPopupMenuImpl::layout()
 {
 }
 
+void WebPopupMenuImpl::enterForceCompositingMode(bool enter)
+{
+    if (m_isAcceleratedCompositingActive == enter)
+        return;
+
+    if (!enter) {
+        m_isAcceleratedCompositingActive = false;
+        m_client->didDeactivateCompositor();
+    } else if (m_layerTreeView) {
+        m_isAcceleratedCompositingActive = true;
+        m_client->didActivateCompositor(0);
+    } else {
+        TRACE_EVENT0("webkit", "WebPopupMenuImpl::enterForceCompositingMode(true)");
+
+        m_client->initializeLayerTreeView();
+        m_layerTreeView = m_client->layerTreeView();
+        if (m_layerTreeView) {
+            m_layerTreeView->setVisible(true);
+            m_client->didActivateCompositor(0);
+            m_isAcceleratedCompositingActive = true;
+            m_layerTreeView->setDeviceScaleFactor(m_client->deviceScaleFactor());
+            m_rootLayer = adoptPtr(Platform::current()->compositorSupport()->createContentLayer(this));
+            m_rootLayer->layer()->setBounds(m_size);
+            m_layerTreeView->setRootLayer(*m_rootLayer->layer());
+        } else {
+            m_isAcceleratedCompositingActive = false;
+            m_client->didDeactivateCompositor();
+        }
+    }
+}
+
+void WebPopupMenuImpl::didExitCompositingMode()
+{
+    enterForceCompositingMode(false);
+    m_client->didInvalidateRect(IntRect(0, 0, m_size.width, m_size.height));
+}
+
+void WebPopupMenuImpl::paintContents(WebCanvas* canvas, const WebRect& rect, bool, WebFloatRect&)
+{
+    if (!m_widget)
+        return;
+
+    if (!rect.isEmpty()) {
+        GraphicsContext context(canvas);
+        m_widget->paint(&context, rect);
+    }
+}
+
 void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions)
 {
     if (!m_widget)
@@ -290,11 +353,6 @@ void WebPopupMenuImpl::setFocus(bool)
 {
 }
 
-void WebPopupMenu::setMinimumRowHeight(int minimumRowHeight)
-{
-    PopupMenuChromium::setMinimumRowHeight(minimumRowHeight);
-}
-
 bool WebPopupMenuImpl::setComposition(const WebString&, const WebVector<WebCompositionUnderline>&, int, int)
 {
     return false;
@@ -343,6 +401,8 @@ void WebPopupMenuImpl::invalidateContentsAndRootView(const IntRect& paintRect)
         return;
     if (m_client)
         m_client->didInvalidateRect(paintRect);
+    if (m_rootLayer)
+        m_rootLayer->layer()->invalidateRect(FloatRect(paintRect));
 }
 
 void WebPopupMenuImpl::invalidateContentsForSlowScroll(const IntRect& updateRect)
@@ -361,12 +421,8 @@ void WebPopupMenuImpl::scroll(const IntSize& scrollDelta, const IntRect& scrollR
         int dy = scrollDelta.height();
         m_client->didScrollRect(dx, dy, clipRect);
     }
-}
-
-IntPoint WebPopupMenuImpl::screenToRootView(const IntPoint& point) const
-{
-    notImplemented();
-    return IntPoint();
+    if (m_rootLayer)
+        m_rootLayer->layer()->invalidateRect(FloatRect(clipRect));
 }
 
 IntRect WebPopupMenuImpl::rootViewToScreen(const IntRect& rect) const