Skip to content

Commit 1d794e3

Browse files
jbauman2bbandix
authored andcommitted
<third_party/WebKit> 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 Reviewed-by: Jocelyn Turcotte <[email protected]> Change-Id: Ic26c7821ba5bb5c377c324423d63090ed2f31ffe Reviewed-by: Zeno Albisser <[email protected]>
1 parent 1f9da30 commit 1d794e3

File tree

2 files changed

+104
-24
lines changed

2 files changed

+104
-24
lines changed

chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
#include "platform/graphics/GraphicsContext.h"
5050
#include "platform/graphics/skia/SkiaUtils.h"
5151
#include "platform/scroll/FramelessScrollView.h"
52+
#include "public/platform/Platform.h"
53+
#include "public/platform/WebCompositorSupport.h"
54+
#include "public/platform/WebContentLayer.h"
55+
#include "public/platform/WebLayerTreeView.h"
5256
#include "public/platform/WebRect.h"
5357
#include <skia/ext/platform_canvas.h>
5458

@@ -68,6 +72,10 @@ WebPopupMenu* WebPopupMenu::create(WebWidgetClient* client)
6872

6973
WebPopupMenuImpl::WebPopupMenuImpl(WebWidgetClient* client)
7074
: m_client(client)
75+
, m_layerTreeView(0)
76+
, m_isAcceleratedCompositingActive(false)
77+
// Set to impossible point so we always get the first mouse position.
78+
, m_lastMousePosition(WebPoint(-1, -1))
7179
, m_widget(0)
7280
{
7381
// Set to impossible point so we always get the first mouse position.
@@ -80,6 +88,12 @@ WebPopupMenuImpl::~WebPopupMenuImpl()
8088
m_widget->setClient(0);
8189
}
8290

91+
void WebPopupMenuImpl::willCloseLayerTreeView()
92+
{
93+
enterForceCompositingMode(false);
94+
m_layerTreeView = 0;
95+
}
96+
8397
void WebPopupMenuImpl::initialize(FramelessScrollView* widget, const WebRect& bounds)
8498
{
8599
m_widget = widget;
@@ -174,6 +188,9 @@ void WebPopupMenuImpl::resize(const WebSize& newSize)
174188
WebRect damagedRect(0, 0, m_size.width, m_size.height);
175189
m_client->didInvalidateRect(damagedRect);
176190
}
191+
192+
if (m_rootLayer)
193+
m_rootLayer->layer()->setBounds(newSize);
177194
}
178195

179196
void WebPopupMenuImpl::willEndLiveResize()
@@ -188,6 +205,54 @@ void WebPopupMenuImpl::layout()
188205
{
189206
}
190207

