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

Unified Diff: chrome/browser/automation/automation_provider.cc

Issue 2861019: Enable "get html from page" functionality for PyAuto.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/automation/automation_provider.cc
===================================================================
--- chrome/browser/automation/automation_provider.cc (revision 50654)
+++ chrome/browser/automation/automation_provider.cc (working copy)
@@ -9,6 +9,7 @@
#include "app/l10n_util.h"
#include "app/message_box_flags.h"
#include "base/callback.h"
+#include "base/file_path.h"
#include "base/file_version_info.h"
#include "base/json/json_reader.h"
#include "base/json/json_writer.h"
@@ -1608,6 +1609,19 @@
Send(reply_message);
}
+std::string AutomationProvider::JSONErrorString(std::string err) {
Paweł Hajdan Jr. 2010/06/24 06:21:48 Could you move this from being AutomationProvider'
+ std::string prefix = "{\"error\": \"";
+ std::string no_quote_err = err;
+ std::string suffix = "\"}";
+
+ // Don't allow input string to break JSON by embedding quotes.
Paweł Hajdan Jr. 2010/06/24 06:21:48 How about using functions from base/json/string_es
+ // Try and make sure the input string won't break json quoting rules.
+ if (no_quote_err.find("\"") != std::string::npos)
+ no_quote_err = "unhappy about embedded quote in error string";
+
+ return prefix + no_quote_err + suffix;
+}
+
// Sample json input: { "command": "GetBrowserInfo" }
// Refer to GetBrowserInfo() in chrome/test/pyautolib/pyauto.py for
// sample json output.
@@ -1796,7 +1810,7 @@
if (title.length())
hs->SetPageTitle(gurl, title);
} else {
- json_return = "{\"error\": \"bad args (no URL in dict?).\"}";
+ json_return = JSONErrorString("bad args (no URL in dict?)");
reply_return = false;
}
@@ -1817,7 +1831,7 @@
scoped_ptr<DictionaryValue> return_value(new DictionaryValue);
if (!profile_->HasCreatedDownloadManager()) {
- json_return = "{\"error\": \"no download manager\"}";
+ json_return = JSONErrorString("no download manager");
reply_return = false;
} else {
// Use DownloadManager's GetDownloads() method and not GetCurrentDownloads()
@@ -1883,7 +1897,7 @@
// Look for a quick return.
if (!profile_->HasCreatedDownloadManager()) {
- json_return = "{\"error\": \"no download manager\"}";
+ json_return = JSONErrorString("no download manager");
reply_return = false;
} else {
profile_->GetDownloadManager()->GetCurrentDownloads(&observer,
@@ -1948,16 +1962,16 @@
const PrefService::Preference* pref =
pref_service->FindPreference(path.c_str());
if (!pref) { // Not a registered pref.
- json_return = "{\"error\": \"pref not registered.\"}";
+ json_return = JSONErrorString("pref not registered.");
reply_return = false;
} else if (pref->IsManaged()) { // Do not attempt to change a managed pref.
- json_return = "{\"error\": \"pref is managed. cannot be changed.\"}";
+ json_return = JSONErrorString("pref is managed. cannot be changed.");
reply_return = false;
} else { // Set the pref.
pref_service->Set(path.c_str(), *val);
}
} else {
- json_return = "{\"error\": \"no pref path or value given.\"}";
+ json_return = JSONErrorString("no pref path or value given.");
reply_return = false;
}
@@ -2019,7 +2033,7 @@
std::wstring text;
if (!args->GetString(L"text", &text)) {
- json_return = "{\"error\": \"text missing\"}";
+ json_return = JSONErrorString("text missing");
reply_return = false;
} else {
browser->FocusLocationBar();
@@ -2047,7 +2061,7 @@
int count;
if (!args->GetInteger(L"count", &count)) {
- json_return = "{\"error\": \"count missing\"}";
+ json_return = JSONErrorString("count missing");
reply_return = false;
} else {
LocationBar* loc_bar = browser->window()->GetLocationBar();
@@ -2153,7 +2167,7 @@
bool reply_return = true;
FilePath::StringType path;
if (!args->GetString(L"path", &path)) {
- json_return = "{\"error\": \"path not specified.\"}";
+ json_return = JSONErrorString("path not specified.");
reply_return = false;
} else if (!NPAPI::PluginList::Singleton()->EnablePlugin(FilePath(path))) {
json_return = StringPrintf("{\"error\": \"Could not enable plugin"
@@ -2176,7 +2190,7 @@
bool reply_return = true;
FilePath::StringType path;
if (!args->GetString(L"path", &path)) {
- json_return = "{\"error\": \"path not specified.\"}";
+ json_return = JSONErrorString("path not specified.");
reply_return = false;
} else if (!NPAPI::PluginList::Singleton()->DisablePlugin(FilePath(path))) {
json_return = StringPrintf("{\"error\": \"Could not enable plugin"
@@ -2189,6 +2203,52 @@
Send(reply_message);
}
+// Sample json input:
+// { "command": "SaveTabContents",
+// "tab_index": 0,
+// "filename": <a full pathname> }
+// Sample json output:
+// {}
+void AutomationProvider::SaveTabContents(Browser* browser,
+ DictionaryValue* args,
+ IPC::Message* reply_message) {
+ std::string json_return;
+ int tab_index = 0;
+ FilePath::StringType filename;
+ FilePath::StringType parent_directory;
+ TabContents* tab_contents = NULL;
+
+ if (!args->GetInteger(L"tab_index", &tab_index) ||
+ !args->GetString(L"filename", &filename)) {
+ json_return = JSONErrorString("tab_index or filename param missing");
+ } else {
+ tab_contents = browser->GetTabContentsAt(tab_index);
+ if (!tab_contents) {
+ json_return = JSONErrorString("no tab at tab_index");
+ }
+ }
+ if (tab_contents) {
+ // We're doing a SAVE_AS_ONLY_HTML so the the directory path isn't
+ // used. Nevertheless, SavePackage requires it be valid. Sigh.
+ parent_directory = FilePath(filename).DirName().value();
+ if (!tab_contents->SavePage(FilePath(filename), FilePath(parent_directory),
+ SavePackage::SAVE_AS_ONLY_HTML)) {
+ json_return = JSONErrorString("Could not initiate SavePage");
+ } else {
+ // The observer will delete itself when done.
+ new SavePackageNotificationObserver(tab_contents->save_package(),
+ this, reply_message);
+ return;
+ }
+ }
+
+ // if we get here, error.
Paweł Hajdan Jr. 2010/06/24 06:21:48 nit: "if" -> "If".
+ DCHECK(!json_return.empty());
+ AutomationMsg_SendJSONRequest::WriteReplyParams(
+ reply_message, json_return, false);
+ Send(reply_message);
+}
+
void AutomationProvider::SendJSONRequest(int handle,
std::string json_request,
IPC::Message* reply_message) {
@@ -2254,6 +2314,8 @@
handler_map["GetInitialLoadTimes"] = &AutomationProvider::GetInitialLoadTimes;
+ handler_map["SaveTabContents"] = &AutomationProvider::SaveTabContents;
+
if (error_string.empty()) {
if (handler_map.find(std::string(command)) != handler_map.end()) {
(this->*handler_map[command])(browser, dict_value, reply_message);
« no previous file with comments | « chrome/browser/automation/automation_provider.h ('k') | chrome/browser/automation/automation_provider_observers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698