| 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 |