208+
void WebPopupMenuImpl::enterForceCompositingMode(bool enter)
209+
{
210+
if (m_isAcceleratedCompositingActive == enter)
211+
return;
212+
213+
if (!enter) {
214+
m_isAcceleratedCompositingActive = false;
215+
m_client->didDeactivateCompositor();
216+
} else if (m_layerTreeView) {
217+
m_isAcceleratedCompositingActive = true;
218+
m_client->didActivateCompositor(0);
219+
} else {
220+
TRACE_EVENT0("webkit", "WebPopupMenuImpl::enterForceCompositingMode(true)");
221+
222+
m_client->initializeLayerTreeView();
223+
m_layerTreeView = m_client->layerTreeView();
224+
if (m_layerTreeView) {
225+
m_layerTreeView->setVisible(true);
226+
m_client->didActivateCompositor(0);
227+
m_isAcceleratedCompositingActive = true;
228+
m_layerTreeView->setDeviceScaleFactor(m_client->deviceScaleFactor());
229+
m_rootLayer = adoptPtr(Platform::current()->compositorSupport()->createContentLayer(this));
230+
m_rootLayer->layer()->setBounds(m_size);
231+
m_layerTreeView->setRootLayer(*m_rootLayer->layer());
232+
} else {
233+
m_isAcceleratedCompositingActive = false;
234+
m_client->didDeactivateCompositor();
235+
}
236+
}
237+
}
238+
239+
void WebPopupMenuImpl::didExitCompositingMode()
240+
{
241+
enterForceCompositingMode(false);
242+
m_client->didInvalidateRect(IntRect(0, 0, m_size.width, m_size.height));
243+
}
244+
245+
void WebPopupMenuImpl::paintContents(WebCanvas* canvas, const WebRect& rect, bool, WebFloatRect&)
246+
{
247+
if (!m_widget)
248+
return;
249+
250+
if (!rect.isEmpty()) {
251+
GraphicsContext context(canvas);
252+
m_widget->paint(&context, rect);
253+
}
254+
}
255+
191256
void WebPopupMenuImpl::paint(WebCanvas* canvas, const WebRect& rect, PaintOptions)
192257
{
193258
if (!m_widget)
@@ -343,6 +408,8 @@ void WebPopupMenuImpl::invalidateContentsAndRootView(const IntRect& paintRect)
343408
return;
344409
if (m_client)
345410
m_client->didInvalidateRect(paintRect);
411+
if (m_rootLayer)
412+
m_rootLayer->layer()->invalidateRect(FloatRect(paintRect));
346413
}
347414

348415
void WebPopupMenuImpl::invalidateContentsForSlowScroll(const IntRect& updateRect)
@@ -361,6 +428,8 @@ void WebPopupMenuImpl::scroll(const IntSize& scrollDelta, const IntRect& scrollR
361428
int dy = scrollDelta.height();
362429
m_client->didScrollRect(dx, dy, clipRect);
363430
}
431+
if (m_rootLayer)
432+
m_rootLayer->layer()->invalidateRect(FloatRect(clipRect));
364433
}
365434

366435
IntPoint WebPopupMenuImpl::screenToRootView(const IntPoint& point) const

chromium/third_party/WebKit/Source/web/WebPopupMenuImpl.h

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include "WebPopupMenu.h"
3535
#include "platform/scroll/FramelessScrollViewClient.h"
36+
#include "public/platform/WebContentLayerClient.h"
3637
#include "public/platform/WebPoint.h"
3738
#include "public/platform/WebSize.h"
3839
#include "wtf/OwnPtr.h"
@@ -49,44 +50,50 @@ class Widget;
4950
}
5051

