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 |