OLD | NEW |
1 // Copyright (c) 2009 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/chrome_frame_automation.h" | 5 #include "chrome_frame/chrome_frame_automation.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
11 #include "base/file_version_info.h" | 11 #include "base/file_version_info.h" |
12 #include "base/lock.h" | 12 #include "base/lock.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/path_service.h" | 14 #include "base/path_service.h" |
15 #include "base/process_util.h" | 15 #include "base/process_util.h" |
16 #include "base/singleton.h" | 16 #include "base/singleton.h" |
17 #include "base/string_util.h" | 17 #include "base/string_util.h" |
18 #include "base/sys_info.h" | 18 #include "base/sys_info.h" |
19 #include "base/waitable_event.h" | 19 #include "base/waitable_event.h" |
20 #include "chrome/app/client_util.h" | 20 #include "chrome/app/client_util.h" |
21 #include "chrome/common/chrome_constants.h" | 21 #include "chrome/common/chrome_constants.h" |
22 #include "chrome/common/chrome_paths.h" | |
23 #include "chrome/common/chrome_paths_internal.h" | |
24 #include "chrome/common/chrome_switches.h" | 22 #include "chrome/common/chrome_switches.h" |
25 #include "chrome/test/automation/tab_proxy.h" | 23 #include "chrome/test/automation/tab_proxy.h" |
26 #include "chrome_frame/chrome_launcher.h" | 24 #include "chrome_frame/chrome_launcher.h" |
27 #include "chrome_frame/utils.h" | 25 #include "chrome_frame/utils.h" |
28 #include "chrome_frame/sync_msg_reply_dispatcher.h" | 26 #include "chrome_frame/sync_msg_reply_dispatcher.h" |
29 | 27 |
30 #ifdef NDEBUG | 28 #ifdef NDEBUG |
31 int64 kAutomationServerReasonableLaunchDelay = 1000; // in milliseconds | 29 int64 kAutomationServerReasonableLaunchDelay = 1000; // in milliseconds |
32 #else | 30 #else |
33 int64 kAutomationServerReasonableLaunchDelay = 1000 * 10; | 31 int64 kAutomationServerReasonableLaunchDelay = 1000 * 10; |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 command_line->AppendSwitch(switches::kNoErrorDialogs); | 262 command_line->AppendSwitch(switches::kNoErrorDialogs); |
265 #endif | 263 #endif |
266 | 264 |
267 command_line->AppendSwitch(switches::kEnableRendererAccessibility); | 265 command_line->AppendSwitch(switches::kEnableRendererAccessibility); |
268 | 266 |
269 // In headless mode runs like reliability test runs we want full crash dumps | 267 // In headless mode runs like reliability test runs we want full crash dumps |
270 // from chrome. | 268 // from chrome. |
271 if (IsHeadlessMode()) | 269 if (IsHeadlessMode()) |
272 command_line->AppendSwitch(switches::kFullMemoryCrashReport); | 270 command_line->AppendSwitch(switches::kFullMemoryCrashReport); |
273 | 271 |
274 // Place the profile directory in | 272 DLOG(INFO) << "Profile path: " << params.profile_path.value(); |
275 // "<chrome_exe_path>\..\User Data\<profile-name>" | 273 command_line->AppendSwitchWithValue(switches::kUserDataDir, |
276 if (!entry->profile_name.empty()) { | 274 params.profile_path.value()); |
277 FilePath profile_path; | |
278 if (chrome::GetChromeFrameUserDataDirectory(&profile_path)) { | |
279 profile_path = profile_path.Append(entry->profile_name); | |
280 command_line->AppendSwitchWithValue(switches::kUserDataDir, | |
281 profile_path.value()); | |
282 } else { | |
283 // Can't get the profile dir :-( We need one to work, so fail. | |
284 // We have no code for launch failure. | |
285 entry->launch_result = AutomationLaunchResult(-1); | |
286 } | |
287 } | |
288 | 275 |
289 std::wstring command_line_string(command_line->command_line_string()); | 276 std::wstring command_line_string(command_line->command_line_string()); |
290 // If there are any extra arguments, append them to the command line. | 277 // If there are any extra arguments, append them to the command line. |
291 if (!params.extra_chrome_arguments.empty()) { | 278 if (!params.extra_chrome_arguments.empty()) { |
292 command_line_string += L' ' + params.extra_chrome_arguments; | 279 command_line_string += L' ' + params.extra_chrome_arguments; |
293 } | 280 } |
294 | 281 |
295 automation_server_launch_start_time_ = base::TimeTicks::Now(); | 282 automation_server_launch_start_time_ = base::TimeTicks::Now(); |
296 | 283 |
297 if (!base::LaunchApp(command_line_string, false, false, NULL)) { | 284 if (!base::LaunchApp(command_line_string, false, false, NULL)) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 AUTOMATION_CREATE_TAB_FAILED, | 319 AUTOMATION_CREATE_TAB_FAILED, |
333 AUTOMATION_CREATE_TAB_FAILED + 1); | 320 AUTOMATION_CREATE_TAB_FAILED + 1); |
334 } | 321 } |
335 | 322 |
336 // Finally set the proxy. | 323 // Finally set the proxy. |
337 entry->proxy = proxy; | 324 entry->proxy = proxy; |
338 delegate->LaunchComplete(proxy, entry->launch_result); | 325 delegate->LaunchComplete(proxy, entry->launch_result); |
339 } | 326 } |
340 | 327 |
341 bool ProxyFactory::ReleaseAutomationServer(void* server_id) { | 328 bool ProxyFactory::ReleaseAutomationServer(void* server_id) { |
342 DLOG(INFO) << __FUNCTION__; | |
343 | |
344 if (!server_id) { | 329 if (!server_id) { |
345 NOTREACHED(); | 330 NOTREACHED(); |
346 return false; | 331 return false; |
347 } | 332 } |
348 | 333 |
349 ProxyCacheEntry* entry = reinterpret_cast<ProxyCacheEntry*>(server_id); | 334 ProxyCacheEntry* entry = reinterpret_cast<ProxyCacheEntry*>(server_id); |
350 | 335 |
351 #ifndef NDEBUG | 336 #ifndef NDEBUG |
352 lock_.Acquire(); | 337 lock_.Acquire(); |
353 Vector::ContainerType::iterator it = std::find(proxies_.container().begin(), | 338 Vector::ContainerType::iterator it = std::find(proxies_.container().begin(), |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 | 435 |
451 ChromeFrameAutomationClient::~ChromeFrameAutomationClient() { | 436 ChromeFrameAutomationClient::~ChromeFrameAutomationClient() { |
452 // Uninitialize must be called prior to the destructor | 437 // Uninitialize must be called prior to the destructor |
453 DCHECK(automation_server_ == NULL); | 438 DCHECK(automation_server_ == NULL); |
454 } | 439 } |
455 | 440 |
456 bool ChromeFrameAutomationClient::Initialize( | 441 bool ChromeFrameAutomationClient::Initialize( |
457 ChromeFrameDelegate* chrome_frame_delegate, | 442 ChromeFrameDelegate* chrome_frame_delegate, |
458 int automation_server_launch_timeout, | 443 int automation_server_launch_timeout, |
459 bool perform_version_check, | 444 bool perform_version_check, |
460 const std::wstring& profile_name, | 445 const FilePath& profile_path, |
461 const std::wstring& extra_chrome_arguments, | 446 const std::wstring& extra_chrome_arguments, |
462 bool incognito) { | 447 bool incognito) { |
463 DCHECK(!IsWindow()); | 448 DCHECK(!IsWindow()); |
464 chrome_frame_delegate_ = chrome_frame_delegate; | 449 chrome_frame_delegate_ = chrome_frame_delegate; |
465 ui_thread_id_ = PlatformThread::CurrentId(); | 450 ui_thread_id_ = PlatformThread::CurrentId(); |
466 #ifndef NDEBUG | 451 #ifndef NDEBUG |
467 // In debug mode give more time to work with a debugger. | 452 // In debug mode give more time to work with a debugger. |
468 if (IsDebuggerPresent()) { | 453 if (IsDebuggerPresent()) { |
469 // Don't use INFINITE (which is -1) or even MAXINT since we will convert | 454 // Don't use INFINITE (which is -1) or even MAXINT since we will convert |
470 // from milliseconds to microseconds when stored in a base::TimeDelta, | 455 // from milliseconds to microseconds when stored in a base::TimeDelta, |
(...skipping 19 matching lines...) Expand all Loading... |
490 // Keep object in memory, while the window is alive. | 475 // Keep object in memory, while the window is alive. |
491 // Corresponsing Release is in OnFinalMessage(); | 476 // Corresponsing Release is in OnFinalMessage(); |
492 AddRef(); | 477 AddRef(); |
493 | 478 |
494 // Mark our state as initializing. We'll reach initialized once | 479 // Mark our state as initializing. We'll reach initialized once |
495 // InitializeComplete is called successfully. | 480 // InitializeComplete is called successfully. |
496 init_state_ = INITIALIZING; | 481 init_state_ = INITIALIZING; |
497 | 482 |
498 chrome_launch_params_.automation_server_launch_timeout = | 483 chrome_launch_params_.automation_server_launch_timeout = |
499 automation_server_launch_timeout; | 484 automation_server_launch_timeout; |
500 chrome_launch_params_.profile_name = profile_name; | 485 chrome_launch_params_.profile_path = profile_path; |
| 486 chrome_launch_params_.profile_name = profile_path.BaseName().value(); |
501 chrome_launch_params_.extra_chrome_arguments = extra_chrome_arguments; | 487 chrome_launch_params_.extra_chrome_arguments = extra_chrome_arguments; |
502 chrome_launch_params_.perform_version_check = perform_version_check; | 488 chrome_launch_params_.perform_version_check = perform_version_check; |
503 chrome_launch_params_.url = navigate_after_initialization_ ? GURL() : url_; | 489 chrome_launch_params_.url = navigate_after_initialization_ ? GURL() : url_; |
504 chrome_launch_params_.incognito_mode = incognito; | 490 chrome_launch_params_.incognito_mode = incognito; |
505 | 491 |
506 proxy_factory_->GetAutomationServer( | 492 proxy_factory_->GetAutomationServer( |
507 static_cast<ProxyFactory::LaunchDelegate*>(this), | 493 static_cast<ProxyFactory::LaunchDelegate*>(this), |
508 chrome_launch_params_, &automation_server_id_); | 494 chrome_launch_params_, &automation_server_id_); |
509 | 495 |
510 return true; | 496 return true; |
511 } | 497 } |
512 | 498 |
513 void ChromeFrameAutomationClient::Uninitialize() { | 499 void ChromeFrameAutomationClient::Uninitialize() { |
514 DLOG(INFO) << __FUNCTION__; | |
515 | |
516 if (init_state_ == UNINITIALIZED) { | 500 if (init_state_ == UNINITIALIZED) { |
517 DLOG(WARNING) << __FUNCTION__ << ": Automation client not initialized"; | 501 DLOG(WARNING) << __FUNCTION__ << ": Automation client not initialized"; |
518 return; | 502 return; |
519 } | 503 } |
520 | 504 |
521 init_state_ = UNINITIALIZING; | 505 init_state_ = UNINITIALIZING; |
522 | 506 |
523 // Called from client's FinalRelease() / destructor | 507 // Called from client's FinalRelease() / destructor |
524 // ChromeFrameAutomationClient may wait for the initialization (launch) | 508 // ChromeFrameAutomationClient may wait for the initialization (launch) |
525 // to complete while Uninitialize is called. | 509 // to complete while Uninitialize is called. |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 // Continue with Initialization - Create external tab | 907 // Continue with Initialization - Create external tab |
924 CreateExternalTab(); | 908 CreateExternalTab(); |
925 } else { | 909 } else { |
926 // Send a notification to Chrome that we are ready to connect to the | 910 // Send a notification to Chrome that we are ready to connect to the |
927 // ExternalTab. | 911 // ExternalTab. |
928 IPC::SyncMessage* message = | 912 IPC::SyncMessage* message = |
929 new AutomationMsg_ConnectExternalTab(0, external_tab_cookie_, true, | 913 new AutomationMsg_ConnectExternalTab(0, external_tab_cookie_, true, |
930 NULL, NULL, NULL); | 914 NULL, NULL, NULL); |
931 automation_server_->SendAsAsync(message, NewCallback(this, | 915 automation_server_->SendAsAsync(message, NewCallback(this, |
932 &ChromeFrameAutomationClient::CreateExternalTabComplete), this); | 916 &ChromeFrameAutomationClient::CreateExternalTabComplete), this); |
| 917 DLOG(INFO) << __FUNCTION__ << ": sending CreateExternalTabComplete"; |
933 } | 918 } |
934 } | 919 } |
935 } else { | 920 } else { |
936 // Launch failed. Note, we cannot delete proxy here. | 921 // Launch failed. Note, we cannot delete proxy here. |
937 PostTask(FROM_HERE, NewRunnableMethod(this, | 922 PostTask(FROM_HERE, NewRunnableMethod(this, |
938 &ChromeFrameAutomationClient::InitializeComplete, result)); | 923 &ChromeFrameAutomationClient::InitializeComplete, result)); |
939 } | 924 } |
940 } | 925 } |
941 | 926 |
942 void ChromeFrameAutomationClient::InitializeComplete( | 927 void ChromeFrameAutomationClient::InitializeComplete( |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 ::GetClientRect(parent_window, &parent_client_rect); | 1077 ::GetClientRect(parent_window, &parent_client_rect); |
1093 int width = parent_client_rect.right - parent_client_rect.left; | 1078 int width = parent_client_rect.right - parent_client_rect.left; |
1094 int height = parent_client_rect.bottom - parent_client_rect.top; | 1079 int height = parent_client_rect.bottom - parent_client_rect.top; |
1095 | 1080 |
1096 Resize(width, height, SWP_SHOWWINDOW | SWP_NOZORDER); | 1081 Resize(width, height, SWP_SHOWWINDOW | SWP_NOZORDER); |
1097 } | 1082 } |
1098 } | 1083 } |
1099 } | 1084 } |
1100 | 1085 |
1101 void ChromeFrameAutomationClient::ReleaseAutomationServer() { | 1086 void ChromeFrameAutomationClient::ReleaseAutomationServer() { |
1102 DLOG(INFO) << __FUNCTION__; | |
1103 if (automation_server_id_) { | 1087 if (automation_server_id_) { |
1104 // Cache the server id and clear the automation_server_id_ before | 1088 // Cache the server id and clear the automation_server_id_ before |
1105 // calling ReleaseAutomationServer. The reason we do this is that | 1089 // calling ReleaseAutomationServer. The reason we do this is that |
1106 // we must cancel pending messages before we release the automation server. | 1090 // we must cancel pending messages before we release the automation server. |
1107 // Furthermore, while ReleaseAutomationServer is running, we could get | 1091 // Furthermore, while ReleaseAutomationServer is running, we could get |
1108 // a callback to LaunchComplete which is where we normally get our pointer | 1092 // a callback to LaunchComplete which is where we normally get our pointer |
1109 // to the automation server and there we check the server id for NULLness | 1093 // to the automation server and there we check the server id for NULLness |
1110 // and do nothing if it is NULL. | 1094 // and do nothing if it is NULL. |
1111 void* server_id = automation_server_id_; | 1095 void* server_id = automation_server_id_; |
1112 automation_server_id_ = NULL; | 1096 automation_server_id_ = NULL; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 font_size > LARGEST_FONT) { | 1194 font_size > LARGEST_FONT) { |
1211 NOTREACHED() << "Invalid font size specified : " | 1195 NOTREACHED() << "Invalid font size specified : " |
1212 << font_size; | 1196 << font_size; |
1213 return; | 1197 return; |
1214 } | 1198 } |
1215 | 1199 |
1216 automation_server_->Send( | 1200 automation_server_->Send( |
1217 new AutomationMsg_SetPageFontSize(0, tab_handle_, font_size)); | 1201 new AutomationMsg_SetPageFontSize(0, tab_handle_, font_size)); |
1218 } | 1202 } |
1219 | 1203 |
| 1204 void ChromeFrameAutomationClient::RemoveBrowsingData(int remove_mask) { |
| 1205 automation_server_->Send( |
| 1206 new AutomationMsg_RemoveBrowsingData(0, remove_mask)); |
| 1207 } |
1220 | 1208 |
1221 ////////////////////////////////////////////////////////////////////////// | 1209 ////////////////////////////////////////////////////////////////////////// |
1222 // PluginUrlRequestDelegate implementation. | 1210 // PluginUrlRequestDelegate implementation. |
1223 // Forward network related responses to Chrome. | 1211 // Forward network related responses to Chrome. |
1224 | 1212 |
1225 void ChromeFrameAutomationClient::OnResponseStarted(int request_id, | 1213 void ChromeFrameAutomationClient::OnResponseStarted(int request_id, |
1226 const char* mime_type, const char* headers, int size, | 1214 const char* mime_type, const char* headers, int size, |
1227 base::Time last_modified, const std::string& redirect_url, | 1215 base::Time last_modified, const std::string& redirect_url, |
1228 int redirect_status) { | 1216 int redirect_status) { |
1229 const IPC::AutomationURLResponse response = { | 1217 const IPC::AutomationURLResponse response = { |
(...skipping 15 matching lines...) Expand all Loading... |
1245 automation_server_->Send(new AutomationMsg_RequestData(0, tab_->handle(), | 1233 automation_server_->Send(new AutomationMsg_RequestData(0, tab_->handle(), |
1246 request_id, data)); | 1234 request_id, data)); |
1247 } | 1235 } |
1248 | 1236 |
1249 void ChromeFrameAutomationClient::OnResponseEnd(int request_id, | 1237 void ChromeFrameAutomationClient::OnResponseEnd(int request_id, |
1250 const URLRequestStatus& status) { | 1238 const URLRequestStatus& status) { |
1251 automation_server_->Send(new AutomationMsg_RequestEnd(0, tab_->handle(), | 1239 automation_server_->Send(new AutomationMsg_RequestEnd(0, tab_->handle(), |
1252 request_id, status)); | 1240 request_id, status)); |
1253 } | 1241 } |
1254 | 1242 |
OLD | NEW |