Chromium Code Reviews| 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 51ae96eddac979f4cdc9ded67d1c8753dfb86d98..836fe06342d1fc80b98e73c2f7fa47b9e1351b21 100644 |
| --- a/chrome/browser/automation/testing_automation_provider.cc |
| +++ b/chrome/browser/automation/testing_automation_provider.cc |
| @@ -176,6 +176,12 @@ class AutomationInterstitialPage : public InterstitialPage { |
| DISALLOW_COPY_AND_ASSIGN(AutomationInterstitialPage); |
| }; |
| +// Helper function for nested Binds that resolves the overloading of |
| +// BrowserThread::PostTask, and ignores the return value. |
|
Joao da Silva
2011/10/21 12:59:58
I tried to resolve the overloading with
bool (*po
|
| +void PostTask(BrowserThread::ID id, const base::Closure& task) { |
| + CHECK(BrowserThread::PostTask(id, FROM_HERE, task)); |
|
Paweł Hajdan Jr.
2011/10/21 15:13:17
Please make it return the value it gets from the r
|
| +} |
| + |
| } // namespace |
| TestingAutomationProvider::TestingAutomationProvider(Profile* profile) |
| @@ -2730,41 +2736,26 @@ void TestingAutomationProvider::PerformActionOnInfobar( |
| namespace { |
| -// Task to get info about BrowserChildProcessHost. Must run on IO thread to |
| +// Gets info about BrowserChildProcessHost. Must run on IO thread to |
| // honor the semantics of BrowserChildProcessHost. |
| // Used by AutomationProvider::GetBrowserInfo(). |
| -class GetChildProcessHostInfoTask : public Task { |
| - public: |
| - GetChildProcessHostInfoTask(base::WaitableEvent* event, |
| - ListValue* child_processes) |
| - : event_(event), |
| - child_processes_(child_processes) {} |
| - |
| - virtual void Run() { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) { |
| - // Only add processes which are already started, |
| - // since we need their handle. |
| - if ((*iter)->handle() == base::kNullProcessHandle) { |
| - continue; |
| - } |
| - ChildProcessInfo* info = *iter; |
| - DictionaryValue* item = new DictionaryValue; |
| - item->SetString("name", info->name()); |
| - item->SetString("type", |
| - ChildProcessInfo::GetTypeNameInEnglish(info->type())); |
| - item->SetInteger("pid", base::GetProcId(info->handle())); |
| - child_processes_->Append(item); |
| +void GetChildProcessHostInfo(ListValue* child_processes) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + for (BrowserChildProcessHost::Iterator iter; !iter.Done(); ++iter) { |
| + // Only add processes which are already started, |
| + // since we need their handle. |
| + if ((*iter)->handle() == base::kNullProcessHandle) { |
|
Paweł Hajdan Jr.
2011/10/21 15:13:17
nit: No need for braces {}.
Joao da Silva
2011/10/22 11:26:50
Done.
|
| + continue; |
| } |
| - event_->Signal(); |
| + ChildProcessInfo* info = *iter; |
| + DictionaryValue* item = new DictionaryValue; |
| + item->SetString("name", info->name()); |
| + item->SetString("type", |
| + ChildProcessInfo::GetTypeNameInEnglish(info->type())); |
| + item->SetInteger("pid", base::GetProcId(info->handle())); |
| + child_processes->Append(item); |
| } |
| - |
| - private: |
| - base::WaitableEvent* const event_; // weak |
| - ListValue* child_processes_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(GetChildProcessHostInfoTask); |
| -}; |
| +} |
| } // namespace |
| @@ -2876,20 +2867,6 @@ void TestingAutomationProvider::GetBrowserInfo( |
| int flags = ChildProcessHost::CHILD_NORMAL; |
| #endif |
| - return_value->SetString("child_process_path", |
| - ChildProcessHost::GetChildPath(flags).value()); |
| - // Child processes are the processes for plugins and other workers. |
| - // Add all child processes in a list of dictionaries, one dictionary item |
| - // per child process. |
| - ListValue* child_processes = new ListValue; |
| - base::WaitableEvent event(true /* manual reset */, |
| - false /* not initially signaled */); |
| - CHECK(BrowserThread::PostTask( |
| - BrowserThread::IO, FROM_HERE, |
| - new GetChildProcessHostInfoTask(&event, child_processes))); |
| - event.Wait(); |
| - return_value->Set("child_processes", child_processes); |
| - |
| // Add all extension processes in a list of dictionaries, one dictionary |
| // item per extension process. |
| ListValue* extension_views = new ListValue; |
| @@ -2945,7 +2922,20 @@ void TestingAutomationProvider::GetBrowserInfo( |
| } |
| } |
| return_value->Set("extension_views", extension_views); |
| - AutomationJSONReply(this, reply_message).SendSuccess(return_value.get()); |
| + |
| + return_value->SetString("child_process_path", |
| + ChildProcessHost::GetChildPath(flags).value()); |
| + // Child processes are the processes for plugins and other workers. |
| + // Add all child processes in a list of dictionaries, one dictionary item |
| + // per child process. |
| + ListValue* child_processes = new ListValue; |
| + return_value->Set("child_processes", child_processes); |
| + CHECK(BrowserThread::PostTaskAndReply( |
|
Paweł Hajdan Jr.
2011/10/21 15:13:17
Why don't you just SendError if this fails?
|
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&GetChildProcessHostInfo, child_processes), |
| + base::Bind(&AutomationJSONReply::SendSuccess, |
| + base::Owned(new AutomationJSONReply(this, reply_message)), |
| + base::Owned(return_value.release())))); |
| } |
| // Sample json input: { "command": "GetProcessInfo" } |
| @@ -5871,10 +5861,11 @@ void TestingAutomationProvider::WaitForAllTabsToStopLoading( |
| void TestingAutomationProvider::SetPolicies( |
| DictionaryValue* args, |
| IPC::Message* reply_message) { |
| - AutomationJSONReply reply(this, reply_message); |
| + scoped_ptr<AutomationJSONReply> reply( |
| + new AutomationJSONReply(this, reply_message)); |
| #if !defined(ENABLE_CONFIGURATION_POLICY) || defined(OFFICIAL_BUILD) |
| - reply.SendError("Configuration Policy disabled"); |
| + reply->SendError("Configuration Policy disabled"); |
| #else |
| const policy::PolicyDefinitionList* list = |
| policy::GetChromePolicyDefinitionList(); |
| @@ -5895,7 +5886,7 @@ void TestingAutomationProvider::SetPolicies( |
| if (args->GetDictionary(providers[i].name, &policies) && |
| policies && |
| !providers[i].provider) { |
| - reply.SendError("Provider not available: " + providers[i].name); |
| + reply->SendError("Provider not available: " + providers[i].name); |
| return; |
| } |
| } |
| @@ -5908,7 +5899,17 @@ void TestingAutomationProvider::SetPolicies( |
| } |
| } |
| - reply.SendSuccess(NULL); |
| + // OverridePolicies() triggers preference updates, which triggers preference |
| + // listeners. Some policies (e.g. URLBlacklist) post tasks to other message |
| + // loops before they start being enforced; make sure those tasks have |
| + // finished. |
| + PostTask(BrowserThread::IO, |
|
Paweł Hajdan Jr.
2011/10/21 15:13:17
Please add some base::Bind gurus for possible advi
Joao da Silva
2011/10/21 16:25:53
Good idea, adding @willchan as the Bind guru :-)
willchan no longer on Chromium
2011/10/21 20:50:29
This code gave me a good chuckle today. Thanks for
Joao da Silva
2011/10/22 11:26:50
Thanks for taking a look. I've added an explicit c
|
| + base::Bind(&PostTask, BrowserThread::FILE, |
| + base::Bind(&PostTask, BrowserThread::IO, |
| + base::Bind(&PostTask, BrowserThread::UI, |
|
Paweł Hajdan Jr.
2011/10/21 15:13:17
So it seems you've done the CHECK in PostTask beca
Joao da Silva
2011/10/21 16:25:53
I think replies have to be sent from UI; please co
|
| + base::Bind(&AutomationJSONReply::SendSuccess, |
| + base::Owned(reply.release()), |
| + static_cast<const Value*>(NULL)))))); |
| #endif // defined(OFFICIAL_BUILD) |
| } |