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 efa27213fff627aab42b3456dc998fbe009367c6..8403b3b411bcaaf58f7a74d1ef65aa3ab1b2de07 100644 |
--- a/chrome/browser/automation/testing_automation_provider.cc |
+++ b/chrome/browser/automation/testing_automation_provider.cc |
@@ -2242,7 +2242,7 @@ void TestingAutomationProvider::SendJSONRequest(int handle, |
// Map json commands to their handlers. |
std::map<std::string, JsonHandler> handler_map; |
handler_map["WaitForAllTabsToStopLoading"] = |
dennis_jeffrey
2011/12/06 00:49:08
Do you think it's worthwhile to change the name of
kkania
2011/12/12 17:10:06
This isn't used on the python side yet, just C++.
|
- &TestingAutomationProvider::WaitForAllTabsToStopLoading; |
+ &TestingAutomationProvider::WaitForAllViewsToStopLoading; |
handler_map["GetIndicesFromTab"] = |
&TestingAutomationProvider::GetIndicesFromTab; |
handler_map["NavigateToURL"] = |
@@ -2307,6 +2307,8 @@ void TestingAutomationProvider::SendJSONRequest(int handle, |
&TestingAutomationProvider::GetChromeDriverAutomationVersion; |
handler_map["UpdateExtensionsNow"] = |
&TestingAutomationProvider::UpdateExtensionsNow; |
+ handler_map["IsPageActionVisible"] = |
+ &TestingAutomationProvider::IsPageActionVisible; |
handler_map["CreateNewAutomationProvider"] = |
&TestingAutomationProvider::CreateNewAutomationProvider; |
handler_map["GetBrowserInfo"] = |
@@ -4428,10 +4430,10 @@ void TestingAutomationProvider::GetExtensionsInfo( |
void TestingAutomationProvider::UninstallExtensionById( |
DictionaryValue* args, |
IPC::Message* reply_message) { |
- std::string id; |
- if (!args->GetString("id", &id)) { |
- AutomationJSONReply(this, reply_message).SendError( |
- "Must include string id."); |
+ const Extension* extension; |
+ std::string error; |
+ if (!GetExtensionFromJSONArgs(args, "id", profile(), &extension, &error)) { |
+ AutomationJSONReply(this, reply_message).SendError(error); |
return; |
} |
ExtensionService* service = profile()->GetExtensionService(); |
@@ -4441,19 +4443,10 @@ void TestingAutomationProvider::UninstallExtensionById( |
return; |
} |
- if (!service->GetExtensionById(id, true) && |
- !service->GetTerminatedExtension(id)) { |
- // The extension ID does not correspond to any extension, whether crashed |
- // or not. |
- AutomationJSONReply(this, reply_message).SendError(base::StringPrintf( |
- "Extension does not exist: %s.", id.c_str())); |
- return; |
- } |
- |
// Wait for a notification indicating that the extension with the given ID |
// has been uninstalled. This observer will delete itself. |
- new ExtensionUninstallObserver(this, reply_message, id); |
- service->UninstallExtension(id, false, NULL); |
+ new ExtensionUninstallObserver(this, reply_message, extension->id()); |
+ service->UninstallExtension(extension->id(), false, NULL); |
} |
// See SetExtensionStateById() in chrome/test/pyautolib/pyauto.py |
@@ -4461,10 +4454,10 @@ void TestingAutomationProvider::UninstallExtensionById( |
void TestingAutomationProvider::SetExtensionStateById( |
DictionaryValue* args, |
IPC::Message* reply_message) { |
- std::string id; |
- if (!args->GetString("id", &id)) { |
- AutomationJSONReply(this, reply_message) |
- .SendError("Missing or invalid key: id"); |
+ const Extension* extension; |
+ std::string error; |
+ if (!GetExtensionFromJSONArgs(args, "id", profile(), &extension, &error)) { |
+ AutomationJSONReply(this, reply_message).SendError(error); |
return; |
} |
@@ -4497,30 +4490,21 @@ void TestingAutomationProvider::SetExtensionStateById( |
return; |
} |
- if (!service->GetExtensionById(id, true) && |
- !service->GetTerminatedExtension(id)) { |
- // The extension ID does not correspond to any extension, whether crashed |
- // or not. |
- AutomationJSONReply(this, reply_message).SendError( |
- base::StringPrintf("Extension does not exist: %s.", id.c_str())); |
- return; |
- } |
- |
- service->SetIsIncognitoEnabled(id, allow_in_incognito); |
+ service->SetIsIncognitoEnabled(extension->id(), allow_in_incognito); |
if (enable) { |
- if (!service->IsExtensionEnabled(id)) { |
+ if (!service->IsExtensionEnabled(extension->id())) { |
new ExtensionReadyNotificationObserver( |
manager, |
service, |
this, |
reply_message); |
- service->EnableExtension(id); |
+ service->EnableExtension(extension->id()); |
} else { |
AutomationJSONReply(this, reply_message).SendSuccess(NULL); |
} |
} else { |
- service->DisableExtension(id); |
+ service->DisableExtension(extension->id()); |
AutomationJSONReply(this, reply_message).SendSuccess(NULL); |
} |
} |
@@ -4530,53 +4514,49 @@ void TestingAutomationProvider::SetExtensionStateById( |
void TestingAutomationProvider::TriggerPageActionById( |
DictionaryValue* args, |
IPC::Message* reply_message) { |
- AutomationJSONReply reply(this, reply_message); |
- |
std::string error; |
Browser* browser; |
- if (!GetBrowserFromJSONArgs(args, &browser, &error)) { |
- reply.SendError(error); |
+ TabContents* tab; |
+ if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab, &error)) { |
+ AutomationJSONReply(this, reply_message).SendError(error); |
return; |
} |
- std::string id; |
- if (!args->GetString("id", &id)) { |
- reply.SendError("Missing or invalid key: id"); |
+ const Extension* extension; |
+ if (!GetEnabledExtensionFromJSONArgs( |
+ args, "id", profile(), &extension, &error)) { |
+ AutomationJSONReply(this, reply_message).SendError(error); |
return; |
} |
- |
- ExtensionService* service = browser->profile()->GetExtensionService(); |
- if (!service) { |
- reply.SendError("No extensions service."); |
+ ExtensionAction* page_action = extension->page_action(); |
+ if (!page_action) { |
+ AutomationJSONReply(this, reply_message).SendError( |
+ "Extension doesn't have any page action."); |
return; |
} |
- if (!service->GetInstalledExtension(id)) { |
- // The extension ID does not correspond to any extension, whether crashed |
- // or not. |
- reply.SendError(base::StringPrintf("Extension %s is not installed.", |
- id.c_str())); |
- return; |
+ |
+ bool pressed = false; |
+ LocationBarTesting* loc_bar = |
+ browser->window()->GetLocationBar()->GetLocationBarForTesting(); |
+ size_t page_action_visible_count = |
+ static_cast<size_t>(loc_bar->PageActionVisibleCount()); |
+ for (size_t i = 0; i < page_action_visible_count; ++i) { |
+ if (loc_bar->GetVisiblePageAction(i) == page_action) { |
+ loc_bar->TestPageActionPressed(i); |
+ pressed = true; |
+ break; |
+ } |
} |
- const Extension* extension = service->GetExtensionById(id, false); |
- if (!extension) { |
- reply.SendError("Extension is disabled or has crashed."); |
+ if (!pressed) { |
+ AutomationJSONReply(this, reply_message).SendError( |
+ "Extension's page action is not visible."); |
return; |
} |
- if (ExtensionAction* page_action = extension->page_action()) { |
- LocationBarTesting* loc_bar = |
- browser->window()->GetLocationBar()->GetLocationBarForTesting(); |
- size_t page_action_visible_count = |
- static_cast<size_t>(loc_bar->PageActionVisibleCount()); |
- for (size_t i = 0; i < page_action_visible_count; ++i) { |
- if (loc_bar->GetVisiblePageAction(i) == page_action) { |
- loc_bar->TestPageActionPressed(i); |
- reply.SendSuccess(NULL); |
- return; |
- } |
- } |
- reply.SendError("Extension doesn't have any visible page action icon."); |
+ if (page_action->HasPopup(ExtensionTabUtil::GetTabId(tab))) { |
+ new ExtensionPopupObserver( |
+ this, reply_message, extension->id()); |
dennis_jeffrey
2011/12/06 00:49:08
maybe add a comment to explicitly say that this ob
kkania
2011/12/12 17:10:06
Done.
|
} else { |
- reply.SendError("Extension doesn't have any page action."); |
+ AutomationJSONReply(this, reply_message).SendSuccess(NULL); |
} |
} |
@@ -4585,55 +4565,61 @@ void TestingAutomationProvider::TriggerPageActionById( |
void TestingAutomationProvider::TriggerBrowserActionById( |
DictionaryValue* args, |
IPC::Message* reply_message) { |
- AutomationJSONReply reply(this, reply_message); |
- |
std::string error; |
Browser* browser; |
- if (!GetBrowserFromJSONArgs(args, &browser, &error)) { |
- reply.SendError(error); |
+ TabContents* tab; |
+ if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab, &error)) { |
+ AutomationJSONReply(this, reply_message).SendError(error); |
return; |
} |
- std::string id; |
- if (!args->GetString("id", &id)) { |
- reply.SendError("Missing or invalid key: id"); |
+ const Extension* extension; |
+ if (!GetEnabledExtensionFromJSONArgs( |
+ args, "id", profile(), &extension, &error)) { |
+ AutomationJSONReply(this, reply_message).SendError(error); |
return; |
} |
- |
- ExtensionService* service = browser->profile()->GetExtensionService(); |
- if (!service) { |
- reply.SendError("No extensions service."); |
+ ExtensionAction* action = extension->browser_action(); |
+ if (!action) { |
+ AutomationJSONReply(this, reply_message).SendError( |
+ "Extension doesn't have any browser action."); |
return; |
} |
- if (!service->GetInstalledExtension(id)) { |
- // The extension ID does not correspond to any extension, whether crashed |
- // or not. |
- reply.SendError(base::StringPrintf("Extension %s is not installed.", |
- id.c_str())); |
+ |
+ BrowserActionTestUtil browser_actions(browser); |
+ int num_browser_actions = browser_actions.NumberOfBrowserActions(); |
+ int action_index = -1; |
+#if defined(TOOLKIT_VIEWS) |
+ for (int i = 0; i < num_browser_actions; ++i) { |
+ if (extension->id() == browser_actions.GetExtensionId(i)) { |
+ action_index = i; |
+ break; |
+ } |
+ } |
+#else |
+ // TODO: Implement the platform-specific GetExtensionId() in |
dennis_jeffrey
2011/12/06 00:49:08
username for the TODO?
kkania
2011/12/12 17:10:06
Frank originally put this here, but I'm willing to
|
+ // BrowserActionTestUtil. |
+ if (num_browser_actions != 1) { |
+ AutomationJSONReply(this, reply_message).SendError(StringPrintf( |
+ "Found %d browser actions. Only one browser action must be active.", |
+ num_browser_actions)); |
return; |
} |
- const Extension* extension = service->GetExtensionById(id, false); |
- if (!extension) { |
- reply.SendError("Extension is disabled or has crashed."); |
+ // This extension has a browser action, and there's only one action, so this |
+ // must be the first one. |
+ action_index = 0; |
+#endif |
+ if (action_index == -1) { |
+ AutomationJSONReply(this, reply_message).SendError( |
+ "Extension's browser action is not visible."); |
return; |
} |
+ browser_actions.Press(action_index); |
- if (extension->browser_action()) { |
- BrowserActionTestUtil browser_actions(browser); |
- int num_browser_actions = browser_actions.NumberOfBrowserActions(); |
- // TODO: Implement the platform-specific GetExtensionId() in |
- // BrowserActionTestUtil. |
- if (num_browser_actions != 1) { |
- reply.SendError(StringPrintf( |
- "Found %d browser actions. Only one browser action must be active.", |
- num_browser_actions)); |
- return; |
- } |
- browser_actions.Press(0); |
- reply.SendSuccess(NULL); |
- return; |
+ if (action->HasPopup(ExtensionTabUtil::GetTabId(tab))) { |
+ new ExtensionPopupObserver( |
+ this, reply_message, extension->id()); |
dennis_jeffrey
2011/12/06 00:49:08
maybe add a comment to explicitly say that this ob
kkania
2011/12/12 17:10:06
Done.
|
} else { |
- reply.SendError("Extension doesn't have any browser action."); |
- return; |
+ AutomationJSONReply(this, reply_message).SendSuccess(NULL); |
} |
} |
@@ -5878,7 +5864,7 @@ void TestingAutomationProvider::SetAppLaunchType( |
reply.SendSuccess(NULL); |
} |
-void TestingAutomationProvider::WaitForAllTabsToStopLoading( |
+void TestingAutomationProvider::WaitForAllViewsToStopLoading( |
DictionaryValue* args, |
IPC::Message* reply_message) { |
if (AppModalDialogQueue::GetInstance()->HasActiveDialog()) { |
@@ -5887,7 +5873,8 @@ void TestingAutomationProvider::WaitForAllTabsToStopLoading( |
} |
// This class will send the message immediately if no tab is loading. |
- new AllTabsStoppedLoadingObserver(this, reply_message); |
+ new AllViewsStoppedLoadingObserver( |
+ this, reply_message, profile()->GetExtensionProcessManager()); |
} |
void TestingAutomationProvider::SetPolicies( |
@@ -6296,8 +6283,7 @@ void TestingAutomationProvider::GetViews( |
if (!id.is_valid()) |
continue; |
dict->Set("auto_id", id.ToValue()); |
- dict->Set("extension_id", automation_util::GetIdForExtension( |
- host->extension()).ToValue()); |
+ dict->SetString("extension_id", host->extension_id()); |
view_list->Append(dict); |
} |
DictionaryValue dict; |
@@ -6411,6 +6397,50 @@ void TestingAutomationProvider::UpdateExtensionsNow( |
updater->CheckNow(); |
} |
+void TestingAutomationProvider::IsPageActionVisible( |
+ base::DictionaryValue* args, |
+ IPC::Message* reply_message) { |
+ AutomationJSONReply reply(this, reply_message); |
+ |
+ TabContents* tab; |
+ std::string error; |
+ if (!GetTabFromJSONArgs(args, &tab, &error)) { |
+ reply.SendError(error); |
+ return; |
+ } |
+ const Extension* extension; |
+ if (!GetEnabledExtensionFromJSONArgs( |
+ args, "extension_id", profile(), &extension, &error)) { |
+ reply.SendError(error); |
+ return; |
+ } |
+ ExtensionAction* page_action = extension->page_action(); |
+ if (!page_action) { |
+ reply.SendError("Extension doesn't have any page action"); |
+ return; |
+ } |
+ Browser* browser = automation_util::GetBrowserForTab(tab); |
+ if (!browser) { |
+ reply.SendError("Tab does not belong to an open browser"); |
+ return; |
+ } |
+ |
+ bool is_visible = false; |
+ LocationBarTesting* loc_bar = |
+ browser->window()->GetLocationBar()->GetLocationBarForTesting(); |
+ size_t page_action_visible_count = |
+ static_cast<size_t>(loc_bar->PageActionVisibleCount()); |
+ for (size_t i = 0; i < page_action_visible_count; ++i) { |
+ if (loc_bar->GetVisiblePageAction(i) == page_action) { |
+ is_visible = true; |
+ break; |
+ } |
+ } |
+ DictionaryValue dict; |
+ dict.SetBoolean("is_visible", is_visible); |
+ reply.SendSuccess(&dict); |
+} |
+ |
void TestingAutomationProvider::GetChromeDriverAutomationVersion( |
DictionaryValue* args, |
IPC::Message* reply_message) { |