Index: chrome/browser/extensions/webstore_data_fetcher.cc |
diff --git a/chrome/browser/extensions/webstore_data_fetcher.cc b/chrome/browser/extensions/webstore_data_fetcher.cc |
index f91164350c0d2858163e9e1d4569ed35624e77f0..5d5e5254688870614f85c34d14d0ab91c2759d58 100644 |
--- a/chrome/browser/extensions/webstore_data_fetcher.cc |
+++ b/chrome/browser/extensions/webstore_data_fetcher.cc |
@@ -4,21 +4,15 @@ |
#include "chrome/browser/extensions/webstore_data_fetcher.h" |
+#include "base/bind.h" |
#include "base/values.h" |
#include "chrome/browser/extensions/webstore_data_fetcher_delegate.h" |
-#include "chrome/common/chrome_utility_messages.h" |
+#include "chrome/browser/safe_json_parser.h" |
#include "chrome/common/extensions/extension_constants.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/utility_process_host.h" |
-#include "content/public/browser/utility_process_host_client.h" |
#include "net/base/load_flags.h" |
#include "net/url_request/url_fetcher.h" |
#include "net/url_request/url_request_status.h" |
-using content::BrowserThread; |
-using content::UtilityProcessHost; |
-using content::UtilityProcessHostClient; |
- |
namespace { |
const char kInvalidWebstoreResponseError[] = "Invalid Chrome Web Store reponse"; |
@@ -27,97 +21,6 @@ const char kInvalidWebstoreResponseError[] = "Invalid Chrome Web Store reponse"; |
namespace extensions { |
-class WebstoreDataFetcher::SafeWebstoreResponseParser |
- : public UtilityProcessHostClient { |
- public: |
- SafeWebstoreResponseParser(const base::WeakPtr<WebstoreDataFetcher>& client, |
- const std::string& webstore_data) |
- : client_(client), |
- webstore_data_(webstore_data) {} |
- |
- void Start() { |
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- BrowserThread::PostTask( |
- BrowserThread::IO, |
- FROM_HERE, |
- base::Bind(&SafeWebstoreResponseParser::StartWorkOnIOThread, this)); |
- } |
- |
- void StartWorkOnIOThread() { |
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- UtilityProcessHost* host = |
- UtilityProcessHost::Create( |
- this, base::MessageLoopProxy::current()); |
- host->EnableZygote(); |
- host->Send(new ChromeUtilityMsg_ParseJSON(webstore_data_)); |
- } |
- |
- // Implementing pieces of the UtilityProcessHostClient interface. |
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(SafeWebstoreResponseParser, message) |
- IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ParseJSON_Succeeded, |
- OnJSONParseSucceeded) |
- IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ParseJSON_Failed, |
- OnJSONParseFailed) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
- } |
- |
- void OnJSONParseSucceeded(const base::ListValue& wrapper) { |
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- const Value* value = NULL; |
- CHECK(wrapper.Get(0, &value)); |
- if (value->IsType(Value::TYPE_DICTIONARY)) { |
- parsed_webstore_data_.reset( |
- static_cast<const DictionaryValue*>(value)->DeepCopy()); |
- } else { |
- error_ = kInvalidWebstoreResponseError; |
- } |
- |
- ReportResults(); |
- } |
- |
- virtual void OnJSONParseFailed(const std::string& error_message) { |
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- error_ = error_message; |
- ReportResults(); |
- } |
- |
- void ReportResults() { |
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
- |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&SafeWebstoreResponseParser::ReportResultOnUIThread, this)); |
- } |
- |
- void ReportResultOnUIThread() { |
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (!client_) |
- return; |
- |
- if (error_.empty() && parsed_webstore_data_) { |
- client_->OnWebstoreResponseParseSuccess(parsed_webstore_data_.release()); |
- } else { |
- client_->OnWebstoreResponseParseFailure(error_); |
- } |
- } |
- |
- private: |
- virtual ~SafeWebstoreResponseParser() {} |
- |
- base::WeakPtr<WebstoreDataFetcher> client_; |
- |
- std::string webstore_data_; |
- std::string error_; |
- scoped_ptr<DictionaryValue> parsed_webstore_data_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SafeWebstoreResponseParser); |
-}; |
- |
WebstoreDataFetcher::WebstoreDataFetcher( |
WebstoreDataFetcherDelegate* delegate, |
net::URLRequestContextGetter* request_context, |
@@ -143,12 +46,18 @@ void WebstoreDataFetcher::Start() { |
webstore_data_url_fetcher_->Start(); |
} |
-void WebstoreDataFetcher::OnWebstoreResponseParseSuccess( |
- base::DictionaryValue* webstore_data) { |
- delegate_->OnWebstoreResponseParseSuccess(webstore_data); |
+void WebstoreDataFetcher::OnJsonParseSuccess( |
+ scoped_ptr<base::Value> parsed_json) { |
+ if (!parsed_json->IsType(base::Value::TYPE_DICTIONARY)) { |
+ OnJsonParseFailure(kInvalidWebstoreResponseError); |
+ return; |
+ } |
+ |
+ delegate_->OnWebstoreResponseParseSuccess( |
+ static_cast<base::DictionaryValue*>(parsed_json.release())); |
} |
-void WebstoreDataFetcher::OnWebstoreResponseParseFailure( |
+void WebstoreDataFetcher::OnJsonParseFailure( |
const std::string& error) { |
delegate_->OnWebstoreResponseParseFailure(error); |
} |
@@ -167,10 +76,13 @@ void WebstoreDataFetcher::OnURLFetchComplete(const net::URLFetcher* source) { |
std::string webstore_json_data; |
fetcher->GetResponseAsString(&webstore_json_data); |
- scoped_refptr<SafeWebstoreResponseParser> parser = |
- new SafeWebstoreResponseParser(AsWeakPtr(), webstore_json_data); |
- // The parser will call us back via OnWebstoreResponseParseSucces or |
- // OnWebstoreResponseParseFailure. |
+ scoped_refptr<SafeJsonParser> parser = |
+ new SafeJsonParser(webstore_json_data, |
+ base::Bind(&WebstoreDataFetcher::OnJsonParseSuccess, |
+ AsWeakPtr()), |
+ base::Bind(&WebstoreDataFetcher::OnJsonParseFailure, |
+ AsWeakPtr())); |
+ // The parser will call us back via one of the callbacks. |
parser->Start(); |
} |