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..74731027263c763abd3703c44b50ee8850de94dc 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: |
+ // We don't expect these other failures given our usage of prefs. |
+ NOTREACHED(); |
+ return PERSISTENCE_FAILURE_REASON_OTHER; |
+ } |
+ } |
+ |
+ 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. |