From b3c9bb0a1f3eae80103ddcd84b57caf6843ae174 Mon Sep 17 00:00:00 2001 From: "jbauman@chromium.org" Date: Wed, 29 Jan 2014 00:14:45 +0000 Subject: [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 --- .../WebKit/Source/web/WebPopupMenuImpl.cpp | 69 ++++++++++++++++++++++ .../WebKit/Source/web/WebPopupMenuImpl.h | 59 ++++++++++-------- 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 @@ -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 { +class WebPopupMenuImpl : public WebPopupMenu, public WebCore::FramelessScrollViewClient, public WebContentLayerClient, public RefCounted { 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& 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 m_rootLayer; + bool m_isAcceleratedCompositingActive; + WebPoint m_lastMousePosition; // This is a non-owning ref. The popup will notify us via popupClosed() -- cgit v1.2.1