diff options
Diffstat (limited to 'chrome/browser/automation/automation_provider.cc')
-rw-r--r-- | chrome/browser/automation/automation_provider.cc | 63 |
1 files changed, 48 insertions, 15 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index ec48e7a..65dc5a3 100644 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -113,7 +113,9 @@ using base::Time; AutomationProvider::AutomationProvider(Profile* profile) : profile_(profile), - reply_message_(NULL) { + reply_message_(NULL), + is_connected_(false), + initial_loads_complete_(false) { TRACE_EVENT_BEGIN("AutomationProvider::AutomationProvider", 0, ""); browser_tracker_.reset(new AutomationBrowserTracker(this)); @@ -149,23 +151,38 @@ AutomationProvider::~AutomationProvider() { g_browser_process->ReleaseModule(); } -void AutomationProvider::ConnectToChannel(const std::string& channel_id) { - TRACE_EVENT_BEGIN("AutomationProvider::ConnectToChannel", 0, ""); +bool AutomationProvider::InitializeChannel(const std::string& channel_id) { + TRACE_EVENT_BEGIN("AutomationProvider::InitializeChannel", 0, ""); + + std::string effective_channel_id = channel_id; + + // If the channel_id starts with kNamedInterfacePrefix, create a named IPC + // server and listen on it, else connect as client to an existing IPC server + bool use_named_interface = + channel_id.find(automation::kNamedInterfacePrefix) == 0; + if (use_named_interface) { + effective_channel_id = channel_id.substr( + strlen(automation::kNamedInterfacePrefix)); + if (effective_channel_id.length() <= 0) + return false; + } if (!automation_resource_message_filter_.get()) { automation_resource_message_filter_ = new AutomationResourceMessageFilter; } - channel_.reset( - new IPC::SyncChannel(channel_id, IPC::Channel::MODE_CLIENT, this, - automation_resource_message_filter_, - g_browser_process->io_thread()->message_loop(), - true, g_browser_process->shutdown_event())); + channel_.reset(new IPC::SyncChannel( + effective_channel_id, + use_named_interface ? IPC::Channel::MODE_NAMED_SERVER + : IPC::Channel::MODE_CLIENT, + this, + automation_resource_message_filter_, + g_browser_process->io_thread()->message_loop(), + true, g_browser_process->shutdown_event())); - // Send a hello message with our current automation protocol version. - channel_->Send(new AutomationMsg_Hello(0, GetProtocolVersion().c_str())); + TRACE_EVENT_END("AutomationProvider::InitializeChannel", 0, ""); - TRACE_EVENT_END("AutomationProvider::ConnectToChannel", 0, ""); + return true; } std::string AutomationProvider::GetProtocolVersion() { @@ -174,11 +191,16 @@ std::string AutomationProvider::GetProtocolVersion() { } void AutomationProvider::SetExpectedTabCount(size_t expected_tabs) { - if (expected_tabs == 0) { - Send(new AutomationMsg_InitialLoadsComplete(0)); - } else { + if (expected_tabs == 0) + OnInitialLoadsComplete(); + else initial_load_observer_.reset(new InitialLoadObserver(expected_tabs, this)); - } +} + +void AutomationProvider::OnInitialLoadsComplete() { + initial_loads_complete_ = true; + if (is_connected_) + Send(new AutomationMsg_InitialLoadsComplete(0)); } NotificationObserver* AutomationProvider::AddNavigationStatusListener( @@ -327,6 +349,17 @@ const Extension* AutomationProvider::GetDisabledExtension( return NULL; } +void AutomationProvider::OnChannelConnected(int pid) { + is_connected_ = true; + LOG(INFO) << "Testing channel connected, sending hello message"; + + // Send a hello message with our current automation protocol version. + chrome::VersionInfo version_info; + channel_->Send(new AutomationMsg_Hello(0, version_info.Version())); + if (initial_loads_complete_) + Send(new AutomationMsg_InitialLoadsComplete(0)); +} + void AutomationProvider::OnMessageReceived(const IPC::Message& message) { IPC_BEGIN_MESSAGE_MAP(AutomationProvider, message) #if !defined(OS_MACOSX) |