Index: chrome/browser/component_updater/sth_set_component_installer.cc |
diff --git a/chrome/browser/component_updater/sth_set_component_installer.cc b/chrome/browser/component_updater/sth_set_component_installer.cc |
index b6ced0134ef16a261d8719e72d851bbaeb5ac705..dc93cc38058e9e6b269015b8c796eeed1d11cb13 100644 |
--- a/chrome/browser/component_updater/sth_set_component_installer.cc |
+++ b/chrome/browser/component_updater/sth_set_component_installer.cc |
@@ -10,14 +10,17 @@ |
#include "base/files/file_enumerator.h" |
#include "base/files/file_path.h" |
#include "base/files/file_util.h" |
+#include "base/json/json_reader.h" |
#include "base/logging.h" |
#include "base/path_service.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/values.h" |
#include "base/version.h" |
#include "chrome/browser/net/sth_distributor_provider.h" |
+#include "chrome/common/chrome_features.h" |
#include "components/component_updater/component_updater_paths.h" |
#include "components/safe_json/safe_json_parser.h" |
+#include "components/variations/variations_associated_data.h" |
#include "content/public/browser/browser_thread.h" |
#include "crypto/sha2.h" |
#include "net/cert/ct_log_response_parser.h" |
@@ -51,7 +54,7 @@ const char kSTHSetFetcherManifestName[] = "Signed Tree Heads"; |
STHSetComponentInstallerTraits::STHSetComponentInstallerTraits( |
net::ct::STHObserver* sth_observer) |
- : sth_observer_(sth_observer) {} |
+ : sth_observer_(sth_observer), weak_ptr_factory_(this) {} |
STHSetComponentInstallerTraits::~STHSetComponentInstallerTraits() {} |
@@ -74,12 +77,19 @@ void STHSetComponentInstallerTraits::ComponentReady( |
const base::Version& version, |
const base::FilePath& install_dir, |
std::unique_ptr<base::DictionaryValue> manifest) { |
- if (!content::BrowserThread::PostBlockingPoolTask( |
- FROM_HERE, |
- base::Bind(&STHSetComponentInstallerTraits::LoadSTHsFromDisk, |
- base::Unretained(this), GetInstalledPath(install_dir), |
- version))) { |
- NOTREACHED(); |
+ const base::Closure load_sths_closure = base::Bind( |
+ &STHSetComponentInstallerTraits::LoadSTHsFromDisk, |
+ weak_ptr_factory_.GetWeakPtr(), GetInstalledPath(install_dir), version); |
+ |
+ if (variations::GetVariationParamValueByFeature(features::kSTHSetComponent, |
+ "delay_load") != "no") { |
+ DVLOG(1) << "Delaying STHSet load until after start-up."; |
+ content::BrowserThread::PostAfterStartupTask( |
+ FROM_HERE, content::BrowserThread::GetBlockingPool(), |
+ load_sths_closure); |
+ } else { |
+ DVLOG(1) << "Loading STHSet during start-up."; |
+ content::BrowserThread::PostBlockingPoolTask(FROM_HERE, load_sths_closure); |
} |
} |
@@ -145,12 +155,28 @@ void STHSetComponentInstallerTraits::LoadSTHsFromDisk( |
} |
DVLOG(1) << "STH: Successfully read: " << json_sth; |
- safe_json::SafeJsonParser::Parse( |
- json_sth, |
- base::Bind(&STHSetComponentInstallerTraits::OnJsonParseSuccess, |
- base::Unretained(this), log_id), |
- base::Bind(&STHSetComponentInstallerTraits::OnJsonParseError, |
- base::Unretained(this), log_id)); |
+ |
+ if (variations::GetVariationParamValueByFeature( |
+ features::kSTHSetComponent, "oop_json_parsing") != "yes") { |
+ int error_code = 0; |
+ std::string error_message; |
+ std::unique_ptr<base::Value> parsed_json = |
+ base::JSONReader::ReadAndReturnError(json_sth, base::JSON_PARSE_RFC, |
+ &error_code, &error_message); |
+ |
+ if (error_code == base::JSONReader::JSON_NO_ERROR) { |
+ OnJsonParseSuccess(log_id, std::move(parsed_json)); |
+ } else { |
+ OnJsonParseError(log_id, error_message); |
+ } |
+ } else { |
+ safe_json::SafeJsonParser::Parse( |
+ json_sth, |
+ base::Bind(&STHSetComponentInstallerTraits::OnJsonParseSuccess, |
+ weak_ptr_factory_.GetWeakPtr(), log_id), |
+ base::Bind(&STHSetComponentInstallerTraits::OnJsonParseError, |
+ weak_ptr_factory_.GetWeakPtr(), log_id)); |
+ } |
} |
} |