| Index: chrome/browser/automation/testing_automation_provider.cc
|
| diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc
|
| index 6e45cf21c843601616c89d5d940217dadc784200..b95210950a17289bc6ac1eada8c796601aefee6a 100644
|
| --- a/chrome/browser/automation/testing_automation_provider.cc
|
| +++ b/chrome/browser/automation/testing_automation_provider.cc
|
| @@ -251,6 +251,35 @@ void TestingAutomationProvider::Observe(int type,
|
| Release();
|
| }
|
|
|
| +void TestingAutomationProvider::OnEndTracingComplete() {
|
| + IPC::Message* reply_message = tracing_data_.reply_message.release();
|
| + if (reply_message) {
|
| + // Finish off JSON string.
|
| + if (tracing_data_.json_output.empty())
|
| + tracing_data_.json_output.push_back("[]");
|
| + else
|
| + tracing_data_.json_output.push_back("]");
|
| + AutomationMsg_EndTracing::WriteReplyParams(reply_message, true);
|
| + Send(reply_message);
|
| + }
|
| +}
|
| +
|
| +void TestingAutomationProvider::OnTraceDataCollected(
|
| + const std::string& json_events) {
|
| + // |json_events| should start with '[' and end with ']'.
|
| + if (json_events.size() > 2) {
|
| + std::string chunk;
|
| + // If this is the first chunk, JSON starts with '['.
|
| + if (tracing_data_.json_output.empty())
|
| + chunk += '[';
|
| + else
|
| + chunk += ',';
|
| + chunk += json_events.substr(1, json_events.size() - 2);
|
| + // Append without the leading and trailing brackets.
|
| + tracing_data_.json_output.push_back(chunk);
|
| + }
|
| +}
|
| +
|
| bool TestingAutomationProvider::OnMessageReceived(
|
| const IPC::Message& message) {
|
| bool handled = true;
|
| @@ -311,6 +340,9 @@ bool TestingAutomationProvider::OnMessageReceived(
|
| IPC_MESSAGE_HANDLER(AutomationMsg_Type, GetType)
|
| IPC_MESSAGE_HANDLER(AutomationMsg_IsBrowserInApplicationMode,
|
| IsBrowserInApplicationMode)
|
| + IPC_MESSAGE_HANDLER(AutomationMsg_BeginTracing, BeginTracing)
|
| + IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_EndTracing, EndTracing)
|
| + IPC_MESSAGE_HANDLER(AutomationMsg_GetTracingOutput, GetTracingOutput)
|
| IPC_MESSAGE_HANDLER(AutomationMsg_Tab, GetTab)
|
| IPC_MESSAGE_HANDLER(AutomationMsg_TabProcessID, GetTabProcessID)
|
| IPC_MESSAGE_HANDLER(AutomationMsg_TabTitle, GetTabTitle)
|
| @@ -1197,6 +1229,45 @@ void TestingAutomationProvider::IsBrowserInApplicationMode(int handle,
|
| }
|
| }
|
|
|
| +void TestingAutomationProvider::BeginTracing(
|
| + const std::vector<std::string>& included_categories,
|
| + const std::vector<std::string>& excluded_categories,
|
| + bool* result) {
|
| + tracing_data_.json_output.clear();
|
| + *result = TraceController::GetInstance()->BeginTracing(this,
|
| + included_categories,
|
| + excluded_categories);
|
| +}
|
| +
|
| +void TestingAutomationProvider::EndTracing(IPC::Message* reply_message) {
|
| + bool success = false;
|
| + if (!tracing_data_.reply_message.get()) {
|
| + success = TraceController::GetInstance()->EndTracingAsync(this);
|
| + }
|
| + // If failed to call EndTracingAsync, need to reply with failure now.
|
| + if (!success) {
|
| + AutomationMsg_EndTracing::WriteReplyParams(reply_message, false);
|
| + Send(reply_message);
|
| + } else {
|
| + // Defer EndTracing reply until the we are notified by TraceController.
|
| + tracing_data_.reply_message.reset(reply_message);
|
| + }
|
| +}
|
| +
|
| +void TestingAutomationProvider::GetTracingOutput(std::string* chunk,
|
| + int* remaining_chunks) {
|
| + // The JSON data is sent back to the test in chunks, because IPC sends will
|
| + // fail if they are too large.
|
| + if (tracing_data_.json_output.empty()) {
|
| + *chunk = "";
|
| + *remaining_chunks = -1;
|
| + } else {
|
| + *chunk = tracing_data_.json_output.front();
|
| + tracing_data_.json_output.pop_front();
|
| + *remaining_chunks = tracing_data_.json_output.size();
|
| + }
|
| +}
|
| +
|
| void TestingAutomationProvider::GetTab(int win_handle,
|
| int tab_index,
|
| int* tab_handle) {
|
|
|