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 "ui/gfx/compositor/test/test_compositor_host.h" | |
6 | |
7 #import <AppKit/NSApplication.h> | |
8 #import <AppKit/NSOpenGL.h> | |
9 #import <AppKit/NSView.h> | |
10 #import <AppKit/NSWindow.h> | |
11 #import <Foundation/NSAutoreleasePool.h> | |
12 | |
13 #include "base/compiler_specific.h" | |
14 #include "base/memory/scoped_nsobject.h" | |
15 #include "base/memory/scoped_ptr.h" | |
16 #include "ui/gfx/compositor/compositor.h" | |
17 #include "ui/gfx/rect.h" | |
18 | |
19 // AcceleratedTestView provides an NSView class that delegates drawing to a | |
20 // ui::Compositor delegate, setting up the NSOpenGLContext as required. | |
21 @interface AcceleratedTestView : NSView { | |
22 ui::Compositor* compositor_; | |
23 } | |
24 // Designated initializer. | |
25 -(id)init; | |
26 -(void)setCompositor:(ui::Compositor*)compositor; | |
27 @end | |
28 | |
29 @implementation AcceleratedTestView | |
30 -(id)init { | |
31 // The frame will be resized when reparented into the window's view hierarchy. | |
32 self = [super initWithFrame:NSZeroRect]; | |
33 return self; | |
34 } | |
35 | |
36 -(void)setCompositor:(ui::Compositor*)compositor { | |
37 compositor_ = compositor; | |
38 } | |
39 | |
40 - (void)drawRect:(NSRect)rect { | |
41 DCHECK(compositor_) << "Drawing with no compositor set."; | |
42 compositor_->Draw(false); | |
43 } | |
44 @end | |
45 | |
46 namespace ui { | |
47 | |
48 // Tests that use Objective-C memory semantics need to have a top-level | |
49 // NSAutoreleasePool set up and initialized prior to execution and drained upon | |
50 // exit. The tests will leak otherwise. | |
51 class FoundationHost { | |
52 protected: | |
53 FoundationHost() { | |
54 pool_ = [[NSAutoreleasePool alloc] init]; | |
55 } | |
56 virtual ~FoundationHost() { | |
57 [pool_ drain]; | |
58 } | |
59 | |
60 private: | |
61 NSAutoreleasePool* pool_; | |
62 DISALLOW_COPY_AND_ASSIGN(FoundationHost); | |
63 }; | |
64 | |
65 // Tests that use the AppKit framework need to have the NSApplication | |
66 // initialized prior to doing anything with display objects such as windows, | |
67 // views, or controls. | |
68 class AppKitHost : public FoundationHost { | |
69 protected: | |
70 AppKitHost() { | |
71 [NSApplication sharedApplication]; | |
72 } | |
73 virtual ~AppKitHost() { | |
74 } | |
75 private: | |
76 DISALLOW_COPY_AND_ASSIGN(AppKitHost); | |
77 }; | |
78 | |
79 // TestCompositorHostMac provides a window surface and a coordinated compositor | |
80 // for use in the compositor unit tests. | |
81 class TestCompositorHostMac : public TestCompositorHost, | |
82 public CompositorDelegate, | |
83 public AppKitHost { | |
84 public: | |
85 TestCompositorHostMac(const gfx::Rect& bounds); | |
86 virtual ~TestCompositorHostMac(); | |
87 | |
88 private: | |
89 // TestCompositorHost: | |
90 virtual void Show() OVERRIDE; | |
91 virtual ui::Compositor* GetCompositor() OVERRIDE; | |
92 | |
93 // CompositorDelegate: | |
94 virtual void ScheduleDraw() OVERRIDE; | |
95 | |
96 gfx::Rect bounds_; | |
97 scoped_ptr<ui::Compositor> compositor_; | |
98 | |
99 // Owned. Released when window is closed. | |
100 NSWindow* window_; | |
101 | |
102 DISALLOW_COPY_AND_ASSIGN(TestCompositorHostMac); | |
103 }; | |
104 | |
105 TestCompositorHostMac::TestCompositorHostMac(const gfx::Rect& bounds) | |
106 : bounds_(bounds), window_(nil) { | |
107 } | |
108 | |
109 TestCompositorHostMac::~TestCompositorHostMac() { | |
110 // Release reference to |compositor_|. Important because the |compositor_| | |
111 // holds |this| as its delegate, so that reference must be removed here. | |
112 [[window_ contentView] setCompositor:NULL]; | |
113 [window_ setContentView:nil]; | |
114 | |
115 [window_ orderOut:nil]; | |
116 [window_ close]; | |
117 } | |
118 | |
119 void TestCompositorHostMac::Show() { | |
120 DCHECK(!window_); | |
121 window_ = [[NSWindow alloc] | |
122 initWithContentRect:NSMakeRect(bounds_.x(), | |
123 bounds_.y(), | |
124 bounds_.width(), | |
125 bounds_.height()) | |
126 styleMask:NSBorderlessWindowMask | |
127 backing:NSBackingStoreBuffered | |
128 defer:NO]; | |
129 scoped_nsobject<AcceleratedTestView> view([[AcceleratedTestView alloc] init]); | |
130 compositor_.reset(new ui::Compositor(this, view, bounds_.size())); | |
131 [view setCompositor:compositor_.get()]; | |
132 [window_ setContentView:view]; | |
133 [window_ orderFront:nil]; | |
134 } | |
135 | |
136 ui::Compositor* TestCompositorHostMac::GetCompositor() { | |
137 return compositor_.get(); | |
138 } | |
139 | |
140 void TestCompositorHostMac::ScheduleDraw() { | |
141 if (!compositor_.get()) | |
142 return; | |
143 | |
144 // Force display now. | |
145 [window_ display]; | |
146 } | |
147 | |
148 // static | |
149 TestCompositorHost* TestCompositorHost::Create(const gfx::Rect& bounds) { | |
150 return new TestCompositorHostMac(bounds); | |
151 } | |
152 | |
153 } // namespace ui | |
OLD | NEW |