Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(225)

Side by Side Diff: chrome/browser/automation/automation_provider.cc

Issue 6515016: Restart named testing channel on disconnect. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Permissions fixes and cleanup. Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/callback.h" 9 #include "base/callback.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 103
104 #if defined(OS_WIN) 104 #if defined(OS_WIN)
105 #include "chrome/browser/external_tab_container_win.h" 105 #include "chrome/browser/external_tab_container_win.h"
106 #endif // defined(OS_WIN) 106 #endif // defined(OS_WIN)
107 107
108 using base::Time; 108 using base::Time;
109 109
110 AutomationProvider::AutomationProvider(Profile* profile) 110 AutomationProvider::AutomationProvider(Profile* profile)
111 : profile_(profile), 111 : profile_(profile),
112 reply_message_(NULL), 112 reply_message_(NULL),
113 reconnect_on_channel_error_(false),
113 is_connected_(false), 114 is_connected_(false),
114 initial_loads_complete_(false) { 115 initial_loads_complete_(false) {
115 TRACE_EVENT_BEGIN("AutomationProvider::AutomationProvider", 0, ""); 116 TRACE_EVENT_BEGIN("AutomationProvider::AutomationProvider", 0, "");
116 117
117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 118 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
118 119
119 browser_tracker_.reset(new AutomationBrowserTracker(this)); 120 browser_tracker_.reset(new AutomationBrowserTracker(this));
120 extension_tracker_.reset(new AutomationExtensionTracker(this)); 121 extension_tracker_.reset(new AutomationExtensionTracker(this));
121 tab_tracker_.reset(new AutomationTabTracker(this)); 122 tab_tracker_.reset(new AutomationTabTracker(this));
122 window_tracker_.reset(new AutomationWindowTracker(this)); 123 window_tracker_.reset(new AutomationWindowTracker(this));
(...skipping 16 matching lines...) Expand all
139 140
140 if (channel_.get()) 141 if (channel_.get())
141 channel_->Close(); 142 channel_->Close();
142 143
143 g_browser_process->ReleaseModule(); 144 g_browser_process->ReleaseModule();
144 } 145 }
145 146
146 bool AutomationProvider::InitializeChannel(const std::string& channel_id) { 147 bool AutomationProvider::InitializeChannel(const std::string& channel_id) {
147 TRACE_EVENT_BEGIN("AutomationProvider::InitializeChannel", 0, ""); 148 TRACE_EVENT_BEGIN("AutomationProvider::InitializeChannel", 0, "");
148 149
150 channel_id_ = channel_id;
149 std::string effective_channel_id = channel_id; 151 std::string effective_channel_id = channel_id;
150 152
151 // If the channel_id starts with kNamedInterfacePrefix, create a named IPC 153 // If the channel_id starts with kNamedInterfacePrefix, create a named IPC
152 // server and listen on it, else connect as client to an existing IPC server 154 // server and listen on it, else connect as client to an existing IPC server
153 bool use_named_interface = 155 bool use_named_interface =
154 channel_id.find(automation::kNamedInterfacePrefix) == 0; 156 channel_id.find(automation::kNamedInterfacePrefix) == 0;
155 if (use_named_interface) { 157 if (use_named_interface) {
156 effective_channel_id = channel_id.substr( 158 effective_channel_id = channel_id.substr(
157 strlen(automation::kNamedInterfacePrefix)); 159 strlen(automation::kNamedInterfacePrefix));
158 if (effective_channel_id.length() <= 0) 160 if (effective_channel_id.length() <= 0)
159 return false; 161 return false;
162
163 reconnect_on_channel_error_ = true;
160 } 164 }
161 165
162 if (!automation_resource_message_filter_.get()) { 166 if (!automation_resource_message_filter_.get()) {
163 automation_resource_message_filter_ = new AutomationResourceMessageFilter; 167 automation_resource_message_filter_ = new AutomationResourceMessageFilter;
164 } 168 }
165 169
166 channel_.reset(new IPC::SyncChannel( 170 channel_.reset(new IPC::SyncChannel(
167 effective_channel_id, 171 effective_channel_id,
168 use_named_interface ? IPC::Channel::MODE_NAMED_SERVER 172 use_named_interface ? IPC::Channel::MODE_NAMED_SERVER
169 : IPC::Channel::MODE_CLIENT, 173 : IPC::Channel::MODE_CLIENT,
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 429
426 DISALLOW_COPY_AND_ASSIGN(InvokeTaskLaterTask); 430 DISALLOW_COPY_AND_ASSIGN(InvokeTaskLaterTask);
427 }; 431 };
428 432
429 void AutomationProvider::HandleUnused(const IPC::Message& message, int handle) { 433 void AutomationProvider::HandleUnused(const IPC::Message& message, int handle) {
430 if (window_tracker_->ContainsHandle(handle)) { 434 if (window_tracker_->ContainsHandle(handle)) {
431 window_tracker_->Remove(window_tracker_->GetResource(handle)); 435 window_tracker_->Remove(window_tracker_->GetResource(handle));
432 } 436 }
433 } 437 }
434 438
439 bool AutomationProvider::ReinitializeChannel() {
440 base::ThreadRestrictions::ScopedAllowIO allow_io;
441
442 // Make sure any old channels are cleaned up before starting up a new one.
443 channel_.reset();
444 return InitializeChannel(channel_id_);
445 }
446
435 void AutomationProvider::OnChannelError() { 447 void AutomationProvider::OnChannelError() {
436 VLOG(1) << "AutomationProxy went away, shutting down app."; 448 if (reconnect_on_channel_error_) {
437 AutomationProviderList::GetInstance()->RemoveProvider(this); 449 VLOG(1) << "AutomationProxy disconnected, resetting AutomationProvider.";
450 if (!ReinitializeChannel()) {
451 VLOG(1) << "Error reinitializing AutomationProvider channel.";
452 AutomationProviderList::GetInstance()->RemoveProvider(this);
453 }
454 } else {
455 VLOG(1) << "AutomationProxy went away, shutting down app.";
456 AutomationProviderList::GetInstance()->RemoveProvider(this);
Nirnimesh 2011/02/17 00:55:12 You won't need to repeat this RemoveProvider() cal
dtu 2011/02/17 02:14:25 Done.
457 }
438 } 458 }
439 459
440 bool AutomationProvider::Send(IPC::Message* msg) { 460 bool AutomationProvider::Send(IPC::Message* msg) {
441 DCHECK(channel_.get()); 461 DCHECK(channel_.get());
442 return channel_->Send(msg); 462 return channel_->Send(msg);
443 } 463 }
444 464
445 Browser* AutomationProvider::FindAndActivateTab( 465 Browser* AutomationProvider::FindAndActivateTab(
446 NavigationController* controller) { 466 NavigationController* controller) {
447 int tab_index; 467 int tab_index;
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
992 } 1012 }
993 } 1013 }
994 } 1014 }
995 1015
996 void AutomationProvider::SaveAsAsync(int tab_handle) { 1016 void AutomationProvider::SaveAsAsync(int tab_handle) {
997 NavigationController* tab = NULL; 1017 NavigationController* tab = NULL;
998 TabContents* tab_contents = GetTabContentsForHandle(tab_handle, &tab); 1018 TabContents* tab_contents = GetTabContentsForHandle(tab_handle, &tab);
999 if (tab_contents) 1019 if (tab_contents)
1000 tab_contents->OnSavePage(); 1020 tab_contents->OnSavePage();
1001 } 1021 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698