diff options
author | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-04 05:55:17 +0000 |
---|---|---|
committer | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-04 05:55:17 +0000 |
commit | 94b4ffcdc5127a860ca87e017478465231f4fcb7 (patch) | |
tree | 1de32abcb06a9d14a34a7dac21e3ae2030e3666b /chrome/browser/extensions | |
parent | 5243ecdcbec0afd366bcf6956aad5db762a2105c (diff) | |
download | chromium_src-94b4ffcdc5127a860ca87e017478465231f4fcb7.zip chromium_src-94b4ffcdc5127a860ca87e017478465231f4fcb7.tar.gz chromium_src-94b4ffcdc5127a860ca87e017478465231f4fcb7.tar.bz2 |
Avoid crashes due to GetDefaultRequestContext returning NULL.
The change involves two things: check the return value of
Profile::GetDefaultRequestContext for NULL, and also shutting down the
ExtensionUpdater a little earlier than before (when the profile is
being destructed, instead of at ExtensionService destruction time).
BUG=70887
TEST=none
Review URL: http://codereview.chromium.org/6368084
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@73764 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r-- | chrome/browser/extensions/extension_service.cc | 7 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_service.h | 2 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_updater.cc | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_updater_unittest.cc | 10 |
4 files changed, 16 insertions, 8 deletions
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 51b654a..ef2b2a4 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc @@ -484,9 +484,7 @@ bool ExtensionService::HasInstalledExtensions() { ExtensionService::~ExtensionService() { DCHECK(!profile_); // Profile should have told us it's going away. UnloadAllExtensions(); - if (updater_.get()) { - updater_->Stop(); - } + ProviderCollection::const_iterator i; for (i = external_extension_providers_.begin(); i != external_extension_providers_.end(); ++i) { @@ -1247,6 +1245,9 @@ void ExtensionService::UpdateExtensionBlacklist( } void ExtensionService::DestroyingProfile() { + if (updater_.get()) { + updater_->Stop(); + } browser_event_router_.reset(); pref_change_registrar_.RemoveAll(); profile_ = NULL; diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h index 8d060a0..46cae33 100644 --- a/chrome/browser/extensions/extension_service.h +++ b/chrome/browser/extensions/extension_service.h @@ -7,6 +7,7 @@ #pragma once #include <map> +#include <set> #include <string> #include <vector> @@ -93,6 +94,7 @@ class ExtensionUpdateService { virtual bool HasInstalledExtensions() = 0; virtual ExtensionPrefs* extension_prefs() = 0; + virtual Profile* profile() = 0; }; // Manages installed and running Chromium extensions. diff --git a/chrome/browser/extensions/extension_updater.cc b/chrome/browser/extensions/extension_updater.cc index 88a9992..8e8aa72 100644 --- a/chrome/browser/extensions/extension_updater.cc +++ b/chrome/browser/extensions/extension_updater.cc @@ -910,7 +910,8 @@ void ExtensionUpdater::StartUpdateCheck(ManifestFetchData* fetch_data) { manifest_fetcher_.reset( URLFetcher::Create(kManifestFetcherId, fetch_data->full_url(), URLFetcher::GET, this)); - manifest_fetcher_->set_request_context(Profile::GetDefaultRequestContext()); + manifest_fetcher_->set_request_context( + service_->profile()->GetRequestContext()); manifest_fetcher_->set_load_flags(net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DISABLE_CACHE); @@ -938,7 +939,7 @@ void ExtensionUpdater::FetchUpdatedExtension(const std::string& id, extension_fetcher_.reset( URLFetcher::Create(kExtensionFetcherId, url, URLFetcher::GET, this)); extension_fetcher_->set_request_context( - Profile::GetDefaultRequestContext()); + service_->profile()->GetRequestContext()); extension_fetcher_->set_load_flags(net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DISABLE_CACHE); diff --git a/chrome/browser/extensions/extension_updater_unittest.cc b/chrome/browser/extensions/extension_updater_unittest.cc index aca27e4..cb992af8 100644 --- a/chrome/browser/extensions/extension_updater_unittest.cc +++ b/chrome/browser/extensions/extension_updater_unittest.cc @@ -23,6 +23,7 @@ #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h" #include "chrome/common/net/test_url_fetcher_factory.h" +#include "chrome/test/testing_profile.h" #include "net/base/escape.h" #include "net/base/load_flags.h" #include "net/url_request/url_request_status.h" @@ -46,7 +47,9 @@ int expected_load_flags = // Base class for further specialized test classes. class MockService : public ExtensionUpdateService { public: - MockService() {} + MockService() { + profile_.CreateRequestContext(); + } virtual ~MockService() {} virtual const ExtensionList* extensions() const { @@ -86,6 +89,8 @@ class MockService : public ExtensionUpdateService { virtual ExtensionPrefs* extension_prefs() { return prefs_.prefs(); } + virtual Profile* profile() { return &profile_; } + PrefService* pref_service() { return prefs_.pref_service(); } // Creates test extensions and inserts them into list. The name and @@ -114,6 +119,7 @@ class MockService : public ExtensionUpdateService { protected: PendingExtensionMap pending_extensions_; TestExtensionPrefs prefs_; + TestingProfile profile_; private: DISALLOW_COPY_AND_ASSIGN(MockService); @@ -1066,8 +1072,6 @@ TEST(ExtensionUpdaterTest, TestAfterStopBehavior) { // TODO(asargent) - (http://crbug.com/12780) add tests for: // -prodversionmin (shouldn't update if browser version too old) // -manifests & updates arriving out of order / interleaved -// -Profile::GetDefaultRequestContext() returning null -// (should not crash, but just do check later) // -malformed update url (empty, file://, has query, has a # fragment, etc.) // -An extension gets uninstalled while updates are in progress (so it doesn't // "come back from the dead") |