OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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 "chrome_frame/external_tab.h" | |
6 | |
7 // #include "base/synchronization/waitable_event.h" | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/bind_helpers.h" | |
11 #include "base/location.h" | |
12 #include "base/threading/thread.h" | |
13 #include "chrome/common/automation_messages.h" | |
14 #include "chrome_frame/navigation_constraints.h" | |
15 #include "chrome_frame/test/chrome_frame_test_utils.h" | |
16 #include "testing/gtest/include/gtest/gtest.h" | |
17 #include "testing/gmock/include/gmock/gmock.h" | |
18 #include "testing/gmock_mutant.h" | |
19 | |
20 using testing::StrictMock; | |
21 using testing::_; | |
22 using testing::Invoke; | |
23 using testing::InvokeWithoutArgs; | |
24 using testing::CreateFunctor; | |
25 using testing::Return; | |
26 using testing::DoAll; | |
27 using testing::Field; | |
28 using chrome_frame_test::TimedMsgLoop; | |
29 | |
30 struct MockUIDelegate : public UIDelegate { | |
31 MOCK_METHOD2(OnNavigationStateChanged, void(int flags, | |
32 const NavigationInfo& nav_info)); | |
33 MOCK_METHOD1(OnUpdateTargetUrl, void(const std::wstring& new_target_url)); | |
34 MOCK_METHOD1(OnLoad, void(const GURL& url)); | |
35 MOCK_METHOD1(OnMoveWindow, void(const gfx::Rect& pos)); | |
36 MOCK_METHOD3(OnMessageFromChromeFrame, void(const std::string& message, | |
37 const std::string& origin, const std::string& target)); | |
38 MOCK_METHOD3(OnHandleContextMenu, void(const ContextMenuModel& menu_model, | |
39 int align_flags, const MiniContextMenuParams& params)); | |
40 MOCK_METHOD1(OnHandleAccelerator, void(const MSG& accel_message)); | |
41 MOCK_METHOD1(OnTabbedOut, void(bool reverse)); | |
42 MOCK_METHOD1(OnGoToHistoryOffset, void(int offset)); | |
43 MOCK_METHOD3(OnOpenURL, void(const GURL& url_to_open, const GURL& referrer, | |
44 int open_disposition)); | |
45 }; | |
46 | |
47 struct MockProxy : public ChromeProxy { | |
48 MOCK_METHOD1(RemoveBrowsingData, void(int remove_mask)); | |
49 MOCK_METHOD1(SetProxyConfig, void(const std::string& json_encoded_settings)); | |
50 | |
51 MOCK_METHOD2(CreateTab, void(ChromeProxyDelegate* delegate, | |
52 const ExternalTabSettings& settings)); | |
53 MOCK_METHOD3(ConnectTab, void(ChromeProxyDelegate* delegate, HWND hwnd, | |
54 uint64 cookie)); | |
55 MOCK_METHOD1(BlockTab, void(uint64 cookie)); | |
56 | |
57 MOCK_METHOD4(Tab_PostMessage, void(int tab, const std::string& message, | |
58 const std::string& origin, const std::string& target)); | |
59 MOCK_METHOD1(Tab_Reload, void(int tab)); | |
60 MOCK_METHOD1(Tab_Stop, void(int tab)); | |
61 MOCK_METHOD1(Tab_SaveAs, void(int tab)); | |
62 MOCK_METHOD1(Tab_Print, void(int tab)); | |
63 MOCK_METHOD1(Tab_Cut, void(int tab)); | |
64 MOCK_METHOD1(Tab_Copy, void(int tab)); | |
65 MOCK_METHOD1(Tab_Paste, void(int tab)); | |
66 MOCK_METHOD1(Tab_SelectAll, void(int tab)); | |
67 MOCK_METHOD5(Tab_Find, void(int tab, const string16& search_string, | |
68 FindInPageDirection forward, FindInPageCase match_case, bool find_next)); | |
69 MOCK_METHOD2(Tab_MenuCommand, void(int tab, int selected_command)); | |
70 | |
71 MOCK_METHOD2(Tab_Zoom, void(int tab, content::PageZoom zoom_level)); | |
72 MOCK_METHOD2(Tab_FontSize, void(int tab, AutomationPageFontSize font_size)); | |
73 MOCK_METHOD3(Tab_SetInitialFocus, void(int tab, bool reverse, | |
74 bool restore_focus_to_view)); | |
75 MOCK_METHOD1(Tab_SetParentWindow, void(int tab)); | |
76 MOCK_METHOD1(Tab_Resize, void(int tab)); | |
77 MOCK_METHOD2(Tab_ProcessAccelerator, void(int tab, const MSG& msg)); | |
78 | |
79 // Misc. | |
80 MOCK_METHOD1(Tab_OnHostMoved, void(int tab)); | |
81 MOCK_METHOD1(Tab_RunUnloadHandlers, void(int tab)); | |
82 MOCK_METHOD3(Tab_Navigate, void(int tab, const GURL& url, | |
83 const GURL& referrer)); | |
84 MOCK_METHOD2(Tab_OverrideEncoding, void(int tab, const char* encoding)); | |
85 | |
86 MOCK_METHOD1(Init, void(const ProxyParams& params)); | |
87 MOCK_METHOD1(AddDelegate, int(ChromeProxyDelegate* delegate)); | |
88 MOCK_METHOD1(RemoveDelegate, int(ChromeProxyDelegate* delegate)); | |
89 }; | |
90 | |
91 struct MockFactory : public ChromeProxyFactory { | |
92 MOCK_METHOD0(CreateProxy, ChromeProxy*()); | |
93 }; | |
94 | |
95 | |
96 // This class just calls methods of ChromeProxyDelegate but in background thread | |
97 struct AsyncEventCreator { | |
98 public: | |
99 explicit AsyncEventCreator(ChromeProxyDelegate* delegate) | |
100 : delegate_(delegate), ipc_thread_("ipc") { | |
101 base::Thread::Options options(MessageLoop::TYPE_IO, 0); | |
102 ipc_thread_.StartWithOptions(options); | |
103 ipc_loop_ = ipc_thread_.message_loop(); | |
104 } | |
105 | |
106 void Fire_Connected(ChromeProxy* proxy, base::TimeDelta delay) { | |
107 ipc_loop_->PostDelayedTask( | |
108 FROM_HERE, | |
109 base::Bind(&ChromeProxyDelegate::Connected, base::Unretained(delegate_), | |
110 proxy), | |
111 delay.InMilliseconds()); | |
112 } | |
113 | |
114 void Fire_PeerLost(ChromeProxy* proxy, | |
115 ChromeProxyDelegate::DisconnectReason reason, base::TimeDelta delay) { | |
116 ipc_loop_->PostDelayedTask( | |
117 FROM_HERE, | |
118 base::Bind(&ChromeProxyDelegate::PeerLost, base::Unretained(delegate_), | |
119 proxy, reason), | |
120 delay.InMilliseconds()); | |
121 } | |
122 | |
123 void Fire_Disconnected(base::TimeDelta delay) { | |
124 ipc_loop_->PostDelayedTask( | |
125 FROM_HERE, | |
126 base::Bind(&ChromeProxyDelegate::Disconnected, | |
127 base::Unretained(delegate_)), | |
128 delay.InMilliseconds()); | |
129 } | |
130 | |
131 void Fire_CompletedCreateTab(bool success, HWND chrome_wnd, HWND tab_window, | |
132 int tab_handle, int session_id, | |
133 base::TimeDelta delay) { | |
134 ipc_loop_->PostDelayedTask( | |
135 FROM_HERE, | |
136 base::Bind(&ChromeProxyDelegate::Completed_CreateTab, | |
137 base::Unretained(delegate_), success, chrome_wnd, tab_window, | |
138 tab_handle, session_id), | |
139 delay.InMilliseconds()); | |
140 } | |
141 | |
142 private: | |
143 ChromeProxyDelegate* delegate_; | |
144 base::Thread ipc_thread_; | |
145 MessageLoop* ipc_loop_; | |
146 }; | |
147 | |
148 // We may want the same test with 'real' proxy and mock 'proxy traits'. | |
149 TEST(ExternalTabProxy, CancelledCreateTab) { | |
150 MockUIDelegate ui_delegate; | |
151 StrictMock<MockFactory> factory; | |
152 scoped_ptr<ExternalTabProxy> tab(new ExternalTabProxy()); | |
153 AsyncEventCreator async_events(tab.get()); | |
154 StrictMock<MockProxy>* proxy = new StrictMock<MockProxy>(); | |
155 TimedMsgLoop loop; | |
156 tab->set_proxy_factory(&factory); | |
157 | |
158 EXPECT_CALL(factory, CreateProxy()).WillOnce(Return(proxy)); | |
159 EXPECT_CALL(*proxy, Init(_)); | |
160 EXPECT_CALL(*proxy, AddDelegate(tab.get())).WillOnce(DoAll(InvokeWithoutArgs( | |
161 CreateFunctor(&async_events, &AsyncEventCreator::Fire_Connected, | |
162 proxy, base::TimeDelta::FromMilliseconds(30))), | |
163 Return(1))); | |
164 | |
165 EXPECT_CALL(*proxy, CreateTab(tab.get(), _)) | |
166 .WillOnce(QUIT_LOOP(loop)); | |
167 | |
168 EXPECT_CALL(*proxy, RemoveDelegate(_)).WillOnce(DoAll( | |
169 InvokeWithoutArgs(CreateFunctor(&async_events, | |
170 &AsyncEventCreator::Fire_CompletedCreateTab, false, HWND(0), HWND(0), | |
171 0, 0, base::TimeDelta::FromMilliseconds(0))), | |
172 InvokeWithoutArgs(CreateFunctor(&async_events, | |
173 &AsyncEventCreator::Fire_Disconnected, | |
174 base::TimeDelta::FromMilliseconds(0))), | |
175 Return(0))); | |
176 | |
177 CreateTabParams tab_params; | |
178 tab_params.is_incognito = true; | |
179 tab_params.is_widget_mode = false; | |
180 tab_params.url = GURL("http://Xanadu.org"); | |
181 | |
182 tab->CreateTab(tab_params, &ui_delegate); | |
183 loop.RunFor(5); | |
184 EXPECT_FALSE(loop.WasTimedOut()); | |
185 tab.reset(); | |
186 } | |
OLD | NEW |