| Index: components/cronet/android/cronet_url_request_context_adapter.cc
|
| diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc
|
| index ef1fde084ad1346a905d2721fd05d1d4c5109250..d7daaaa9464d15da7f72cd471034de8c46d6c2c3 100644
|
| --- a/components/cronet/android/cronet_url_request_context_adapter.cc
|
| +++ b/components/cronet/android/cronet_url_request_context_adapter.cc
|
| @@ -94,6 +94,105 @@ class PrefServiceAdapter
|
| DISALLOW_COPY_AND_ASSIGN(PrefServiceAdapter);
|
| };
|
|
|
| +// Connects the SdchOwner's storage to the prefs.
|
| +class SdchOwnerPrefStorage : public net::SdchOwner::PrefStorage,
|
| + public PrefStore::Observer {
|
| + public:
|
| + explicit SdchOwnerPrefStorage(PersistentPrefStore* storage)
|
| + : storage_(storage), storage_key_("SDCH"), init_observer_(nullptr) {}
|
| + ~SdchOwnerPrefStorage() override {
|
| + if (init_observer_)
|
| + storage_->RemoveObserver(this);
|
| + }
|
| +
|
| + ReadError GetReadError() const override {
|
| + PersistentPrefStore::PrefReadError error = storage_->GetReadError();
|
| +
|
| + DCHECK_NE(
|
| + error,
|
| + PersistentPrefStore::PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE);
|
| + DCHECK_NE(error, PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM);
|
| +
|
| + switch (error) {
|
| + case PersistentPrefStore::PREF_READ_ERROR_NONE:
|
| + return PERSISTENCE_FAILURE_NONE;
|
| +
|
| + case PersistentPrefStore::PREF_READ_ERROR_NO_FILE:
|
| + return PERSISTENCE_FAILURE_REASON_NO_FILE;
|
| +
|
| + case PersistentPrefStore::PREF_READ_ERROR_JSON_PARSE:
|
| + case PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE:
|
| + case PersistentPrefStore::PREF_READ_ERROR_FILE_OTHER:
|
| + case PersistentPrefStore::PREF_READ_ERROR_FILE_LOCKED:
|
| + case PersistentPrefStore::PREF_READ_ERROR_JSON_REPEAT:
|
| + return PERSISTENCE_FAILURE_REASON_READ_FAILED;
|
| +
|
| + case PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED:
|
| + case PersistentPrefStore::PREF_READ_ERROR_FILE_NOT_SPECIFIED:
|
| + case PersistentPrefStore::PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE:
|
| + case PersistentPrefStore::PREF_READ_ERROR_MAX_ENUM:
|
| + default:
|
| + // These should not occur in our usage.
|
| + NOTREACHED();
|
| + return PERSISTENCE_FAILURE_NONE;
|
| + }
|
| + }
|
| +
|
| + bool GetValue(const base::DictionaryValue** result) const override {
|
| + const base::Value* result_value = nullptr;
|
| + if (!storage_->GetValue(storage_key_, &result_value))
|
| + return false;
|
| + return result_value->GetAsDictionary(result);
|
| + }
|
| +
|
| + bool GetMutableValue(base::DictionaryValue** result) override {
|
| + base::Value* result_value = nullptr;
|
| + if (!storage_->GetMutableValue(storage_key_, &result_value))
|
| + return false;
|
| + return result_value->GetAsDictionary(result);
|
| + }
|
| +
|
| + void SetValue(scoped_ptr<base::DictionaryValue> value) override {
|
| + storage_->SetValue(storage_key_, std::move(value),
|
| + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
|
| + }
|
| +
|
| + void ReportValueChanged() override {
|
| + storage_->ReportValueChanged(storage_key_,
|
| + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
|
| + }
|
| +
|
| + bool IsInitializationComplete() override {
|
| + return storage_->IsInitializationComplete();
|
| + }
|
| +
|
| + void StartObservingInit(net::SdchOwner* observer) override {
|
| + DCHECK(!init_observer_);
|
| + init_observer_ = observer;
|
| + storage_->AddObserver(this);
|
| + }
|
| +
|
| + void StopObservingInit() override {
|
| + DCHECK(init_observer_);
|
| + init_observer_ = nullptr;
|
| + storage_->RemoveObserver(this);
|
| + }
|
| +
|
| + private:
|
| + // PrefStore::Observer implementation.
|
| + void OnPrefValueChanged(const std::string& key) override {}
|
| + void OnInitializationCompleted(bool succeeded) override {
|
| + init_observer_->OnPrefStorageInitializationComplete(succeeded);
|
| + }
|
| +
|
| + PersistentPrefStore* storage_; // Non-owning.
|
| + const std::string storage_key_;
|
| +
|
| + net::SdchOwner* init_observer_; // Non-owning.
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SdchOwnerPrefStorage);
|
| +};
|
| +
|
| class BasicNetworkDelegate : public net::NetworkDelegateImpl {
|
| public:
|
| BasicNetworkDelegate() {}
|
| @@ -377,8 +476,10 @@ void CronetURLRequestContextAdapter::InitializeOnNetworkThread(
|
| DCHECK(context_->sdch_manager());
|
| sdch_owner_.reset(
|
| new net::SdchOwner(context_->sdch_manager(), context_.get()));
|
| - if (json_pref_store_)
|
| - sdch_owner_->EnablePersistentStorage(json_pref_store_.get());
|
| + if (json_pref_store_) {
|
| + sdch_owner_->EnablePersistentStorage(
|
| + make_scoped_ptr(new SdchOwnerPrefStorage(json_pref_store_.get())));
|
| + }
|
| }
|
|
|
| // Currently (circa M39) enabling QUIC requires setting probability threshold.
|
|
|