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); |