summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjbauman@chromium.org <jbauman@chromium.org>2014-01-29 00:14:45 +0000
committerPierre Rossi <pierre.rossi@gmail.com>2014-03-31 10:50:42 +0200
commitb3c9bb0a1f3eae80103ddcd84b57caf6843ae174 (patch)
tree80c88031ba78b12d5cca073ea27ef34c6bdce64b
parenta6014652040e76de08e643b49b69fc97cb5bfd62 (diff)
downloadqtwebengine-chromium-b3c9bb0a1f3eae80103ddcd84b57caf6843ae174.tar.gz
[Backport] Use compositor with select popups.
BUG=271575 Review URL: https://codereview.chromium.org/132173005 git-svn-id: svn://svn.chromium.org/blink/trunk@165977 bbb929c8-8fbe-4397-9dbb-9b2b20218538 Change-Id: I78b3354b1040b193c984b82db51c90b8183ebd24 Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
-rw-r--r--chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.cpp69
-rw-r--r--chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.h59
2 files changed, 104 insertions, 24 deletions
diff --git a/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.cpp b/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.cpp
index 05c1d05281a..e8adfd7c0df 100644
--- a/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.cpp
+++ b/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.cpp
@@ -49,6 +49,10 @@
#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,10 @@ 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)
{
// Set to impossible point so we always get the first mouse position.
@@ -80,6 +88,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;
@@ -174,6 +188,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 +205,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)
@@ -343,6 +408,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,6 +428,8 @@ void WebPopupMenuImpl::scroll(const IntSize& scrollDelta, const IntRect& scrollR
int dy = scrollDelta.height();
m_client->didScrollRect(dx, dy, clipRect);
}
+ if (m_rootLayer)
+ m_rootLayer->layer()->invalidateRect(FloatRect(clipRect));
}
IntPoint WebPopupMenuImpl::screenToRootView(const IntPoint& point) const
diff --git a/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.h b/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.h
index e5777bea8ce..0384675c75e 100644
--- a/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.h
+++ b/chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.h
@@ -33,6 +33,7 @@
#include "WebPopupMenu.h"
#include "platform/scroll/FramelessScrollViewClient.h"
+#include "public/platform/WebContentLayerClient.h"
#include "public/platform/WebPoint.h"
#include "public/platform/WebSize.h"
#include "wtf/OwnPtr.h"
@@ -49,44 +50,50 @@ class Widget;
}
namespace blink {
+class WebContentLayer;
class WebGestureEvent;
class WebKeyboardEvent;
+class WebLayerTreeView;
class WebMouseEvent;
class WebMouseWheelEvent;
class WebRange;
struct WebRect;
class WebTouchEvent;
-class WebPopupMenuImpl : public WebPopupMenu,
- public WebCore::FramelessScrollViewClient,
- public RefCounted<WebPopupMenuImpl> {
+class WebPopupMenuImpl : public WebPopupMenu, public WebCore::FramelessScrollViewClient, public WebContentLayerClient, public RefCounted<WebPopupMenuImpl> {
WTF_MAKE_FAST_ALLOCATED;
public:
// WebWidget functions:
- virtual void close() OVERRIDE;
- virtual WebSize size() OVERRIDE { return m_size; }
- virtual void willStartLiveResize() OVERRIDE;
- virtual void resize(const WebSize&) OVERRIDE;
- virtual void willEndLiveResize() OVERRIDE;
- virtual void animate(double frameBeginTime) OVERRIDE;
- virtual void layout() OVERRIDE;
- virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE;
- virtual void themeChanged() OVERRIDE;
- virtual bool handleInputEvent(const WebInputEvent&) OVERRIDE;
- virtual void mouseCaptureLost() OVERRIDE;
- virtual void setFocus(bool enable) OVERRIDE;
+ virtual void close() OVERRIDE FINAL;
+ virtual WebSize size() OVERRIDE FINAL { return m_size; }
+ virtual void willStartLiveResize() OVERRIDE FINAL;
+ virtual void resize(const WebSize&) OVERRIDE FINAL;
+ virtual void willEndLiveResize() OVERRIDE FINAL;
+ virtual void animate(double frameBeginTime) OVERRIDE FINAL;
+ virtual void layout() OVERRIDE FINAL;
+ virtual void enterForceCompositingMode(bool enable) OVERRIDE FINAL;
+ virtual void didExitCompositingMode() OVERRIDE FINAL;
+ virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE FINAL;
+ virtual void themeChanged() OVERRIDE FINAL;
+ virtual bool handleInputEvent(const WebInputEvent&) OVERRIDE FINAL;
+ virtual void mouseCaptureLost() OVERRIDE FINAL;
+ virtual void setFocus(bool enable) OVERRIDE FINAL;
virtual bool setComposition(
const WebString& text,
const WebVector<WebCompositionUnderline>& underlines,
- int selectionStart, int selectionEnd) OVERRIDE;
- virtual bool confirmComposition() OVERRIDE;
- virtual bool confirmComposition(ConfirmCompositionBehavior selectionBehavior) OVERRIDE;
- virtual bool confirmComposition(const WebString& text) OVERRIDE;
- virtual bool compositionRange(size_t* location, size_t* length) OVERRIDE;
- virtual bool caretOrSelectionRange(size_t* location, size_t* length) OVERRIDE;
- virtual void setTextDirection(WebTextDirection) OVERRIDE;
- virtual bool isAcceleratedCompositingActive() const OVERRIDE { return false; }
- virtual bool isPopupMenu() const OVERRIDE { return true; }
+ int selectionStart, int selectionEnd) OVERRIDE FINAL;
+ virtual bool confirmComposition() OVERRIDE FINAL;
+ virtual bool confirmComposition(ConfirmCompositionBehavior selectionBehavior) OVERRIDE FINAL;
+ virtual bool confirmComposition(const WebString& text) OVERRIDE FINAL;
+ virtual bool compositionRange(size_t* location, size_t* length) OVERRIDE FINAL;
+ virtual bool caretOrSelectionRange(size_t* location, size_t* length) OVERRIDE FINAL;
+ virtual void setTextDirection(WebTextDirection) OVERRIDE FINAL;
+ virtual bool isAcceleratedCompositingActive() const OVERRIDE FINAL { return false; }
+ virtual bool isPopupMenu() const OVERRIDE FINAL { return true; }
+ virtual void willCloseLayerTreeView() OVERRIDE FINAL;
+
+ // WebContentLayerClient
+ virtual void paintContents(WebCanvas*, const WebRect& clip, bool canPaintLCDTest, WebFloatRect& opaque) OVERRIDE FINAL;
// WebPopupMenuImpl
void initialize(WebCore::FramelessScrollView* widget, const WebRect& bounds);
@@ -127,6 +134,10 @@ public:
WebWidgetClient* m_client;
WebSize m_size;
+ WebLayerTreeView* m_layerTreeView;
+ OwnPtr<WebContentLayer> m_rootLayer;
+ bool m_isAcceleratedCompositingActive;
+
WebPoint m_lastMousePosition;
// This is a non-owning ref. The popup will notify us via popupClosed()