| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/browser/automation/automation_provider.h" | 5 #include "chrome/browser/automation/automation_provider.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 #include "chrome/common/chrome_paths.h" | 59 #include "chrome/common/chrome_paths.h" |
| 60 #include "chrome/common/chrome_switches.h" | 60 #include "chrome/common/chrome_switches.h" |
| 61 #include "chrome/common/chrome_version_info.h" | 61 #include "chrome/common/chrome_version_info.h" |
| 62 #include "chrome/common/pref_names.h" | 62 #include "chrome/common/pref_names.h" |
| 63 #include "chrome/common/render_messages.h" | 63 #include "chrome/common/render_messages.h" |
| 64 #include "chrome/common/url_constants.h" | 64 #include "chrome/common/url_constants.h" |
| 65 #include "content/public/browser/browser_thread.h" | 65 #include "content/public/browser/browser_thread.h" |
| 66 #include "content/public/browser/download_item.h" | 66 #include "content/public/browser/download_item.h" |
| 67 #include "content/public/browser/native_web_keyboard_event.h" | 67 #include "content/public/browser/native_web_keyboard_event.h" |
| 68 #include "content/public/browser/render_view_host.h" | 68 #include "content/public/browser/render_view_host.h" |
| 69 #include "content/public/browser/trace_controller.h" | 69 #include "content/public/browser/tracing_controller.h" |
| 70 #include "content/public/browser/web_contents.h" | 70 #include "content/public/browser/web_contents.h" |
| 71 #include "content/public/browser/web_contents_view.h" | 71 #include "content/public/browser/web_contents_view.h" |
| 72 #include "net/proxy/proxy_config_service_fixed.h" | 72 #include "net/proxy/proxy_config_service_fixed.h" |
| 73 #include "net/proxy/proxy_service.h" | 73 #include "net/proxy/proxy_service.h" |
| 74 #include "net/url_request/url_request_context.h" | 74 #include "net/url_request/url_request_context.h" |
| 75 #include "net/url_request/url_request_context_getter.h" | 75 #include "net/url_request/url_request_context_getter.h" |
| 76 #include "third_party/WebKit/public/web/WebFindOptions.h" | 76 #include "third_party/WebKit/public/web/WebFindOptions.h" |
| 77 | 77 |
| 78 #if defined(OS_CHROMEOS) | 78 #if defined(OS_CHROMEOS) |
| 79 #include "chromeos/chromeos_switches.h" | 79 #include "chromeos/chromeos_switches.h" |
| 80 #include "chromeos/login/login_state.h" | 80 #include "chromeos/login/login_state.h" |
| 81 #endif // defined(OS_CHROMEOS) | 81 #endif // defined(OS_CHROMEOS) |
| 82 | 82 |
| 83 using blink::WebFindOptions; | 83 using blink::WebFindOptions; |
| 84 using base::Time; | 84 using base::Time; |
| 85 using content::BrowserThread; | 85 using content::BrowserThread; |
| 86 using content::DownloadItem; | 86 using content::DownloadItem; |
| 87 using content::NavigationController; | 87 using content::NavigationController; |
| 88 using content::RenderViewHost; | 88 using content::RenderViewHost; |
| 89 using content::TraceController; | 89 using content::TracingController; |
| 90 using content::WebContents; | 90 using content::WebContents; |
| 91 | 91 |
| 92 namespace { | 92 namespace { |
| 93 | 93 |
| 94 void PopulateProxyConfig(const DictionaryValue& dict, net::ProxyConfig* pc) { | 94 void PopulateProxyConfig(const DictionaryValue& dict, net::ProxyConfig* pc) { |
| 95 DCHECK(pc); | 95 DCHECK(pc); |
| 96 bool no_proxy = false; | 96 bool no_proxy = false; |
| 97 if (dict.GetBoolean(automation::kJSONProxyNoProxy, &no_proxy)) { | 97 if (dict.GetBoolean(automation::kJSONProxyNoProxy, &no_proxy)) { |
| 98 // Make no changes to the ProxyConfig. | 98 // Make no changes to the ProxyConfig. |
| 99 return; | 99 return; |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 void AutomationProvider::OnChannelConnected(int pid) { | 369 void AutomationProvider::OnChannelConnected(int pid) { |
| 370 is_connected_ = true; | 370 is_connected_ = true; |
| 371 | 371 |
| 372 // Send a hello message with our current automation protocol version. | 372 // Send a hello message with our current automation protocol version. |
| 373 VLOG(2) << "Testing channel connected, sending hello message"; | 373 VLOG(2) << "Testing channel connected, sending hello message"; |
| 374 channel_->Send(new AutomationMsg_Hello(GetProtocolVersion())); | 374 channel_->Send(new AutomationMsg_Hello(GetProtocolVersion())); |
| 375 | 375 |
| 376 SendInitialLoadMessage(); | 376 SendInitialLoadMessage(); |
| 377 } | 377 } |
| 378 | 378 |
| 379 void AutomationProvider::OnEndTracingComplete() { | |
| 380 IPC::Message* reply_message = tracing_data_.reply_message.release(); | |
| 381 if (reply_message) { | |
| 382 AutomationMsg_EndTracing::WriteReplyParams( | |
| 383 reply_message, tracing_data_.trace_output.size(), true); | |
| 384 Send(reply_message); | |
| 385 } | |
| 386 } | |
| 387 | |
| 388 void AutomationProvider::OnTraceDataCollected( | |
| 389 const scoped_refptr<base::RefCountedString>& trace_fragment) { | |
| 390 tracing_data_.trace_output.push_back(trace_fragment->data()); | |
| 391 } | |
| 392 | |
| 393 bool AutomationProvider::OnMessageReceived(const IPC::Message& message) { | 379 bool AutomationProvider::OnMessageReceived(const IPC::Message& message) { |
| 394 bool handled = true; | 380 bool handled = true; |
| 395 bool deserialize_success = true; | 381 bool deserialize_success = true; |
| 396 IPC_BEGIN_MESSAGE_MAP_EX(AutomationProvider, message, deserialize_success) | 382 IPC_BEGIN_MESSAGE_MAP_EX(AutomationProvider, message, deserialize_success) |
| 397 IPC_MESSAGE_HANDLER(AutomationMsg_HandleUnused, HandleUnused) | 383 IPC_MESSAGE_HANDLER(AutomationMsg_HandleUnused, HandleUnused) |
| 398 IPC_MESSAGE_HANDLER(AutomationMsg_SetProxyConfig, SetProxyConfig) | 384 IPC_MESSAGE_HANDLER(AutomationMsg_SetProxyConfig, SetProxyConfig) |
| 399 IPC_MESSAGE_HANDLER(AutomationMsg_PrintAsync, PrintAsync) | 385 IPC_MESSAGE_HANDLER(AutomationMsg_PrintAsync, PrintAsync) |
| 400 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_Find, HandleFindRequest) | 386 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_Find, HandleFindRequest) |
| 401 IPC_MESSAGE_HANDLER(AutomationMsg_OverrideEncoding, OverrideEncoding) | 387 IPC_MESSAGE_HANDLER(AutomationMsg_OverrideEncoding, OverrideEncoding) |
| 402 IPC_MESSAGE_HANDLER(AutomationMsg_SelectAll, SelectAll) | 388 IPC_MESSAGE_HANDLER(AutomationMsg_SelectAll, SelectAll) |
| 403 IPC_MESSAGE_HANDLER(AutomationMsg_Cut, Cut) | 389 IPC_MESSAGE_HANDLER(AutomationMsg_Cut, Cut) |
| 404 IPC_MESSAGE_HANDLER(AutomationMsg_Copy, Copy) | 390 IPC_MESSAGE_HANDLER(AutomationMsg_Copy, Copy) |
| 405 IPC_MESSAGE_HANDLER(AutomationMsg_Paste, Paste) | 391 IPC_MESSAGE_HANDLER(AutomationMsg_Paste, Paste) |
| 406 IPC_MESSAGE_HANDLER(AutomationMsg_ReloadAsync, ReloadAsync) | 392 IPC_MESSAGE_HANDLER(AutomationMsg_ReloadAsync, ReloadAsync) |
| 407 IPC_MESSAGE_HANDLER(AutomationMsg_StopAsync, StopAsync) | 393 IPC_MESSAGE_HANDLER(AutomationMsg_StopAsync, StopAsync) |
| 408 IPC_MESSAGE_HANDLER(AutomationMsg_SetPageFontSize, OnSetPageFontSize) | 394 IPC_MESSAGE_HANDLER(AutomationMsg_SetPageFontSize, OnSetPageFontSize) |
| 409 IPC_MESSAGE_HANDLER(AutomationMsg_SaveAsAsync, SaveAsAsync) | 395 IPC_MESSAGE_HANDLER(AutomationMsg_SaveAsAsync, SaveAsAsync) |
| 410 IPC_MESSAGE_HANDLER(AutomationMsg_RemoveBrowsingData, RemoveBrowsingData) | 396 IPC_MESSAGE_HANDLER(AutomationMsg_RemoveBrowsingData, RemoveBrowsingData) |
| 411 IPC_MESSAGE_HANDLER(AutomationMsg_JavaScriptStressTestControl, | 397 IPC_MESSAGE_HANDLER(AutomationMsg_JavaScriptStressTestControl, |
| 412 JavaScriptStressTestControl) | 398 JavaScriptStressTestControl) |
| 413 IPC_MESSAGE_HANDLER(AutomationMsg_BeginTracing, BeginTracing) | 399 IPC_MESSAGE_HANDLER(AutomationMsg_BeginTracing, BeginTracing) |
| 414 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_EndTracing, EndTracing) | 400 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_EndTracing, EndTracing) |
| 415 IPC_MESSAGE_HANDLER(AutomationMsg_GetTracingOutput, GetTracingOutput) | |
| 416 #if defined(OS_WIN) | 401 #if defined(OS_WIN) |
| 417 // These are for use with external tabs. | 402 // These are for use with external tabs. |
| 418 IPC_MESSAGE_HANDLER(AutomationMsg_CreateExternalTab, CreateExternalTab) | 403 IPC_MESSAGE_HANDLER(AutomationMsg_CreateExternalTab, CreateExternalTab) |
| 419 IPC_MESSAGE_HANDLER(AutomationMsg_ProcessUnhandledAccelerator, | 404 IPC_MESSAGE_HANDLER(AutomationMsg_ProcessUnhandledAccelerator, |
| 420 ProcessUnhandledAccelerator) | 405 ProcessUnhandledAccelerator) |
| 421 IPC_MESSAGE_HANDLER(AutomationMsg_SetInitialFocus, SetInitialFocus) | 406 IPC_MESSAGE_HANDLER(AutomationMsg_SetInitialFocus, SetInitialFocus) |
| 422 IPC_MESSAGE_HANDLER(AutomationMsg_TabReposition, OnTabReposition) | 407 IPC_MESSAGE_HANDLER(AutomationMsg_TabReposition, OnTabReposition) |
| 423 IPC_MESSAGE_HANDLER(AutomationMsg_ForwardContextMenuCommandToChrome, | 408 IPC_MESSAGE_HANDLER(AutomationMsg_ForwardContextMenuCommandToChrome, |
| 424 OnForwardContextMenuCommandToChrome) | 409 OnForwardContextMenuCommandToChrome) |
| 425 IPC_MESSAGE_HANDLER(AutomationMsg_NavigateInExternalTab, | 410 IPC_MESSAGE_HANDLER(AutomationMsg_NavigateInExternalTab, |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 NOTREACHED(); | 700 NOTREACHED(); |
| 716 return; | 701 return; |
| 717 } | 702 } |
| 718 | 703 |
| 719 view->Send(new ChromeViewMsg_JavaScriptStressTestControl( | 704 view->Send(new ChromeViewMsg_JavaScriptStressTestControl( |
| 720 view->GetRoutingID(), cmd, param)); | 705 view->GetRoutingID(), cmd, param)); |
| 721 } | 706 } |
| 722 | 707 |
| 723 void AutomationProvider::BeginTracing(const std::string& category_patterns, | 708 void AutomationProvider::BeginTracing(const std::string& category_patterns, |
| 724 bool* success) { | 709 bool* success) { |
| 725 tracing_data_.trace_output.clear(); | 710 *success = TracingController::GetInstance()->EnableRecording( |
| 726 *success = TraceController::GetInstance()->BeginTracing( | 711 category_patterns, TracingController::DEFAULT_OPTIONS, |
| 727 this, | 712 TracingController::EnableRecordingDoneCallback()); |
| 728 category_patterns, | |
| 729 base::debug::TraceLog::RECORD_UNTIL_FULL); | |
| 730 } | 713 } |
| 731 | 714 |
| 732 void AutomationProvider::EndTracing(IPC::Message* reply_message) { | 715 void AutomationProvider::EndTracing(IPC::Message* reply_message) { |
| 733 bool success = false; | 716 base::FilePath path; |
| 734 if (!tracing_data_.reply_message.get()) | 717 if (!TracingController::GetInstance()->DisableRecording( |
| 735 success = TraceController::GetInstance()->EndTracingAsync(this); | 718 path, base::Bind(&AutomationProvider::OnTraceDataCollected, this, |
| 736 if (success) { | 719 reply_message))) { |
| 737 // Defer EndTracing reply until TraceController calls us back with all the | |
| 738 // events. | |
| 739 tracing_data_.reply_message.reset(reply_message); | |
| 740 } else { | |
| 741 // If failed to call EndTracingAsync, need to reply with failure now. | 720 // If failed to call EndTracingAsync, need to reply with failure now. |
| 742 AutomationMsg_EndTracing::WriteReplyParams(reply_message, size_t(0), false); | 721 AutomationMsg_EndTracing::WriteReplyParams(reply_message, path, false); |
| 722 Send(reply_message); |
| 723 } |
| 724 // Otherwise defer EndTracing reply until TraceController calls us back. |
| 725 } |
| 726 |
| 727 void AutomationProvider::OnTraceDataCollected(IPC::Message* reply_message, |
| 728 const base::FilePath& path) { |
| 729 if (reply_message) { |
| 730 AutomationMsg_EndTracing::WriteReplyParams(reply_message, path, true); |
| 743 Send(reply_message); | 731 Send(reply_message); |
| 744 } | 732 } |
| 745 } | 733 } |
| 746 | 734 |
| 747 void AutomationProvider::GetTracingOutput(std::string* chunk, | |
| 748 bool* success) { | |
| 749 // The JSON data is sent back to the test in chunks, because IPC sends will | |
| 750 // fail if they are too large. | |
| 751 if (tracing_data_.trace_output.empty()) { | |
| 752 *chunk = ""; | |
| 753 *success = false; | |
| 754 } else { | |
| 755 *chunk = tracing_data_.trace_output.front(); | |
| 756 tracing_data_.trace_output.pop_front(); | |
| 757 *success = true; | |
| 758 } | |
| 759 } | |
| 760 | |
| 761 RenderViewHost* AutomationProvider::GetViewForTab(int tab_handle) { | 735 RenderViewHost* AutomationProvider::GetViewForTab(int tab_handle) { |
| 762 if (tab_tracker_->ContainsHandle(tab_handle)) { | 736 if (tab_tracker_->ContainsHandle(tab_handle)) { |
| 763 NavigationController* tab = tab_tracker_->GetResource(tab_handle); | 737 NavigationController* tab = tab_tracker_->GetResource(tab_handle); |
| 764 if (!tab) { | 738 if (!tab) { |
| 765 NOTREACHED(); | 739 NOTREACHED(); |
| 766 return NULL; | 740 return NULL; |
| 767 } | 741 } |
| 768 | 742 |
| 769 WebContents* web_contents = tab->GetWebContents(); | 743 WebContents* web_contents = tab->GetWebContents(); |
| 770 if (!web_contents) { | 744 if (!web_contents) { |
| 771 NOTREACHED(); | 745 NOTREACHED(); |
| 772 return NULL; | 746 return NULL; |
| 773 } | 747 } |
| 774 | 748 |
| 775 RenderViewHost* view_host = web_contents->GetRenderViewHost(); | 749 RenderViewHost* view_host = web_contents->GetRenderViewHost(); |
| 776 return view_host; | 750 return view_host; |
| 777 } | 751 } |
| 778 | 752 |
| 779 return NULL; | 753 return NULL; |
| 780 } | 754 } |
| 781 | 755 |
| 782 void AutomationProvider::SaveAsAsync(int tab_handle) { | 756 void AutomationProvider::SaveAsAsync(int tab_handle) { |
| 783 NavigationController* tab = NULL; | 757 NavigationController* tab = NULL; |
| 784 WebContents* web_contents = GetWebContentsForHandle(tab_handle, &tab); | 758 WebContents* web_contents = GetWebContentsForHandle(tab_handle, &tab); |
| 785 if (web_contents) | 759 if (web_contents) |
| 786 web_contents->OnSavePage(); | 760 web_contents->OnSavePage(); |
| 787 } | 761 } |
| OLD | NEW |