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

Unified Diff: chrome/browser/chromeos/gdata/operations_base.cc

Issue 10808027: gdrive: Get JSON feeds parsing off the UI thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: making OnDataParsed() a private method of GetDataOperation Created 8 years, 5 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
« no previous file with comments | « chrome/browser/chromeos/gdata/operations_base.h ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/gdata/operations_base.cc
diff --git a/chrome/browser/chromeos/gdata/operations_base.cc b/chrome/browser/chromeos/gdata/operations_base.cc
index 5890d19f08683a479fb0d7a5b9f1a7020380f526..1f4e3fc3253f56f0e537696f37632a5342bfbd78 100644
--- a/chrome/browser/chromeos/gdata/operations_base.cc
+++ b/chrome/browser/chromeos/gdata/operations_base.cc
@@ -45,6 +45,28 @@ const char kDocsListScope[] = "https://docs.google.com/feeds/";
const char kSpreadsheetsScope[] = "https://spreadsheets.google.com/feeds/";
const char kUserContentScope[] = "https://docs.googleusercontent.com/";
+// Parse JSON string to base::Value object.
+void ParseJsonOnBlockingPool(const std::string& data,
+ scoped_ptr<base::Value>* value) {
+ DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ int error_code = -1;
+ std::string error_message;
+ value->reset(base::JSONReader::ReadAndReturnError(data,
+ base::JSON_PARSE_RFC,
+ &error_code,
+ &error_message));
+
+ if (!value->get()) {
+ LOG(ERROR) << "Error while parsing entry response: "
+ << error_message
+ << ", code: "
+ << error_code
+ << ", data:\n"
+ << data;
+ }
+}
+
} // namespace
namespace gdata {
@@ -230,6 +252,13 @@ GDataErrorCode UrlFetchOperationBase::GetErrorCode(
return code;
}
+void UrlFetchOperationBase::OnProcessURLFetchResultsComplete(bool result) {
+ if (result)
+ NotifySuccessToOperationRegistry();
+ else
+ NotifyFinish(GDataOperationRegistry::OPERATION_FAILED);
+}
+
void UrlFetchOperationBase::OnURLFetchComplete(const URLFetcher* source) {
GDataErrorCode code = GetErrorCode(source);
DVLOG(1) << "Response headers:\n" << GetResponseHeadersAsString(source);
@@ -246,11 +275,7 @@ void UrlFetchOperationBase::OnURLFetchComplete(const URLFetcher* source) {
}
// Overridden by each specialization
- bool success = ProcessURLFetchResults(source);
- if (success)
- NotifySuccessToOperationRegistry();
- else
- NotifyFinish(GDataOperationRegistry::OPERATION_FAILED);
+ ProcessURLFetchResults(source);
}
void UrlFetchOperationBase::NotifySuccessToOperationRegistry() {
@@ -310,13 +335,12 @@ EntryActionOperation::EntryActionOperation(GDataOperationRegistry* registry,
EntryActionOperation::~EntryActionOperation() {}
-bool EntryActionOperation::ProcessURLFetchResults(
- const URLFetcher* source) {
+void EntryActionOperation::ProcessURLFetchResults(const URLFetcher* source) {
if (!callback_.is_null()) {
GDataErrorCode code = GetErrorCode(source);
callback_.Run(code, document_url_);
}
- return true;
+ OnProcessURLFetchResultsComplete(true);
hashimoto 2012/07/26 02:08:44 Do something (replace true with "const bool succes
yoshiki 2012/07/26 17:31:40 Done.
}
void EntryActionOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) {
@@ -329,57 +353,87 @@ void EntryActionOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) {
GetDataOperation::GetDataOperation(GDataOperationRegistry* registry,
Profile* profile,
const GetDataCallback& callback)
- : UrlFetchOperationBase(registry, profile), callback_(callback) {
+ : UrlFetchOperationBase(registry, profile),
+ callback_(callback) {
}
GetDataOperation::~GetDataOperation() {}
-bool GetDataOperation::ProcessURLFetchResults(const URLFetcher* source) {
+void GetDataOperation::ProcessURLFetchResults(const URLFetcher* source) {
std::string data;
source->GetResponseAsString(&data);
scoped_ptr<base::Value> root_value;
- GDataErrorCode code = GetErrorCode(source);
+ GDataErrorCode fetch_error_code = GetErrorCode(source);
- switch (code) {
+ switch (fetch_error_code) {
case HTTP_SUCCESS:
- case HTTP_CREATED: {
- root_value.reset(ParseResponse(data));
- if (!root_value.get())
- code = GDATA_PARSE_ERROR;
-
+ case HTTP_CREATED:
+ ParseResponse(fetch_error_code, data);
break;
- }
default:
+ RunCallback(fetch_error_code, scoped_ptr<base::Value>());
+ OnProcessURLFetchResultsComplete(false);
hashimoto 2012/07/26 02:08:44 ditto.
yoshiki 2012/07/26 17:31:40 Done.
break;
}
-
- if (!callback_.is_null())
- callback_.Run(code, root_value.Pass());
- return root_value.get() != NULL;
}
-void GetDataOperation::RunCallbackOnPrematureFailure(GDataErrorCode code) {
+void GetDataOperation::RunCallbackOnPrematureFailure(
+ GDataErrorCode fetch_error_code) {
if (!callback_.is_null()) {
scoped_ptr<base::Value> root_value;
- callback_.Run(code, root_value.Pass());
+ callback_.Run(fetch_error_code, root_value.Pass());
}
}
-base::Value* GetDataOperation::ParseResponse(const std::string& data) {
- int error_code = -1;
- std::string error_message;
- scoped_ptr<base::Value> root_value(base::JSONReader::ReadAndReturnError(
- data, base::JSON_PARSE_RFC, &error_code, &error_message));
- if (!root_value.get()) {
- LOG(ERROR) << "Error while parsing entry response: "
- << error_message
- << ", code: "
- << error_code
- << ", data:\n"
- << data;
- return NULL;
+void GetDataOperation::ParseResponse(GDataErrorCode fetch_error_code,
+ const std::string& data) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ // Uses this hack to avoid deep-copy of json object because json might be so
+ // big. This pointer of scped_ptr is to ensure a deletion of the parsed json
+ // value object.
+ scoped_ptr<base::Value>* parsed_value = new scoped_ptr<base::Value>();
+
+ BrowserThread::PostBlockingPoolTaskAndReply(
+ FROM_HERE,
+ base::Bind(&ParseJsonOnBlockingPool,
+ data,
+ parsed_value),
+ base::Bind(&GetDataOperation::OnDataParsed,
+ base::Unretained(this),
hashimoto 2012/07/26 02:08:44 Use WeakPtr
yoshiki 2012/07/26 17:31:40 Done.
+ fetch_error_code,
+ base::Owned(parsed_value),
+ callback_));
+}
+
+void GetDataOperation::OnDataParsed(
+ gdata::GDataErrorCode fetch_error_code,
+ scoped_ptr<base::Value>* value,
+ const gdata::GetDataCallback& callback) {
hashimoto 2012/07/26 02:08:44 Since |callback_| is always passed, this argument
yoshiki 2012/07/26 17:31:40 Done.
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ bool ret = true;
hashimoto 2012/07/26 02:08:44 |ret| is ambiguous, rename this variable to |succe
yoshiki 2012/07/26 17:31:40 Done.
+ if (!value->get()) {
+ fetch_error_code = gdata::GDATA_PARSE_ERROR;
+ ret = false;
}
- return root_value.release();
+
+ // The ownership of the parsed json object is transfered to RunCallBack(),
+ // keeping the ownership of the |value| here.
+ if (!callback.is_null())
hashimoto 2012/07/26 02:08:44 Call RunCallback() instead.
yoshiki 2012/07/26 17:31:40 Done.
+ callback.Run(fetch_error_code, value->Pass());
+
+ DCHECK(!value->get());
+
+ OnProcessURLFetchResultsComplete(ret);
+ // |value| will be deleted after return beause it is base::Owned()'d.
+}
+
+void GetDataOperation::RunCallback(GDataErrorCode fetch_error_code,
+ scoped_ptr<base::Value> value) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (!callback_.is_null())
+ callback_.Run(fetch_error_code, value.Pass());
}
} // namespace gdata
« no previous file with comments | « chrome/browser/chromeos/gdata/operations_base.h ('k') | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698