5152
namespace blink {
53+
class WebContentLayer;
5254
class WebGestureEvent;
5355
class WebKeyboardEvent;
56+
class WebLayerTreeView;
5457
class WebMouseEvent;
5558
class WebMouseWheelEvent;
5659
class WebRange;
5760
struct WebRect;
5861
class WebTouchEvent;
5962

60-
class WebPopupMenuImpl : public WebPopupMenu,
61-
public WebCore::FramelessScrollViewClient,
62-
public RefCounted<WebPopupMenuImpl> {
63+
class WebPopupMenuImpl : public WebPopupMenu, public WebCore::FramelessScrollViewClient, public WebContentLayerClient, public RefCounted<WebPopupMenuImpl> {
6364
WTF_MAKE_FAST_ALLOCATED;
6465
public:
6566
// WebWidget functions:
66-
virtual void close() OVERRIDE;
67-
virtual WebSize size() OVERRIDE { return m_size; }
68-
virtual void willStartLiveResize() OVERRIDE;
69-
virtual void resize(const WebSize&) OVERRIDE;
70-
virtual void willEndLiveResize() OVERRIDE;
71-
virtual void animate(double frameBeginTime) OVERRIDE;
72-
virtual void layout() OVERRIDE;
73-
virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE;
74-
virtual void themeChanged() OVERRIDE;
75-
virtual bool handleInputEvent(const WebInputEvent&) OVERRIDE;
76-
virtual void mouseCaptureLost() OVERRIDE;
77-
virtual void setFocus(bool enable) OVERRIDE;
67+
virtual void close() OVERRIDE FINAL;
68+
virtual WebSize size() OVERRIDE FINAL { return m_size; }
69+
virtual void willStartLiveResize() OVERRIDE FINAL;
70+
virtual void resize(const WebSize&) OVERRIDE FINAL;
71+
virtual void willEndLiveResize() OVERRIDE FINAL;
72+
virtual void animate(double frameBeginTime) OVERRIDE FINAL;
73+
virtual void layout() OVERRIDE FINAL;
74+
virtual void enterForceCompositingMode(bool enable) OVERRIDE FINAL;
75+
virtual void didExitCompositingMode() OVERRIDE FINAL;
76+
virtual void paint(WebCanvas*, const WebRect&, PaintOptions = ReadbackFromCompositorIfAvailable) OVERRIDE FINAL;
77+
virtual void themeChanged() OVERRIDE FINAL;
78+
virtual bool handleInputEvent(const WebInputEvent&) OVERRIDE FINAL;
79+
virtual void mouseCaptureLost() OVERRIDE FINAL;
80+
virtual void setFocus(bool enable) OVERRIDE FINAL;
7881
virtual bool setComposition(
7982
const WebString& text,
8083
const WebVector<WebCompositionUnderline>& underlines,
81-
int selectionStart, int selectionEnd) OVERRIDE;
82-
virtual bool confirmComposition() OVERRIDE;
83-
virtual bool confirmComposition(ConfirmCompositionBehavior selectionBehavior) OVERRIDE;
84-
virtual bool confirmComposition(const WebString& text) OVERRIDE;
85-
virtual bool compositionRange(size_t* location, size_t* length) OVERRIDE;
86-
virtual bool caretOrSelectionRange(size_t* location, size_t* length) OVERRIDE;
87-
virtual void setTextDirection(WebTextDirection) OVERRIDE;
88-
virtual bool isAcceleratedCompositingActive() const OVERRIDE { return false; }
89-
virtual bool isPopupMenu() const OVERRIDE { return true; }
84+
int selectionStart, int selectionEnd) OVERRIDE FINAL;
85+
virtual bool confirmComposition() OVERRIDE FINAL;
86+
virtual bool confirmComposition(ConfirmCompositionBehavior selectionBehavior) OVERRIDE FINAL;
87+
virtual bool confirmComposition(const WebString& text) OVERRIDE FINAL;
88+
virtual bool compositionRange(size_t* location, size_t* length) OVERRIDE FINAL;
89+
virtual bool caretOrSelectionRange(size_t* location, size_t* length) OVERRIDE FINAL;
90+
virtual void setTextDirection(WebTextDirection) OVERRIDE FINAL;
91+
virtual bool isAcceleratedCompositingActive() const OVERRIDE FINAL { return false; }
92+
virtual bool isPopupMenu() const OVERRIDE FINAL { return true; }
93+
virtual void willCloseLayerTreeView() OVERRIDE FINAL;
94+
95+
// WebContentLayerClient
96+
virtual void paintContents(WebCanvas*, const WebRect& clip, bool canPaintLCDTest, WebFloatRect& opaque) OVERRIDE FINAL;
9097

9198
// WebPopupMenuImpl
9299
void initialize(WebCore::FramelessScrollView* widget, const WebRect& bounds);
@@ -127,6 +134,10 @@ class WebPopupMenuImpl : public WebPopupMenu,
127134
WebWidgetClient* m_client;
128135
WebSize m_size;
129136

137+
WebLayerTreeView* m_layerTreeView;
138+
OwnPtr<WebContentLayer> m_rootLayer;
139+
bool m_isAcceleratedCompositingActive;
140+
130141
WebPoint m_lastMousePosition;
131142

132143
// This is a non-owning ref. The popup will notify us via popupClosed()

0 commit comments

Comments
 (0)