OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome_frame/external_tab.h" | 5 #include "chrome_frame/external_tab.h" |
6 #include "base/task.h" | 6 #include "base/task.h" |
7 #include "base/thread.h" | 7 #include "base/thread.h" |
8 #include "base/tracked.h" | 8 #include "base/tracked.h" |
9 | 9 |
10 // #include "base/waitable_event.h" | 10 // #include "base/waitable_event.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 using testing::Invoke; | 27 using testing::Invoke; |
28 using testing::InvokeWithoutArgs; | 28 using testing::InvokeWithoutArgs; |
29 using testing::CreateFunctor; | 29 using testing::CreateFunctor; |
30 using testing::Return; | 30 using testing::Return; |
31 using testing::DoAll; | 31 using testing::DoAll; |
32 using testing::Field; | 32 using testing::Field; |
33 using chrome_frame_test::TimedMsgLoop; | 33 using chrome_frame_test::TimedMsgLoop; |
34 | 34 |
35 struct MockUIDelegate : public UIDelegate { | 35 struct MockUIDelegate : public UIDelegate { |
36 MOCK_METHOD2(OnNavigationStateChanged, void(int flags, | 36 MOCK_METHOD2(OnNavigationStateChanged, void(int flags, |
37 const IPC::NavigationInfo& nav_info)); | 37 const NavigationInfo& nav_info)); |
38 MOCK_METHOD1(OnUpdateTargetUrl, void(const std::wstring& new_target_url)); | 38 MOCK_METHOD1(OnUpdateTargetUrl, void(const std::wstring& new_target_url)); |
39 MOCK_METHOD3(OnExtensionInstalled, void(const FilePath& path, void* user_data, | 39 MOCK_METHOD3(OnExtensionInstalled, void(const FilePath& path, void* user_data, |
40 AutomationMsg_ExtensionResponseValues response)); | 40 AutomationMsg_ExtensionResponseValues response)); |
41 MOCK_METHOD1(OnLoad, void(const GURL& url)); | 41 MOCK_METHOD1(OnLoad, void(const GURL& url)); |
42 MOCK_METHOD3(OnMessageFromChromeFrame, void(const std::string& message, | 42 MOCK_METHOD3(OnMessageFromChromeFrame, void(const std::string& message, |
43 const std::string& origin, const std::string& target)); | 43 const std::string& origin, const std::string& target)); |
44 MOCK_METHOD3(OnHandleContextMenu, void(HANDLE menu_handle, int align_flags, | 44 MOCK_METHOD3(OnHandleContextMenu, void(HANDLE menu_handle, int align_flags, |
45 const IPC::MiniContextMenuParams& params)); | 45 const MiniContextMenuParams& params)); |
46 MOCK_METHOD1(OnHandleAccelerator, void(const MSG& accel_message)); | 46 MOCK_METHOD1(OnHandleAccelerator, void(const MSG& accel_message)); |
47 MOCK_METHOD1(OnTabbedOut, void(bool reverse)); | 47 MOCK_METHOD1(OnTabbedOut, void(bool reverse)); |
48 MOCK_METHOD1(OnGoToHistoryOffset, void(int offset)); | 48 MOCK_METHOD1(OnGoToHistoryOffset, void(int offset)); |
49 MOCK_METHOD3(OnOpenURL, void(const GURL& url_to_open, const GURL& referrer, | 49 MOCK_METHOD3(OnOpenURL, void(const GURL& url_to_open, const GURL& referrer, |
50 int open_disposition)); | 50 int open_disposition)); |
51 }; | 51 }; |
52 | 52 |
53 struct MockProxy : public ChromeProxy { | 53 struct MockProxy : public ChromeProxy { |
54 MOCK_METHOD1(RemoveBrowsingData, void(int remove_mask)); | 54 MOCK_METHOD1(RemoveBrowsingData, void(int remove_mask)); |
55 MOCK_METHOD3(InstallExtension, void(ChromeProxyDelegate* delegate, | 55 MOCK_METHOD3(InstallExtension, void(ChromeProxyDelegate* delegate, |
56 const FilePath& crx_path, SyncMessageContext* ctx)); | 56 const FilePath& crx_path, SyncMessageContext* ctx)); |
57 MOCK_METHOD3(LoadExtension, void(ChromeProxyDelegate* delegate, | 57 MOCK_METHOD3(LoadExtension, void(ChromeProxyDelegate* delegate, |
58 const FilePath& path, SyncMessageContext* ctx)); | 58 const FilePath& path, SyncMessageContext* ctx)); |
59 MOCK_METHOD2(GetEnabledExtensions, void(ChromeProxyDelegate* delegate, | 59 MOCK_METHOD2(GetEnabledExtensions, void(ChromeProxyDelegate* delegate, |
60 SyncMessageContext* ctx)); | 60 SyncMessageContext* ctx)); |
61 MOCK_METHOD1(SetProxyConfig, void(const std::string& json_encoded_settings)); | 61 MOCK_METHOD1(SetProxyConfig, void(const std::string& json_encoded_settings)); |
62 | 62 |
63 MOCK_METHOD2(CreateTab, void(ChromeProxyDelegate* delegate, | 63 MOCK_METHOD2(CreateTab, void(ChromeProxyDelegate* delegate, |
64 const IPC::ExternalTabSettings& settings)); | 64 const ExternalTabSettings& settings)); |
65 MOCK_METHOD3(ConnectTab, void(ChromeProxyDelegate* delegate, HWND hwnd, | 65 MOCK_METHOD3(ConnectTab, void(ChromeProxyDelegate* delegate, HWND hwnd, |
66 uint64 cookie)); | 66 uint64 cookie)); |
67 MOCK_METHOD1(BlockTab, void(uint64 cookie)); | 67 MOCK_METHOD1(BlockTab, void(uint64 cookie)); |
68 | 68 |
69 MOCK_METHOD4(Tab_PostMessage, void(int tab, const std::string& message, | 69 MOCK_METHOD4(Tab_PostMessage, void(int tab, const std::string& message, |
70 const std::string& origin, const std::string& target)); | 70 const std::string& origin, const std::string& target)); |
71 MOCK_METHOD1(Tab_Reload, void(int tab)); | 71 MOCK_METHOD1(Tab_Reload, void(int tab)); |
72 MOCK_METHOD1(Tab_Stop, void(int tab)); | 72 MOCK_METHOD1(Tab_Stop, void(int tab)); |
73 MOCK_METHOD1(Tab_SaveAs, void(int tab)); | 73 MOCK_METHOD1(Tab_SaveAs, void(int tab)); |
74 MOCK_METHOD1(Tab_Print, void(int tab)); | 74 MOCK_METHOD1(Tab_Print, void(int tab)); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 } | 134 } |
135 | 135 |
136 void Fire_CompletedCreateTab(bool success, HWND chrome_wnd, HWND tab_window, | 136 void Fire_CompletedCreateTab(bool success, HWND chrome_wnd, HWND tab_window, |
137 int tab_handle, int session_id, | 137 int tab_handle, int session_id, |
138 base::TimeDelta delay) { | 138 base::TimeDelta delay) { |
139 ipc_loop_->PostDelayedTask(FROM_HERE, NewRunnableMethod(delegate_, | 139 ipc_loop_->PostDelayedTask(FROM_HERE, NewRunnableMethod(delegate_, |
140 &ChromeProxyDelegate::Completed_CreateTab, success, chrome_wnd, | 140 &ChromeProxyDelegate::Completed_CreateTab, success, chrome_wnd, |
141 tab_window, tab_handle, session_id), delay.InMilliseconds()); | 141 tab_window, tab_handle, session_id), delay.InMilliseconds()); |
142 } | 142 } |
143 | 143 |
144 void Fire_TabLoaded(const GURL& url, base::TimeDelta delay) { | |
145 ipc_loop_->PostDelayedTask(FROM_HERE, NewRunnableMethod(delegate_, | |
146 &ChromeProxyDelegate::TabLoaded, url), delay.InMilliseconds()); | |
147 } | |
148 | |
149 private: | 144 private: |
150 ChromeProxyDelegate* delegate_; | 145 ChromeProxyDelegate* delegate_; |
151 base::Thread ipc_thread_; | 146 base::Thread ipc_thread_; |
152 MessageLoop* ipc_loop_; | 147 MessageLoop* ipc_loop_; |
153 }; | 148 }; |
154 | 149 |
155 // We may want the same test with 'real' proxy and mock 'proxy traits'. | 150 // We may want the same test with 'real' proxy and mock 'proxy traits'. |
156 TEST(ExternalTabProxy, CancelledCreateTab) { | 151 TEST(ExternalTabProxy, CancelledCreateTab) { |
157 MockUIDelegate ui_delegate; | 152 MockUIDelegate ui_delegate; |
158 StrictMock<MockFactory> factory; | 153 StrictMock<MockFactory> factory; |
(...skipping 25 matching lines...) Expand all Loading... |
184 CreateTabParams tab_params; | 179 CreateTabParams tab_params; |
185 tab_params.is_incognito = true; | 180 tab_params.is_incognito = true; |
186 tab_params.is_widget_mode = false; | 181 tab_params.is_widget_mode = false; |
187 tab_params.url = GURL("http://Xanadu.org"); | 182 tab_params.url = GURL("http://Xanadu.org"); |
188 | 183 |
189 tab->CreateTab(tab_params, &ui_delegate); | 184 tab->CreateTab(tab_params, &ui_delegate); |
190 loop.RunFor(5); | 185 loop.RunFor(5); |
191 EXPECT_FALSE(loop.WasTimedOut()); | 186 EXPECT_FALSE(loop.WasTimedOut()); |
192 tab.reset(); | 187 tab.reset(); |
193 } | 188 } |
194 | |
195 // CreateTab with initial url, and the navigate to different url before | |
196 // initialization completes. | |
197 TEST(ExternalTabProxy, NavigateAfterCreate) { | |
198 MockUIDelegate ui_delegate; | |
199 StrictMock<MockFactory> factory; | |
200 scoped_ptr<ExternalTabProxy> tab(new ExternalTabProxy()); | |
201 AsyncEventCreator async_events(tab.get()); | |
202 StrictMock<MockProxy>* proxy = new StrictMock<MockProxy>(); | |
203 TimedMsgLoop loop; | |
204 tab->set_proxy_factory(&factory); | |
205 GURL initial_url("http://Xanadu.org"); | |
206 GURL real_url("http://asgard.org"); | |
207 | |
208 EXPECT_CALL(factory, CreateProxy()).WillOnce(Return(proxy)); | |
209 EXPECT_CALL(*proxy, Init(_)); | |
210 EXPECT_CALL(*proxy, AddDelegate(tab.get())) | |
211 .WillOnce(DoAll(InvokeWithoutArgs(CreateFunctor(&async_events, | |
212 &AsyncEventCreator::Fire_Connected, proxy, | |
213 base::TimeDelta::FromMilliseconds(30))), | |
214 Return(1))); | |
215 | |
216 EXPECT_CALL(*proxy, CreateTab(tab.get(), | |
217 Field(&IPC::ExternalTabSettings::initial_url, real_url))) | |
218 .WillOnce(DoAll( | |
219 InvokeWithoutArgs(CreateFunctor(&async_events, | |
220 &AsyncEventCreator::Fire_CompletedCreateTab, | |
221 true, HWND(0), HWND(0), 7, 0, base::TimeDelta::FromMilliseconds(9))), | |
222 InvokeWithoutArgs(CreateFunctor(&async_events, | |
223 &AsyncEventCreator::Fire_TabLoaded, real_url, | |
224 base::TimeDelta::FromMilliseconds(150))))); | |
225 | |
226 EXPECT_CALL(ui_delegate, OnLoad(real_url)) | |
227 .WillOnce(QUIT_LOOP(loop)); | |
228 | |
229 EXPECT_CALL(*proxy, RemoveDelegate(_)) | |
230 .WillOnce(DoAll(InvokeWithoutArgs(CreateFunctor(&async_events, | |
231 &AsyncEventCreator::Fire_Disconnected, | |
232 base::TimeDelta::FromMilliseconds(0))), | |
233 Return(0))); | |
234 | |
235 CreateTabParams tab_params; | |
236 tab_params.is_incognito = true; | |
237 tab_params.is_widget_mode = false; | |
238 tab_params.url = initial_url; | |
239 | |
240 NavigationConstraintsImpl navigation_constraints; | |
241 | |
242 tab->CreateTab(tab_params, &ui_delegate); | |
243 tab->Navigate("http://asgard.org", EmptyString(), | |
244 &navigation_constraints); | |
245 | |
246 loop.RunFor(5); | |
247 EXPECT_FALSE(loop.WasTimedOut()); | |
248 tab.reset(); | |
249 } | |
OLD | NEW |