diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-05 19:13:50 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-05 19:13:50 +0000 |
commit | 6105251b5c1a8e262cad393eedb702951b3461dd (patch) | |
tree | 1a41554d98de4b502c42260081638e5b6bd6bc53 | |
parent | f4359016f7df89518d3be5173bd3115ee4a5071b (diff) | |
download | chromium_src-6105251b5c1a8e262cad393eedb702951b3461dd.zip chromium_src-6105251b5c1a8e262cad393eedb702951b3461dd.tar.gz chromium_src-6105251b5c1a8e262cad393eedb702951b3461dd.tar.bz2 |
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
-rw-r--r-- | chrome/browser/renderer_host/accelerated_plugin_view_mac.mm | 20 | ||||
-rw-r--r-- | chrome/browser/renderer_host/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<id>([self window]) underlaySurfaceRemoved]; + if ([newWindow respondsToSelector:@selector(underlaySurfaceAdded)]) + [static_cast<id>(newWindow) underlaySurfaceAdded]; + } +} + +- (void)viewDidHide { + [super viewDidHide]; + if ([[self window] respondsToSelector:@selector(underlaySurfaceRemoved)]) { [static_cast<id>([self window]) underlaySurfaceRemoved]; } - if ([newWindow respondsToSelector:@selector(underlaySurfaceAdded)]) { - [static_cast<id>(newWindow) underlaySurfaceAdded]; +} + +- (void)viewDidUnhide { + [super viewDidUnhide]; + + if ([[self window] respondsToSelector:@selector(underlaySurfaceRemoved)]) { + [static_cast<id>([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]); +} |