From 6105251b5c1a8e262cad393eedb702951b3461dd Mon Sep 17 00:00:00 2001 From: "thakis@chromium.org" Date: Thu, 5 May 2011 19:13:50 +0000 Subject: Mac:Let AcceleratedPluginView take visibility into account when sending underlaySurfaceAdded/Removed This fixes a regression where the window shadow problem was visible on all pages, not just on gpu-accelerated ones. BUG=56154 TEST=window shadow should look good on ntp, but broken on youtube. Review URL: http://codereview.chromium.org/6935010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84280 0039d316-1c4b-4281-b951-d872f2087c98 --- .../renderer_host/accelerated_plugin_view_mac.mm | 20 +++++- .../accelerated_plugin_view_mac_unittest.mm | 75 ++++++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm b/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm index ba09804..0e236bb 100644 --- a/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm +++ b/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm @@ -261,11 +261,27 @@ static CVReturn DrawOneAcceleratedPluginCallback( // Inform the window hosting this accelerated view that it needs to be // transparent. + if (![self isHidden]) { + if ([[self window] respondsToSelector:@selector(underlaySurfaceRemoved)]) + [static_cast([self window]) underlaySurfaceRemoved]; + if ([newWindow respondsToSelector:@selector(underlaySurfaceAdded)]) + [static_cast(newWindow) underlaySurfaceAdded]; + } +} + +- (void)viewDidHide { + [super viewDidHide]; + if ([[self window] respondsToSelector:@selector(underlaySurfaceRemoved)]) { [static_cast([self window]) underlaySurfaceRemoved]; } - if ([newWindow respondsToSelector:@selector(underlaySurfaceAdded)]) { - [static_cast(newWindow) underlaySurfaceAdded]; +} + +- (void)viewDidUnhide { + [super viewDidUnhide]; + + if ([[self window] respondsToSelector:@selector(underlaySurfaceRemoved)]) { + [static_cast([self window]) underlaySurfaceAdded]; } } diff --git a/chrome/browser/renderer_host/accelerated_plugin_view_mac_unittest.mm b/chrome/browser/renderer_host/accelerated_plugin_view_mac_unittest.mm index 8cb710b..6f2837e 100644 --- a/chrome/browser/renderer_host/accelerated_plugin_view_mac_unittest.mm +++ b/chrome/browser/renderer_host/accelerated_plugin_view_mac_unittest.mm @@ -87,3 +87,78 @@ TEST_F(AcceleratedPluginViewTest, MoveBetweenWindows) { EXPECT_EQ(0, [window1 underlayCount]); EXPECT_EQ(1, [window2 underlayCount]); } + +TEST_F(AcceleratedPluginViewTest, HiddenWhenAdding) { + AcceleratedPluginView* view = StubAcceleratedPluginView(); + [view setHidden:YES]; + + UnderlayCountingWindow* window = StubUnderlayWindow(); + EXPECT_EQ(0, [window underlayCount]); + + [[window contentView] addSubview:view]; + EXPECT_EQ(0, [window underlayCount]); + + [view setHidden:NO]; + EXPECT_EQ(1, [window underlayCount]); + + [view setHidden:YES]; + EXPECT_EQ(0, [window underlayCount]); + + [view removeFromSuperview]; + EXPECT_EQ(0, [window underlayCount]); +} + +TEST_F(AcceleratedPluginViewTest, HiddenAfterAdding) { + AcceleratedPluginView* view = StubAcceleratedPluginView(); + + UnderlayCountingWindow* window = StubUnderlayWindow(); + EXPECT_EQ(0, [window underlayCount]); + + [[window contentView] addSubview:view]; + EXPECT_EQ(1, [window underlayCount]); + + [view setHidden:YES]; + EXPECT_EQ(0, [window underlayCount]); + + [view setHidden:NO]; + EXPECT_EQ(1, [window underlayCount]); + + [view removeFromSuperview]; + EXPECT_EQ(0, [window underlayCount]); +} + +TEST_F(AcceleratedPluginViewTest, MoveBetweenWindowsWithHiding) { + AcceleratedPluginView* view = StubAcceleratedPluginView(); + [view setHidden:YES]; + + UnderlayCountingWindow* window1 = StubUnderlayWindow(); + UnderlayCountingWindow* window2 = StubUnderlayWindow(); + EXPECT_EQ(0, [window1 underlayCount]); + EXPECT_EQ(0, [window2 underlayCount]); + + [[window1 contentView] addSubview:view]; + EXPECT_EQ(0, [window1 underlayCount]); + EXPECT_EQ(0, [window2 underlayCount]); + + [view setHidden:NO]; + EXPECT_EQ(1, [window1 underlayCount]); + EXPECT_EQ(0, [window2 underlayCount]); + + // Move view while it's visible. + [[window2 contentView] addSubview:view]; + EXPECT_EQ(0, [window1 underlayCount]); + EXPECT_EQ(1, [window2 underlayCount]); + + [view setHidden:YES]; + EXPECT_EQ(0, [window1 underlayCount]); + EXPECT_EQ(0, [window2 underlayCount]); + + // Move view while it's hidden. + [[window1 contentView] addSubview:view]; + EXPECT_EQ(0, [window1 underlayCount]); + EXPECT_EQ(0, [window2 underlayCount]); + + [view setHidden:NO]; + EXPECT_EQ(1, [window1 underlayCount]); + EXPECT_EQ(0, [window2 underlayCount]); +} -- cgit v1.1