| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/browser/renderer_host/accelerated_plugin_view_mac.h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | |
| 9 #include "testing/platform_test.h" | |
| 10 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" | |
| 11 | |
| 12 @interface UnderlayCountingWindow : NSWindow<UnderlayableSurface> { | |
| 13 @private | |
| 14 int underlayCount_; | |
| 15 } | |
| 16 @property (readonly, nonatomic) int underlayCount; | |
| 17 - (void)underlaySurfaceAdded; | |
| 18 - (void)underlaySurfaceRemoved; | |
| 19 @end | |
| 20 | |
| 21 @implementation UnderlayCountingWindow | |
| 22 @synthesize underlayCount = underlayCount_; | |
| 23 | |
| 24 - (void)underlaySurfaceAdded { | |
| 25 DCHECK_GE(underlayCount_, 0); | |
| 26 ++underlayCount_; | |
| 27 } | |
| 28 | |
| 29 - (void)underlaySurfaceRemoved { | |
| 30 --underlayCount_; | |
| 31 DCHECK_GE(underlayCount_, 0); | |
| 32 } | |
| 33 @end | |
| 34 | |
| 35 class AcceleratedPluginViewTest : public PlatformTest { | |
| 36 protected: | |
| 37 AcceleratedPluginViewTest() {} | |
| 38 | |
| 39 UnderlayCountingWindow* StubUnderlayWindow() { | |
| 40 UnderlayCountingWindow* window = [[[UnderlayCountingWindow alloc] | |
| 41 initWithContentRect:NSMakeRect(20, 20, 300, 200) | |
| 42 styleMask:NSBorderlessWindowMask | |
| 43 backing:NSBackingStoreBuffered | |
| 44 defer:NO] autorelease]; | |
| 45 [window orderFront:nil]; | |
| 46 return window; | |
| 47 } | |
| 48 | |
| 49 AcceleratedPluginView* StubAcceleratedPluginView() { | |
| 50 // It truns out the rwhv and the plugin handle are not necessary for | |
| 51 // this test, and AcceleratedPluginView doesn't crash without them. | |
| 52 AcceleratedPluginView* view = [[[AcceleratedPluginView alloc] | |
| 53 initWithRenderWidgetHostViewMac:NULL | |
| 54 pluginHandle:0] autorelease]; | |
| 55 return view; | |
| 56 } | |
| 57 | |
| 58 private: | |
| 59 DISALLOW_COPY_AND_ASSIGN(AcceleratedPluginViewTest); | |
| 60 }; | |
| 61 | |
| 62 TEST_F(AcceleratedPluginViewTest, Basic) { | |
| 63 } | |
| 64 | |
| 65 TEST_F(AcceleratedPluginViewTest, BasicAdding) { | |
| 66 AcceleratedPluginView* view = StubAcceleratedPluginView(); | |
| 67 | |
| 68 UnderlayCountingWindow* window = StubUnderlayWindow(); | |
| 69 EXPECT_EQ(0, [window underlayCount]); | |
| 70 | |
| 71 [[window contentView] addSubview:view]; | |
| 72 EXPECT_EQ(1, [window underlayCount]); | |
| 73 | |
| 74 [view removeFromSuperview]; | |
| 75 EXPECT_EQ(0, [window underlayCount]); | |
| 76 } | |
| 77 | |
| 78 TEST_F(AcceleratedPluginViewTest, MoveBetweenWindows) { | |
| 79 AcceleratedPluginView* view = StubAcceleratedPluginView(); | |
| 80 | |
| 81 UnderlayCountingWindow* window1 = StubUnderlayWindow(); | |
| 82 UnderlayCountingWindow* window2 = StubUnderlayWindow(); | |
| 83 EXPECT_EQ(0, [window1 underlayCount]); | |
| 84 EXPECT_EQ(0, [window2 underlayCount]); | |
| 85 | |
| 86 [[window1 contentView] addSubview:view]; | |
| 87 EXPECT_EQ(1, [window1 underlayCount]); | |
| 88 EXPECT_EQ(0, [window2 underlayCount]); | |
| 89 | |
| 90 [[window2 contentView] addSubview:view]; | |
| 91 EXPECT_EQ(0, [window1 underlayCount]); | |
| 92 EXPECT_EQ(1, [window2 underlayCount]); | |
| 93 } | |
| 94 | |
| 95 TEST_F(AcceleratedPluginViewTest, HiddenWhenAdding) { | |
| 96 AcceleratedPluginView* view = StubAcceleratedPluginView(); | |
| 97 [view setHidden:YES]; | |
| 98 | |
| 99 UnderlayCountingWindow* window = StubUnderlayWindow(); | |
| 100 EXPECT_EQ(0, [window underlayCount]); | |
| 101 | |
| 102 [[window contentView] addSubview:view]; | |
| 103 EXPECT_EQ(0, [window underlayCount]); | |
| 104 | |
| 105 [view setHidden:NO]; | |
| 106 EXPECT_EQ(1, [window underlayCount]); | |
| 107 | |
| 108 [view setHidden:YES]; | |
| 109 EXPECT_EQ(0, [window underlayCount]); | |
| 110 | |
| 111 [view removeFromSuperview]; | |
| 112 EXPECT_EQ(0, [window underlayCount]); | |
| 113 } | |
| 114 | |
| 115 TEST_F(AcceleratedPluginViewTest, HiddenAfterAdding) { | |
| 116 AcceleratedPluginView* view = StubAcceleratedPluginView(); | |
| 117 | |
| 118 UnderlayCountingWindow* window = StubUnderlayWindow(); | |
| 119 EXPECT_EQ(0, [window underlayCount]); | |
| 120 | |
| 121 [[window contentView] addSubview:view]; | |
| 122 EXPECT_EQ(1, [window underlayCount]); | |
| 123 | |
| 124 [view setHidden:YES]; | |
| 125 EXPECT_EQ(0, [window underlayCount]); | |
| 126 | |
| 127 [view setHidden:NO]; | |
| 128 EXPECT_EQ(1, [window underlayCount]); | |
| 129 | |
| 130 [view removeFromSuperview]; | |
| 131 EXPECT_EQ(0, [window underlayCount]); | |
| 132 } | |
| 133 | |
| 134 TEST_F(AcceleratedPluginViewTest, MoveBetweenWindowsWithHiding) { | |
| 135 AcceleratedPluginView* view = StubAcceleratedPluginView(); | |
| 136 [view setHidden:YES]; | |
| 137 | |
| 138 UnderlayCountingWindow* window1 = StubUnderlayWindow(); | |
| 139 UnderlayCountingWindow* window2 = StubUnderlayWindow(); | |
| 140 EXPECT_EQ(0, [window1 underlayCount]); | |
| 141 EXPECT_EQ(0, [window2 underlayCount]); | |
| 142 | |
| 143 [[window1 contentView] addSubview:view]; | |
| 144 EXPECT_EQ(0, [window1 underlayCount]); | |
| 145 EXPECT_EQ(0, [window2 underlayCount]); | |
| 146 | |
| 147 [view setHidden:NO]; | |
| 148 EXPECT_EQ(1, [window1 underlayCount]); | |
| 149 EXPECT_EQ(0, [window2 underlayCount]); | |
| 150 | |
| 151 // Move view while it's visible. | |
| 152 [[window2 contentView] addSubview:view]; | |
| 153 EXPECT_EQ(0, [window1 underlayCount]); | |
| 154 EXPECT_EQ(1, [window2 underlayCount]); | |
| 155 | |
| 156 [view setHidden:YES]; | |
| 157 EXPECT_EQ(0, [window1 underlayCount]); | |
| 158 EXPECT_EQ(0, [window2 underlayCount]); | |
| 159 | |
| 160 // Move view while it's hidden. | |
| 161 [[window1 contentView] addSubview:view]; | |
| 162 EXPECT_EQ(0, [window1 underlayCount]); | |
| 163 EXPECT_EQ(0, [window2 underlayCount]); | |
| 164 | |
| 165 [view setHidden:NO]; | |
| 166 EXPECT_EQ(1, [window1 underlayCount]); | |
| 167 EXPECT_EQ(0, [window2 underlayCount]); | |
| 168 } | |
| 169 | |
| 170 // Regression test for http://crbug.com/81737 | |
| 171 TEST_F(AcceleratedPluginViewTest, RemoveWithHiddenParent) { | |
| 172 AcceleratedPluginView* view = StubAcceleratedPluginView(); | |
| 173 | |
| 174 NSView* parent = | |
| 175 [[[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)] autorelease]; | |
| 176 [parent addSubview:view]; | |
| 177 | |
| 178 UnderlayCountingWindow* window = StubUnderlayWindow(); | |
| 179 EXPECT_EQ(0, [window underlayCount]); | |
| 180 | |
| 181 [[window contentView] addSubview:parent]; | |
| 182 EXPECT_EQ(1, [window underlayCount]); | |
| 183 | |
| 184 [parent setHidden:YES]; | |
| 185 EXPECT_EQ(0, [window underlayCount]); | |
| 186 | |
| 187 [parent removeFromSuperview]; | |
| 188 EXPECT_EQ(0, [window underlayCount]); | |
| 189 } | |
| OLD | NEW |