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/chrome_frame_automation.h" | 5 #include "chrome_frame/chrome_frame_automation.h" |
6 | 6 |
7 #include "app/app_switches.h" | 7 #include "app/app_switches.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 DCHECK(!snapshots_); | 249 DCHECK(!snapshots_); |
250 snapshots_ = snapshots; | 250 snapshots_ = snapshots; |
251 uma_send_interval_ = send_interval; | 251 uma_send_interval_ = send_interval; |
252 thread_->message_loop()->PostDelayedTask(FROM_HERE, | 252 thread_->message_loop()->PostDelayedTask(FROM_HERE, |
253 NewRunnableMethod(this, &AutomationProxyCacheEntry::SendUMAData), | 253 NewRunnableMethod(this, &AutomationProxyCacheEntry::SendUMAData), |
254 send_interval); | 254 send_interval); |
255 } | 255 } |
256 | 256 |
257 void AutomationProxyCacheEntry::CreateProxy(ChromeFrameLaunchParams* params, | 257 void AutomationProxyCacheEntry::CreateProxy(ChromeFrameLaunchParams* params, |
258 LaunchDelegate* delegate) { | 258 LaunchDelegate* delegate) { |
259 DCHECK(IsSameThread(PlatformThread::CurrentId())); | 259 DCHECK(IsSameThread(base::PlatformThread::CurrentId())); |
260 DCHECK(delegate); | 260 DCHECK(delegate); |
261 DCHECK(params); | 261 DCHECK(params); |
262 DCHECK(proxy_.get() == NULL); | 262 DCHECK(proxy_.get() == NULL); |
263 | 263 |
264 // We *must* create automationproxy in a thread that has message loop, | 264 // We *must* create automationproxy in a thread that has message loop, |
265 // since SyncChannel::Context construction registers event to be watched | 265 // since SyncChannel::Context construction registers event to be watched |
266 // through ObjectWatcher which subscribes for the current thread message loop | 266 // through ObjectWatcher which subscribes for the current thread message loop |
267 // destruction notification. | 267 // destruction notification. |
268 | 268 |
269 // At same time we must destroy/stop the thread from another thread. | 269 // At same time we must destroy/stop the thread from another thread. |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 // Finally set the proxy. | 371 // Finally set the proxy. |
372 proxy_.reset(proxy); | 372 proxy_.reset(proxy); |
373 launch_delegates_.push_back(delegate); | 373 launch_delegates_.push_back(delegate); |
374 | 374 |
375 delegate->LaunchComplete(proxy_.get(), launch_result_); | 375 delegate->LaunchComplete(proxy_.get(), launch_result_); |
376 } | 376 } |
377 | 377 |
378 void AutomationProxyCacheEntry::RemoveDelegate(LaunchDelegate* delegate, | 378 void AutomationProxyCacheEntry::RemoveDelegate(LaunchDelegate* delegate, |
379 base::WaitableEvent* done, | 379 base::WaitableEvent* done, |
380 bool* was_last_delegate) { | 380 bool* was_last_delegate) { |
381 DCHECK(IsSameThread(PlatformThread::CurrentId())); | 381 DCHECK(IsSameThread(base::PlatformThread::CurrentId())); |
382 DCHECK(delegate); | 382 DCHECK(delegate); |
383 DCHECK(done); | 383 DCHECK(done); |
384 DCHECK(was_last_delegate); | 384 DCHECK(was_last_delegate); |
385 | 385 |
386 *was_last_delegate = false; | 386 *was_last_delegate = false; |
387 | 387 |
388 LaunchDelegates::iterator it = std::find(launch_delegates_.begin(), | 388 LaunchDelegates::iterator it = std::find(launch_delegates_.begin(), |
389 launch_delegates_.end(), delegate); | 389 launch_delegates_.end(), delegate); |
390 if (it == launch_delegates_.end()) { | 390 if (it == launch_delegates_.end()) { |
391 NOTREACHED(); | 391 NOTREACHED(); |
(...skipping 13 matching lines...) Expand all Loading... |
405 // Be careful to remove from the list after running pending | 405 // Be careful to remove from the list after running pending |
406 // tasks. Otherwise the delegate being removed might miss out | 406 // tasks. Otherwise the delegate being removed might miss out |
407 // on pending notifications such as LaunchComplete. | 407 // on pending notifications such as LaunchComplete. |
408 launch_delegates_.erase(it); | 408 launch_delegates_.erase(it); |
409 } | 409 } |
410 | 410 |
411 done->Signal(); | 411 done->Signal(); |
412 } | 412 } |
413 | 413 |
414 void AutomationProxyCacheEntry::AddDelegate(LaunchDelegate* delegate) { | 414 void AutomationProxyCacheEntry::AddDelegate(LaunchDelegate* delegate) { |
415 DCHECK(IsSameThread(PlatformThread::CurrentId())); | 415 DCHECK(IsSameThread(base::PlatformThread::CurrentId())); |
416 DCHECK(std::find(launch_delegates_.begin(), | 416 DCHECK(std::find(launch_delegates_.begin(), |
417 launch_delegates_.end(), | 417 launch_delegates_.end(), |
418 delegate) == launch_delegates_.end()) | 418 delegate) == launch_delegates_.end()) |
419 << "Same delegate being added twice"; | 419 << "Same delegate being added twice"; |
420 DCHECK(launch_result_ != AUTOMATION_LAUNCH_RESULT_INVALID); | 420 DCHECK(launch_result_ != AUTOMATION_LAUNCH_RESULT_INVALID); |
421 | 421 |
422 launch_delegates_.push_back(delegate); | 422 launch_delegates_.push_back(delegate); |
423 delegate->LaunchComplete(proxy_.get(), launch_result_); | 423 delegate->LaunchComplete(proxy_.get(), launch_result_); |
424 } | 424 } |
425 | 425 |
426 void AutomationProxyCacheEntry::OnChannelError() { | 426 void AutomationProxyCacheEntry::OnChannelError() { |
427 DCHECK(IsSameThread(PlatformThread::CurrentId())); | 427 DCHECK(IsSameThread(base::PlatformThread::CurrentId())); |
428 launch_result_ = AUTOMATION_SERVER_CRASHED; | 428 launch_result_ = AUTOMATION_SERVER_CRASHED; |
429 LaunchDelegates::const_iterator it = launch_delegates_.begin(); | 429 LaunchDelegates::const_iterator it = launch_delegates_.begin(); |
430 for (; it != launch_delegates_.end(); ++it) { | 430 for (; it != launch_delegates_.end(); ++it) { |
431 (*it)->AutomationServerDied(); | 431 (*it)->AutomationServerDied(); |
432 } | 432 } |
433 } | 433 } |
434 | 434 |
435 void AutomationProxyCacheEntry::SendUMAData() { | 435 void AutomationProxyCacheEntry::SendUMAData() { |
436 DCHECK(IsSameThread(PlatformThread::CurrentId())); | 436 DCHECK(IsSameThread(base::PlatformThread::CurrentId())); |
437 DCHECK(snapshots_); | 437 DCHECK(snapshots_); |
438 // IE uses the chrome frame provided UMA data uploading scheme. NPAPI | 438 // IE uses the chrome frame provided UMA data uploading scheme. NPAPI |
439 // continues to use Chrome to upload UMA data. | 439 // continues to use Chrome to upload UMA data. |
440 if (CrashMetricsReporter::GetInstance()->active()) { | 440 if (CrashMetricsReporter::GetInstance()->active()) { |
441 return; | 441 return; |
442 } | 442 } |
443 | 443 |
444 if (!proxy_.get()) { | 444 if (!proxy_.get()) { |
445 DLOG(WARNING) << __FUNCTION__ << " NULL proxy, can't send UMA data"; | 445 DLOG(WARNING) << __FUNCTION__ << " NULL proxy, can't send UMA data"; |
446 } else { | 446 } else { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 uma_send_interval_); | 502 uma_send_interval_); |
503 } | 503 } |
504 } else if (delegate) { | 504 } else if (delegate) { |
505 // Notify the new delegate of the launch status from the worker thread | 505 // Notify the new delegate of the launch status from the worker thread |
506 // and add it to the list of delegates. | 506 // and add it to the list of delegates. |
507 entry->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(entry.get(), | 507 entry->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(entry.get(), |
508 &AutomationProxyCacheEntry::AddDelegate, delegate)); | 508 &AutomationProxyCacheEntry::AddDelegate, delegate)); |
509 } | 509 } |
510 | 510 |
511 DCHECK(automation_server_id != NULL); | 511 DCHECK(automation_server_id != NULL); |
512 DCHECK(!entry->IsSameThread(PlatformThread::CurrentId())); | 512 DCHECK(!entry->IsSameThread(base::PlatformThread::CurrentId())); |
513 | 513 |
514 *automation_server_id = entry; | 514 *automation_server_id = entry; |
515 } | 515 } |
516 | 516 |
517 bool ProxyFactory::ReleaseAutomationServer(void* server_id, | 517 bool ProxyFactory::ReleaseAutomationServer(void* server_id, |
518 LaunchDelegate* delegate) { | 518 LaunchDelegate* delegate) { |
519 if (!server_id) { | 519 if (!server_id) { |
520 NOTREACHED(); | 520 NOTREACHED(); |
521 return false; | 521 return false; |
522 } | 522 } |
523 | 523 |
524 AutomationProxyCacheEntry* entry = | 524 AutomationProxyCacheEntry* entry = |
525 reinterpret_cast<AutomationProxyCacheEntry*>(server_id); | 525 reinterpret_cast<AutomationProxyCacheEntry*>(server_id); |
526 | 526 |
527 #ifndef NDEBUG | 527 #ifndef NDEBUG |
528 lock_.Acquire(); | 528 lock_.Acquire(); |
529 Vector::ContainerType::iterator it = std::find(proxies_.container().begin(), | 529 Vector::ContainerType::iterator it = std::find(proxies_.container().begin(), |
530 proxies_.container().end(), | 530 proxies_.container().end(), |
531 entry); | 531 entry); |
532 DCHECK(it != proxies_.container().end()); | 532 DCHECK(it != proxies_.container().end()); |
533 DCHECK(!entry->IsSameThread(PlatformThread::CurrentId())); | 533 DCHECK(!entry->IsSameThread(base::PlatformThread::CurrentId())); |
534 | 534 |
535 lock_.Release(); | 535 lock_.Release(); |
536 #endif | 536 #endif |
537 | 537 |
538 // AddRef the entry object as we might need to take it out of the proxy | 538 // AddRef the entry object as we might need to take it out of the proxy |
539 // stack and then uninitialize the entry. | 539 // stack and then uninitialize the entry. |
540 entry->AddRef(); | 540 entry->AddRef(); |
541 | 541 |
542 bool last_delegate = false; | 542 bool last_delegate = false; |
543 if (delegate) { | 543 if (delegate) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 #ifndef NDEBUG | 606 #ifndef NDEBUG |
607 if (chrome_launch_params_ && chrome_launch_params_ != chrome_launch_params) { | 607 if (chrome_launch_params_ && chrome_launch_params_ != chrome_launch_params) { |
608 DCHECK_EQ(chrome_launch_params_->url(), chrome_launch_params->url()); | 608 DCHECK_EQ(chrome_launch_params_->url(), chrome_launch_params->url()); |
609 DCHECK_EQ(chrome_launch_params_->referrer(), | 609 DCHECK_EQ(chrome_launch_params_->referrer(), |
610 chrome_launch_params->referrer()); | 610 chrome_launch_params->referrer()); |
611 } | 611 } |
612 #endif | 612 #endif |
613 | 613 |
614 chrome_launch_params_ = chrome_launch_params; | 614 chrome_launch_params_ = chrome_launch_params; |
615 | 615 |
616 ui_thread_id_ = PlatformThread::CurrentId(); | 616 ui_thread_id_ = base::PlatformThread::CurrentId(); |
617 #ifndef NDEBUG | 617 #ifndef NDEBUG |
618 // In debug mode give more time to work with a debugger. | 618 // In debug mode give more time to work with a debugger. |
619 if (IsDebuggerPresent()) { | 619 if (IsDebuggerPresent()) { |
620 // Don't use INFINITE (which is -1) or even MAXINT since we will convert | 620 // Don't use INFINITE (which is -1) or even MAXINT since we will convert |
621 // from milliseconds to microseconds when stored in a base::TimeDelta, | 621 // from milliseconds to microseconds when stored in a base::TimeDelta, |
622 // thus * 1000. An hour should be enough. | 622 // thus * 1000. An hour should be enough. |
623 chrome_launch_params_->set_launch_timeout(60 * 60 * 1000); | 623 chrome_launch_params_->set_launch_timeout(60 * 60 * 1000); |
624 } else { | 624 } else { |
625 DCHECK_LT(chrome_launch_params_->launch_timeout(), | 625 DCHECK_LT(chrome_launch_params_->launch_timeout(), |
626 MAXINT / 2000); | 626 MAXINT / 2000); |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 IPC::SyncMessage* msg = new AutomationMsg_InstallExtension(crx_path, NULL); | 861 IPC::SyncMessage* msg = new AutomationMsg_InstallExtension(crx_path, NULL); |
862 | 862 |
863 // The context will delete itself after it is called. | 863 // The context will delete itself after it is called. |
864 automation_server_->SendAsAsync(msg, ctx, this); | 864 automation_server_->SendAsAsync(msg, ctx, this); |
865 } | 865 } |
866 | 866 |
867 void ChromeFrameAutomationClient::InstallExtensionComplete( | 867 void ChromeFrameAutomationClient::InstallExtensionComplete( |
868 const FilePath& crx_path, | 868 const FilePath& crx_path, |
869 void* user_data, | 869 void* user_data, |
870 AutomationMsg_ExtensionResponseValues res) { | 870 AutomationMsg_ExtensionResponseValues res) { |
871 DCHECK_EQ(PlatformThread::CurrentId(), ui_thread_id_); | 871 DCHECK_EQ(base::PlatformThread::CurrentId(), ui_thread_id_); |
872 | 872 |
873 if (chrome_frame_delegate_) { | 873 if (chrome_frame_delegate_) { |
874 chrome_frame_delegate_->OnExtensionInstalled(crx_path, user_data, res); | 874 chrome_frame_delegate_->OnExtensionInstalled(crx_path, user_data, res); |
875 } | 875 } |
876 } | 876 } |
877 | 877 |
878 void ChromeFrameAutomationClient::GetEnabledExtensions(void* user_data) { | 878 void ChromeFrameAutomationClient::GetEnabledExtensions(void* user_data) { |
879 if (automation_server_ == NULL) { | 879 if (automation_server_ == NULL) { |
880 GetEnabledExtensionsComplete(user_data, &std::vector<FilePath>()); | 880 GetEnabledExtensionsComplete(user_data, &std::vector<FilePath>()); |
881 return; | 881 return; |
882 } | 882 } |
883 | 883 |
884 GetEnabledExtensionsContext* ctx = new GetEnabledExtensionsContext( | 884 GetEnabledExtensionsContext* ctx = new GetEnabledExtensionsContext( |
885 this, user_data); | 885 this, user_data); |
886 | 886 |
887 IPC::SyncMessage* msg = new AutomationMsg_GetEnabledExtensions( | 887 IPC::SyncMessage* msg = new AutomationMsg_GetEnabledExtensions( |
888 ctx->extension_directories()); | 888 ctx->extension_directories()); |
889 | 889 |
890 // The context will delete itself after it is called. | 890 // The context will delete itself after it is called. |
891 automation_server_->SendAsAsync(msg, ctx, this); | 891 automation_server_->SendAsAsync(msg, ctx, this); |
892 } | 892 } |
893 | 893 |
894 void ChromeFrameAutomationClient::GetEnabledExtensionsComplete( | 894 void ChromeFrameAutomationClient::GetEnabledExtensionsComplete( |
895 void* user_data, | 895 void* user_data, |
896 std::vector<FilePath>* extension_directories) { | 896 std::vector<FilePath>* extension_directories) { |
897 DCHECK_EQ(PlatformThread::CurrentId(), ui_thread_id_); | 897 DCHECK_EQ(base::PlatformThread::CurrentId(), ui_thread_id_); |
898 | 898 |
899 if (chrome_frame_delegate_) { | 899 if (chrome_frame_delegate_) { |
900 chrome_frame_delegate_->OnGetEnabledExtensionsComplete( | 900 chrome_frame_delegate_->OnGetEnabledExtensionsComplete( |
901 user_data, *extension_directories); | 901 user_data, *extension_directories); |
902 } | 902 } |
903 | 903 |
904 delete extension_directories; | 904 delete extension_directories; |
905 } | 905 } |
906 | 906 |
907 int ChromeFrameAutomationClient::GetSessionId() const { | 907 int ChromeFrameAutomationClient::GetSessionId() const { |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1057 PostTask(FROM_HERE, NewRunnableMethod(this, | 1057 PostTask(FROM_HERE, NewRunnableMethod(this, |
1058 &ChromeFrameAutomationClient::InitializeComplete, | 1058 &ChromeFrameAutomationClient::InitializeComplete, |
1059 AUTOMATION_SERVER_CRASHED)); | 1059 AUTOMATION_SERVER_CRASHED)); |
1060 // Then uninitialize. | 1060 // Then uninitialize. |
1061 PostTask(FROM_HERE, NewRunnableMethod(this, | 1061 PostTask(FROM_HERE, NewRunnableMethod(this, |
1062 &ChromeFrameAutomationClient::Uninitialize)); | 1062 &ChromeFrameAutomationClient::Uninitialize)); |
1063 } | 1063 } |
1064 | 1064 |
1065 void ChromeFrameAutomationClient::InitializeComplete( | 1065 void ChromeFrameAutomationClient::InitializeComplete( |
1066 AutomationLaunchResult result) { | 1066 AutomationLaunchResult result) { |
1067 DCHECK_EQ(PlatformThread::CurrentId(), ui_thread_id_); | 1067 DCHECK_EQ(base::PlatformThread::CurrentId(), ui_thread_id_); |
1068 if (result != AUTOMATION_SUCCESS) { | 1068 if (result != AUTOMATION_SUCCESS) { |
1069 DLOG(WARNING) << "InitializeComplete: failure " << result; | 1069 DLOG(WARNING) << "InitializeComplete: failure " << result; |
1070 ReleaseAutomationServer(); | 1070 ReleaseAutomationServer(); |
1071 } else { | 1071 } else { |
1072 init_state_ = INITIALIZED; | 1072 init_state_ = INITIALIZED; |
1073 | 1073 |
1074 // If the host already have a window, ask Chrome to re-parent. | 1074 // If the host already have a window, ask Chrome to re-parent. |
1075 if (parent_window_) | 1075 if (parent_window_) |
1076 SetParentWindow(parent_window_); | 1076 SetParentWindow(parent_window_); |
1077 | 1077 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1190 // Early check to avoid needless marshaling | 1190 // Early check to avoid needless marshaling |
1191 if (chrome_frame_delegate_ == NULL) | 1191 if (chrome_frame_delegate_ == NULL) |
1192 return; | 1192 return; |
1193 | 1193 |
1194 PostTask(FROM_HERE, NewRunnableMethod(this, | 1194 PostTask(FROM_HERE, NewRunnableMethod(this, |
1195 &ChromeFrameAutomationClient::OnChannelErrorUIThread)); | 1195 &ChromeFrameAutomationClient::OnChannelErrorUIThread)); |
1196 } | 1196 } |
1197 | 1197 |
1198 void ChromeFrameAutomationClient::OnMessageReceivedUIThread( | 1198 void ChromeFrameAutomationClient::OnMessageReceivedUIThread( |
1199 const IPC::Message& msg) { | 1199 const IPC::Message& msg) { |
1200 DCHECK_EQ(PlatformThread::CurrentId(), ui_thread_id_); | 1200 DCHECK_EQ(base::PlatformThread::CurrentId(), ui_thread_id_); |
1201 // Forward to the delegate. | 1201 // Forward to the delegate. |
1202 if (chrome_frame_delegate_) | 1202 if (chrome_frame_delegate_) |
1203 chrome_frame_delegate_->OnMessageReceived(msg); | 1203 chrome_frame_delegate_->OnMessageReceived(msg); |
1204 } | 1204 } |
1205 | 1205 |
1206 void ChromeFrameAutomationClient::OnChannelErrorUIThread() { | 1206 void ChromeFrameAutomationClient::OnChannelErrorUIThread() { |
1207 DCHECK_EQ(PlatformThread::CurrentId(), ui_thread_id_); | 1207 DCHECK_EQ(base::PlatformThread::CurrentId(), ui_thread_id_); |
1208 | 1208 |
1209 // Report a metric that something went wrong unexpectedly. | 1209 // Report a metric that something went wrong unexpectedly. |
1210 CrashMetricsReporter::GetInstance()->IncrementMetric( | 1210 CrashMetricsReporter::GetInstance()->IncrementMetric( |
1211 CrashMetricsReporter::CHANNEL_ERROR_COUNT); | 1211 CrashMetricsReporter::CHANNEL_ERROR_COUNT); |
1212 | 1212 |
1213 // Forward to the delegate. | 1213 // Forward to the delegate. |
1214 if (chrome_frame_delegate_) | 1214 if (chrome_frame_delegate_) |
1215 chrome_frame_delegate_->OnChannelError(); | 1215 chrome_frame_delegate_->OnChannelError(); |
1216 } | 1216 } |
1217 | 1217 |
1218 void ChromeFrameAutomationClient::ReportNavigationError( | 1218 void ChromeFrameAutomationClient::ReportNavigationError( |
1219 AutomationMsg_NavigationResponseValues error_code, | 1219 AutomationMsg_NavigationResponseValues error_code, |
1220 const std::string& url) { | 1220 const std::string& url) { |
1221 if (!chrome_frame_delegate_) | 1221 if (!chrome_frame_delegate_) |
1222 return; | 1222 return; |
1223 | 1223 |
1224 if (ui_thread_id_ == PlatformThread::CurrentId()) { | 1224 if (ui_thread_id_ == base::PlatformThread::CurrentId()) { |
1225 chrome_frame_delegate_->OnLoadFailed(error_code, url); | 1225 chrome_frame_delegate_->OnLoadFailed(error_code, url); |
1226 } else { | 1226 } else { |
1227 PostTask(FROM_HERE, NewRunnableMethod(this, | 1227 PostTask(FROM_HERE, NewRunnableMethod(this, |
1228 &ChromeFrameAutomationClient::ReportNavigationError, | 1228 &ChromeFrameAutomationClient::ReportNavigationError, |
1229 error_code, url)); | 1229 error_code, url)); |
1230 } | 1230 } |
1231 } | 1231 } |
1232 | 1232 |
1233 void ChromeFrameAutomationClient::Resize(int width, int height, | 1233 void ChromeFrameAutomationClient::Resize(int width, int height, |
1234 int flags) { | 1234 int flags) { |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 const URLRequestStatus& status) { | 1457 const URLRequestStatus& status) { |
1458 automation_server_->Send(new AutomationMsg_RequestEnd( | 1458 automation_server_->Send(new AutomationMsg_RequestEnd( |
1459 tab_->handle(), request_id, status)); | 1459 tab_->handle(), request_id, status)); |
1460 } | 1460 } |
1461 | 1461 |
1462 void ChromeFrameAutomationClient::OnCookiesRetrieved(bool success, | 1462 void ChromeFrameAutomationClient::OnCookiesRetrieved(bool success, |
1463 const GURL& url, const std::string& cookie_string, int cookie_id) { | 1463 const GURL& url, const std::string& cookie_string, int cookie_id) { |
1464 automation_server_->Send(new AutomationMsg_GetCookiesHostResponse( | 1464 automation_server_->Send(new AutomationMsg_GetCookiesHostResponse( |
1465 tab_->handle(), success, url, cookie_string, cookie_id)); | 1465 tab_->handle(), success, url, cookie_string, cookie_id)); |
1466 } | 1466 } |
OLD | NEW |