summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-30 01:49:06 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-30 01:49:06 +0000
commit95d291980d768c38e1f70bc041957870913e07f6 (patch)
tree383ea24e44f58696c3cf2871f44846f5a973f473 /chrome/browser/extensions
parentbb3bb6d013ca8b7b9fde9b985950f181cc32577a (diff)
downloadchromium_src-95d291980d768c38e1f70bc041957870913e07f6.zip
chromium_src-95d291980d768c38e1f70bc041957870913e07f6.tar.gz
chromium_src-95d291980d768c38e1f70bc041957870913e07f6.tar.bz2
Get rid of MessageLoop* caching in extensions code.
BUG=25354 Review URL: http://codereview.chromium.org/345023 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30550 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r--chrome/browser/extensions/crx_installer.cc73
-rw-r--r--chrome/browser/extensions/crx_installer.h10
-rw-r--r--chrome/browser/extensions/extension_disabled_infobar_delegate.cc13
-rw-r--r--chrome/browser/extensions/extension_message_service.cc21
-rw-r--r--chrome/browser/extensions/extension_message_service.h3
-rw-r--r--chrome/browser/extensions/extension_updater.cc99
-rw-r--r--chrome/browser/extensions/extension_updater.h15
-rw-r--r--chrome/browser/extensions/extension_updater_unittest.cc25
-rw-r--r--chrome/browser/extensions/extensions_service.cc125
-rw-r--r--chrome/browser/extensions/extensions_service.h12
-rw-r--r--chrome/browser/extensions/extensions_service_unittest.cc19
-rw-r--r--chrome/browser/extensions/extensions_ui.cc8
-rw-r--r--chrome/browser/extensions/image_loading_tracker.cc29
-rw-r--r--chrome/browser/extensions/pack_extension_job.cc17
-rw-r--r--chrome/browser/extensions/pack_extension_job.h4
-rw-r--r--chrome/browser/extensions/sandboxed_extension_unpacker.cc13
-rw-r--r--chrome/browser/extensions/sandboxed_extension_unpacker.h2
-rw-r--r--chrome/browser/extensions/user_script_listener.cc43
-rw-r--r--chrome/browser/extensions/user_script_listener.h7
-rw-r--r--chrome/browser/extensions/user_script_listener_unittest.cc14
-rw-r--r--chrome/browser/extensions/user_script_master.cc30
-rw-r--r--chrome/browser/extensions/user_script_master.h17
-rw-r--r--chrome/browser/extensions/user_script_master_unittest.cc19
23 files changed, 289 insertions, 329 deletions
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index 359f45a..6c6259f 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -10,6 +10,7 @@
#include "base/string_util.h"
#include "base/task.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/extensions/extension_file_util.h"
#include "chrome/common/extensions/extension_error_reporter.h"
#include "chrome/common/notification_service.h"
@@ -32,14 +33,12 @@ void CrxInstaller::Start(const FilePath& crx_path,
const std::string& expected_id,
bool delete_crx,
bool allow_privilege_increase,
- MessageLoop* file_loop,
ExtensionsService* frontend,
ExtensionInstallUI* client) {
// Note: We don't keep a reference because this object manages its own
// lifetime.
new CrxInstaller(crx_path, install_directory, install_source, expected_id,
- delete_crx, allow_privilege_increase, file_loop, frontend,
- client);
+ delete_crx, allow_privilege_increase, frontend, client);
}
CrxInstaller::CrxInstaller(const FilePath& crx_path,
@@ -48,7 +47,6 @@ CrxInstaller::CrxInstaller(const FilePath& crx_path,
const std::string& expected_id,
bool delete_crx,
bool allow_privilege_increase,
- MessageLoop* file_loop,
ExtensionsService* frontend,
ExtensionInstallUI* client)
: crx_path_(crx_path),
@@ -57,8 +55,6 @@ CrxInstaller::CrxInstaller(const FilePath& crx_path,
expected_id_(expected_id),
delete_crx_(delete_crx),
allow_privilege_increase_(allow_privilege_increase),
- file_loop_(file_loop),
- ui_loop_(MessageLoop::current()),
frontend_(frontend),
client_(client) {
@@ -67,8 +63,9 @@ CrxInstaller::CrxInstaller(const FilePath& crx_path,
unpacker_ = new SandboxedExtensionUnpacker(
crx_path, g_browser_process->resource_dispatcher_host(), this);
- file_loop->PostTask(FROM_HERE, NewRunnableMethod(unpacker_,
- &SandboxedExtensionUnpacker::Start));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(unpacker_, &SandboxedExtensionUnpacker::Start));
}
CrxInstaller::~CrxInstaller() {
@@ -76,25 +73,27 @@ CrxInstaller::~CrxInstaller() {
// destructor might be called on any thread, so we post a task to the file
// thread to make sure the delete happens there.
if (!temp_dir_.value().empty()) {
- file_loop_->PostTask(FROM_HERE, NewRunnableFunction(&DeleteFileHelper,
- temp_dir_, true)); // recursive delete
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableFunction(&DeleteFileHelper, temp_dir_, true));
}
if (delete_crx_) {
- file_loop_->PostTask(FROM_HERE, NewRunnableFunction(&DeleteFileHelper,
- crx_path_, false)); // non-recursive delete
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableFunction(&DeleteFileHelper, crx_path_, false));
}
}
void CrxInstaller::OnUnpackFailure(const std::string& error_message) {
- DCHECK(MessageLoop::current() == file_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
ReportFailureFromFileThread(error_message);
}
void CrxInstaller::OnUnpackSuccess(const FilePath& temp_dir,
const FilePath& extension_dir,
Extension* extension) {
- DCHECK(MessageLoop::current() == file_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
// Note: We take ownership of |extension| and |temp_dir|.
extension_.reset(extension);
@@ -128,8 +127,9 @@ void CrxInstaller::OnUnpackSuccess(const FilePath& temp_dir,
extension_->GetIconPath(Extension::EXTENSION_ICON_LARGE).GetFilePath();
DecodeInstallIcon(icon_path, &install_icon_);
}
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &CrxInstaller::ConfirmInstall));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &CrxInstaller::ConfirmInstall));
}
// static
@@ -168,7 +168,7 @@ void CrxInstaller::DecodeInstallIcon(const FilePath& large_icon_path,
}
void CrxInstaller::ConfirmInstall() {
- DCHECK(MessageLoop::current() == ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
if (frontend_->extension_prefs()->IsExtensionBlacklisted(extension_->id())) {
LOG(INFO) << "This extension: " << extension_->id()
<< " is blacklisted. Install failed.";
@@ -185,15 +185,17 @@ void CrxInstaller::ConfirmInstall() {
AddRef(); // balanced in ContinueInstall() and AbortInstall().
client_->ConfirmInstall(this, extension_.get(), install_icon_.get());
} else {
- file_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &CrxInstaller::CompleteInstall));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(this, &CrxInstaller::CompleteInstall));
}
return;
}
void CrxInstaller::ContinueInstall() {
- file_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &CrxInstaller::CompleteInstall));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(this, &CrxInstaller::CompleteInstall));
Release(); // balanced in ConfirmInstall().
}
@@ -211,7 +213,7 @@ void CrxInstaller::AbortInstall() {
}
void CrxInstaller::CompleteInstall() {
- DCHECK(MessageLoop::current() == file_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
FilePath version_dir;
Extension::InstallType install_type =
@@ -252,13 +254,14 @@ void CrxInstaller::CompleteInstall() {
}
void CrxInstaller::ReportFailureFromFileThread(const std::string& error) {
- DCHECK(MessageLoop::current() == file_loop_);
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &CrxInstaller::ReportFailureFromUIThread, error));
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &CrxInstaller::ReportFailureFromUIThread, error));
}
void CrxInstaller::ReportFailureFromUIThread(const std::string& error) {
- DCHECK(MessageLoop::current() == ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
NotificationService* service = NotificationService::current();
service->Notify(NotificationType::EXTENSION_INSTALL_ERROR,
@@ -277,13 +280,14 @@ void CrxInstaller::ReportFailureFromUIThread(const std::string& error) {
}
void CrxInstaller::ReportOverinstallFromFileThread() {
- DCHECK(MessageLoop::current() == file_loop_);
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &CrxInstaller::ReportOverinstallFromUIThread));
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &CrxInstaller::ReportOverinstallFromUIThread));
}
void CrxInstaller::ReportOverinstallFromUIThread() {
- DCHECK(MessageLoop::current() == ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
NotificationService* service = NotificationService::current();
service->Notify(NotificationType::EXTENSION_OVERINSTALL_ERROR,
@@ -297,13 +301,14 @@ void CrxInstaller::ReportOverinstallFromUIThread() {
}
void CrxInstaller::ReportSuccessFromFileThread() {
- DCHECK(MessageLoop::current() == file_loop_);
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &CrxInstaller::ReportSuccessFromUIThread));
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &CrxInstaller::ReportSuccessFromUIThread));
}
void CrxInstaller::ReportSuccessFromUIThread() {
- DCHECK(MessageLoop::current() == ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
// If there is a client, tell the client about installation.
if (client_.get())
diff --git a/chrome/browser/extensions/crx_installer.h b/chrome/browser/extensions/crx_installer.h
index 23f5cda..a0e50ef 100644
--- a/chrome/browser/extensions/crx_installer.h
+++ b/chrome/browser/extensions/crx_installer.h
@@ -8,7 +8,6 @@
#include <string>
#include "base/file_path.h"
-#include "base/message_loop.h"
#include "base/ref_counted.h"
#include "base/task.h"
#include "chrome/browser/extensions/extension_install_ui.h"
@@ -48,7 +47,6 @@ class CrxInstaller :
// should be after unpacking, it can be specified here as a
// sanity check.
// delete_crx: Whether the crx should be deleted on completion.
- // file_loop: The message loop to do file IO on.
// frontend: The ExtensionsService to report the successfully installed
// extension to.
// client: Optional. If specified, will be used to confirm installation and
@@ -60,7 +58,6 @@ class CrxInstaller :
const std::string& expected_id,
bool delete_crx,
bool allow_privilege_increase,
- MessageLoop* file_loop,
ExtensionsService* frontend,
ExtensionInstallUI* client);
@@ -80,7 +77,6 @@ class CrxInstaller :
const std::string& expected_id,
bool delete_crx,
bool allow_privilege_increase,
- MessageLoop* file_loop,
ExtensionsService* frontend,
ExtensionInstallUI* client);
~CrxInstaller();
@@ -134,12 +130,6 @@ class CrxInstaller :
// previously installed version of the extension.
bool allow_privilege_increase_;
- // The message loop to use for file IO.
- MessageLoop* file_loop_;
-
- // The message loop the UI is running on.
- MessageLoop* ui_loop_;
-
// The extension we're installing. We own this and either pass it off to
// ExtensionsService on success, or delete it on failure.
scoped_ptr<Extension> extension_;
diff --git a/chrome/browser/extensions/extension_disabled_infobar_delegate.cc b/chrome/browser/extensions/extension_disabled_infobar_delegate.cc
index 64a1534..ea8de22 100644
--- a/chrome/browser/extensions/extension_disabled_infobar_delegate.cc
+++ b/chrome/browser/extensions/extension_disabled_infobar_delegate.cc
@@ -25,8 +25,7 @@ class ExtensionDisabledDialogDelegate
ExtensionDisabledDialogDelegate(Profile* profile,
ExtensionsService* service,
Extension* extension)
- : profile_(profile), service_(service), extension_(extension),
- ui_loop_(MessageLoop::current()) {
+ : profile_(profile), service_(service), extension_(extension) {
AddRef(); // balanced in ContinueInstall or AbortInstall.
// Do this now because we can't touch extension on the file loop.
@@ -57,13 +56,14 @@ class ExtensionDisabledDialogDelegate
FilePath install_icon_path = install_icon_resource_.GetFilePath();
CrxInstaller::DecodeInstallIcon(install_icon_path, &install_icon_);
// Then we display the UI on the UI thread.
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &ExtensionDisabledDialogDelegate::ConfirmInstall));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &ExtensionDisabledDialogDelegate::ConfirmInstall));
}
void ConfirmInstall() {
- DCHECK(MessageLoop::current() == ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
ExtensionInstallUI ui(profile_);
ui.ConfirmInstall(this, extension_, install_icon_.get());
}
@@ -73,7 +73,6 @@ class ExtensionDisabledDialogDelegate
Extension* extension_;
ExtensionResource install_icon_resource_;
scoped_ptr<SkBitmap> install_icon_;
- MessageLoop* ui_loop_;
};
class ExtensionDisabledInfobarDelegate
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc
index cd011f1..92c77a8 100644
--- a/chrome/browser/extensions/extension_message_service.cc
+++ b/chrome/browser/extensions/extension_message_service.cc
@@ -112,12 +112,9 @@ const char ExtensionMessageService::kDispatchEvent[] =
"Event.dispatchJSON";
ExtensionMessageService::ExtensionMessageService(Profile* profile)
- : ui_loop_(MessageLoop::current()),
- profile_(profile),
+ : profile_(profile),
extension_devtools_manager_(NULL),
next_port_id_(0) {
- DCHECK_EQ(ui_loop_->type(), MessageLoop::TYPE_UI);
-
registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED,
NotificationService::AllSources());
registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
@@ -132,8 +129,6 @@ ExtensionMessageService::~ExtensionMessageService() {
}
void ExtensionMessageService::ProfileDestroyed() {
- DCHECK_EQ(ui_loop_->type(), MessageLoop::TYPE_UI);
-
profile_ = NULL;
// We remove notifications here because our destructor might be called on
@@ -207,9 +202,10 @@ int ExtensionMessageService::OpenChannelToExtension(
// Each side of the port is given his own port ID. When they send messages,
// we convert to the opposite port ID. See PostMessageFromRenderer.
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &ExtensionMessageService::OpenChannelToExtensionOnUIThread,
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &ExtensionMessageService::OpenChannelToExtensionOnUIThread,
source->id(), routing_id, port2_id, source_extension_id,
target_extension_id, channel_name));
@@ -230,9 +226,10 @@ int ExtensionMessageService::OpenChannelToTab(int routing_id,
// Each side of the port is given his own port ID. When they send messages,
// we convert to the opposite port ID. See PostMessageFromRenderer.
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &ExtensionMessageService::OpenChannelToTabOnUIThread,
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &ExtensionMessageService::OpenChannelToTabOnUIThread,
source->id(), routing_id, port2_id, tab_id, extension_id,
channel_name));
diff --git a/chrome/browser/extensions/extension_message_service.h b/chrome/browser/extensions/extension_message_service.h
index eb66bb6..0164cd2 100644
--- a/chrome/browser/extensions/extension_message_service.h
+++ b/chrome/browser/extensions/extension_message_service.h
@@ -139,9 +139,6 @@ class ExtensionMessageService
void CloseChannelImpl(MessageChannelMap::iterator channel_iter, int port_id,
bool notify_other_port);
- // The UI message loop, used for posting tasks.
- MessageLoop* ui_loop_;
-
// --- UI thread only:
// Handles channel creation and notifies the destinations that a channel was
diff --git a/chrome/browser/extensions/extension_updater.cc b/chrome/browser/extensions/extension_updater.cc
index d5db3e6..a546b23 100644
--- a/chrome/browser/extensions/extension_updater.cc
+++ b/chrome/browser/extensions/extension_updater.cc
@@ -60,15 +60,11 @@ static const int kMaxUpdateFrequencySeconds = 60 * 60 * 24 * 7; // 7 days
class ExtensionUpdaterFileHandler
: public base::RefCountedThreadSafe<ExtensionUpdaterFileHandler> {
public:
- ExtensionUpdaterFileHandler(MessageLoop* updater_loop,
- MessageLoop* file_io_loop)
- : updater_loop_(updater_loop), file_io_loop_(file_io_loop) {}
-
// Writes crx file data into a tempfile, and calls back the updater.
void WriteTempFile(const std::string& extension_id, const std::string& data,
scoped_refptr<ExtensionUpdater> updater) {
// Make sure we're running in the right thread.
- DCHECK(MessageLoop::current() == file_io_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
FilePath path;
if (!file_util::CreateTemporaryFile(&path)) {
@@ -86,47 +82,32 @@ class ExtensionUpdaterFileHandler
// The ExtensionUpdater is now responsible for cleaning up the temp file
// from disk.
- updater_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- updater.get(), &ExtensionUpdater::OnCRXFileWritten, extension_id,
- path));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ updater.get(), &ExtensionUpdater::OnCRXFileWritten, extension_id,
+ path));
}
void DeleteFile(const FilePath& path) {
- DCHECK(MessageLoop::current() == file_io_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
if (!file_util::Delete(path, false)) {
LOG(WARNING) << "Failed to delete temp file " << path.value();
}
}
-
- private:
- // The MessageLoop we use to call back the ExtensionUpdater.
- MessageLoop* updater_loop_;
-
- // The MessageLoop we should be operating on for file operations.
- MessageLoop* file_io_loop_;
};
ExtensionUpdater::ExtensionUpdater(ExtensionUpdateService* service,
PrefService* prefs,
- int frequency_seconds,
- MessageLoop* file_io_loop,
- MessageLoop* io_loop)
+ int frequency_seconds)
: service_(service), frequency_seconds_(frequency_seconds),
- file_io_loop_(file_io_loop), io_loop_(io_loop), prefs_(prefs),
- file_handler_(new ExtensionUpdaterFileHandler(MessageLoop::current(),
- file_io_loop_)),
+ prefs_(prefs), file_handler_(new ExtensionUpdaterFileHandler()),
blacklist_checks_enabled_(true) {
Init();
}
void ExtensionUpdater::Init() {
- // Unless we're in a unit test, expect that the file_io_loop_ is on the
- // browser file thread.
- if (g_browser_process->file_thread() != NULL) {
- DCHECK(file_io_loop_ == g_browser_process->file_thread()->message_loop());
- }
-
DCHECK_GE(frequency_seconds_, 5);
DCHECK(frequency_seconds_ <= kMaxUpdateFrequencySeconds);
#ifdef NDEBUG
@@ -225,10 +206,8 @@ void ExtensionUpdater::OnURLFetchComplete(
// Utility class to handle doing xml parsing in a sandboxed utility process.
class SafeManifestParser : public UtilityProcessHost::Client {
public:
- SafeManifestParser(const std::string& xml, ExtensionUpdater* updater,
- MessageLoop* updater_loop, MessageLoop* io_loop)
- : xml_(xml), updater_loop_(updater_loop), io_loop_(io_loop),
- updater_(updater) {
+ SafeManifestParser(const std::string& xml, ExtensionUpdater* updater)
+ : xml_(xml), updater_(updater) {
}
~SafeManifestParser() {}
@@ -236,15 +215,17 @@ class SafeManifestParser : public UtilityProcessHost::Client {
// Posts a task over to the IO loop to start the parsing of xml_ in a
// utility process.
void Start() {
- DCHECK(MessageLoop::current() == updater_loop_);
- io_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &SafeManifestParser::ParseInSandbox,
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ this, &SafeManifestParser::ParseInSandbox,
g_browser_process->resource_dispatcher_host()));
}
// Creates the sandboxed utility process and tells it to start parsing.
void ParseInSandbox(ResourceDispatcherHost* rdh) {
- DCHECK(MessageLoop::current() == io_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
// TODO(asargent) we shouldn't need to do this branch here - instead
// UtilityProcessHost should handle it for us. (http://crbug.com/19192)
@@ -259,18 +240,22 @@ class SafeManifestParser : public UtilityProcessHost::Client {
if (use_utility_process) {
UtilityProcessHost* host = new UtilityProcessHost(
- rdh, this, updater_loop_);
+ rdh, this, ChromeThread::UI);
host->StartUpdateManifestParse(xml_);
} else {
UpdateManifest manifest;
if (manifest.Parse(xml_)) {
- updater_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &SafeManifestParser::OnParseUpdateManifestSucceeded,
- manifest.results()));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &SafeManifestParser::OnParseUpdateManifestSucceeded,
+ manifest.results()));
} else {
- updater_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &SafeManifestParser::OnParseUpdateManifestFailed,
- manifest.errors()));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &SafeManifestParser::OnParseUpdateManifestFailed,
+ manifest.errors()));
}
}
}
@@ -278,25 +263,19 @@ class SafeManifestParser : public UtilityProcessHost::Client {
// Callback from the utility process when parsing succeeded.
virtual void OnParseUpdateManifestSucceeded(
const UpdateManifest::ResultList& list) {
- DCHECK(MessageLoop::current() == updater_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
updater_->HandleManifestResults(list);
}
// Callback from the utility process when parsing failed.
virtual void OnParseUpdateManifestFailed(const std::string& error_message) {
- DCHECK(MessageLoop::current() == updater_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
LOG(WARNING) << "Error parsing update manifest:\n" << error_message;
}
private:
const std::string& xml_;
- // The MessageLoop we use to call back the ExtensionUpdater.
- MessageLoop* updater_loop_;
-
- // The MessageLoop where we create the utility process.
- MessageLoop* io_loop_;
-
scoped_refptr<ExtensionUpdater> updater_;
};
@@ -308,8 +287,8 @@ void ExtensionUpdater::OnManifestFetchComplete(const GURL& url,
// We want to try parsing the manifest, and if it indicates updates are
// available, we want to fire off requests to fetch those updates.
if (status.status() == URLRequestStatus::SUCCESS && response_code == 200) {
- scoped_refptr<SafeManifestParser> safe_parser =
- new SafeManifestParser(data, this, MessageLoop::current(), io_loop_);
+ scoped_refptr<SafeManifestParser> safe_parser =
+ new SafeManifestParser(data, this);
safe_parser->Start();
} else {
// TODO(asargent) Do exponential backoff here. (http://crbug.com/12546).
@@ -375,9 +354,11 @@ void ExtensionUpdater::OnCRXFetchComplete(const GURL& url,
} else {
// Successfully fetched - now write crx to a file so we can have the
// ExtensionsService install it.
- file_io_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- file_handler_.get(), &ExtensionUpdaterFileHandler::WriteTempFile,
- current_extension_fetch_.id, data, this));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ file_handler_.get(), &ExtensionUpdaterFileHandler::WriteTempFile,
+ current_extension_fetch_.id, data, this));
}
} else {
// TODO(asargent) do things like exponential backoff, handling
@@ -405,8 +386,10 @@ void ExtensionUpdater::OnCRXFileWritten(const std::string& id,
void ExtensionUpdater::OnExtensionInstallFinished(const FilePath& path,
Extension* extension) {
// Have the file_handler_ delete the temp file on the file I/O thread.
- file_io_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- file_handler_.get(), &ExtensionUpdaterFileHandler::DeleteFile, path));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ file_handler_.get(), &ExtensionUpdaterFileHandler::DeleteFile, path));
}
diff --git a/chrome/browser/extensions/extension_updater.h b/chrome/browser/extensions/extension_updater.h
index 252bfeb..ed6ab2c 100644
--- a/chrome/browser/extensions/extension_updater.h
+++ b/chrome/browser/extensions/extension_updater.h
@@ -22,7 +22,6 @@
class Extension;
class ExtensionUpdaterTest;
-class MessageLoop;
class ExtensionUpdaterFileHandler;
class PrefService;
@@ -30,9 +29,7 @@ class PrefService;
//
// ExtensionUpdater* updater = new ExtensionUpdater(my_extensions_service,
// pref_service,
-// update_frequency_secs,
-// file_io_loop,
-// io_loop);
+// update_frequency_secs);
// updater.Start();
// ....
// updater.Stop();
@@ -45,9 +42,7 @@ class ExtensionUpdater
// controls how often update checks are scheduled.
ExtensionUpdater(ExtensionUpdateService* service,
PrefService* prefs,
- int frequency_seconds,
- MessageLoop* file_io_loop,
- MessageLoop* io_loop);
+ int frequency_seconds);
virtual ~ExtensionUpdater();
@@ -178,12 +173,6 @@ class ExtensionUpdater
base::OneShotTimer<ExtensionUpdater> timer_;
int frequency_seconds_;
- // The MessageLoop where we should do file I/O.
- MessageLoop* file_io_loop_;
-
- // The IO loop for IPC.
- MessageLoop* io_loop_;
-
PrefService* prefs_;
scoped_refptr<ExtensionUpdaterFileHandler> file_handler_;
diff --git a/chrome/browser/extensions/extension_updater_unittest.cc b/chrome/browser/extensions/extension_updater_unittest.cc
index a74bfbd..bcb9287 100644
--- a/chrome/browser/extensions/extension_updater_unittest.cc
+++ b/chrome/browser/extensions/extension_updater_unittest.cc
@@ -252,7 +252,7 @@ class ExtensionUpdaterTest : public testing::Test {
URLFetcher::set_factory(&factory);
ScopedTempPrefService prefs;
scoped_refptr<ExtensionUpdater> updater =
- new ExtensionUpdater(&service, prefs.get(), 60*60*24, NULL, NULL);
+ new ExtensionUpdater(&service, prefs.get(), 60*60*24);
updater->Start();
// Tell the update that it's time to do update checks.
@@ -298,7 +298,7 @@ class ExtensionUpdaterTest : public testing::Test {
URLFetcher::set_factory(&factory);
ScopedTempPrefService prefs;
scoped_refptr<ExtensionUpdater> updater =
- new ExtensionUpdater(&service, prefs.get(), 60*60*24, NULL, NULL);
+ new ExtensionUpdater(&service, prefs.get(), 60*60*24);
updater->Start();
// Tell the updater that it's time to do update checks.
@@ -341,8 +341,7 @@ class ExtensionUpdaterTest : public testing::Test {
MessageLoop message_loop;
ScopedTempPrefService prefs;
scoped_refptr<ExtensionUpdater> updater =
- new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs,
- NULL, NULL);
+ new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs);
// Check passing an empty list of parse results to DetermineUpdates
std::vector<UpdateManifest::Result> updates;
@@ -366,6 +365,7 @@ class ExtensionUpdaterTest : public testing::Test {
static void TestMultipleManifestDownloading() {
MessageLoop ui_loop;
+ ChromeThread ui_thread(ChromeThread::UI, &ui_loop);
ChromeThread file_thread(ChromeThread::FILE);
file_thread.Start();
ChromeThread io_thread(ChromeThread::IO);
@@ -377,9 +377,7 @@ class ExtensionUpdaterTest : public testing::Test {
ServiceForDownloadTests service;
ScopedTempPrefService prefs;
scoped_refptr<ExtensionUpdater> updater =
- new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs,
- file_thread.message_loop(),
- io_thread.message_loop());
+ new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs);
GURL url1("http://localhost/manifest1");
GURL url2("http://localhost/manifest2");
@@ -427,6 +425,7 @@ class ExtensionUpdaterTest : public testing::Test {
static void TestSingleExtensionDownloading() {
MessageLoop ui_loop;
+ ChromeThread ui_thread(ChromeThread::UI, &ui_loop);
ChromeThread file_thread(ChromeThread::FILE);
file_thread.Start();
ChromeThread io_thread(ChromeThread::IO);
@@ -438,8 +437,7 @@ class ExtensionUpdaterTest : public testing::Test {
ServiceForDownloadTests service;
ScopedTempPrefService prefs;
scoped_refptr<ExtensionUpdater> updater =
- new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs,
- file_thread.message_loop(), NULL);
+ new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs);
GURL test_url("http://localhost/extension.crx");
@@ -476,6 +474,7 @@ class ExtensionUpdaterTest : public testing::Test {
static void TestBlacklistDownloading() {
MessageLoop message_loop;
+ ChromeThread ui_thread(ChromeThread::UI, &message_loop);
ChromeThread io_thread(ChromeThread::IO);
io_thread.Start();
@@ -485,8 +484,7 @@ class ExtensionUpdaterTest : public testing::Test {
ServiceForBlacklistTests service;
ScopedTempPrefService prefs;
scoped_refptr<ExtensionUpdater> updater =
- new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs,
- NULL, NULL);
+ new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs);
prefs.get()->
RegisterStringPref(prefs::kExtensionBlacklistUpdateVersion, L"0");
GURL test_url("http://localhost/extension.crx");
@@ -523,6 +521,8 @@ class ExtensionUpdaterTest : public testing::Test {
static void TestMultipleExtensionDownloading() {
MessageLoopForUI message_loop;
+ ChromeThread ui_thread(ChromeThread::UI, &message_loop);
+ ChromeThread file_thread(ChromeThread::FILE, &message_loop);
ChromeThread io_thread(ChromeThread::IO);
io_thread.Start();
@@ -532,8 +532,7 @@ class ExtensionUpdaterTest : public testing::Test {
ServiceForDownloadTests service;
ScopedTempPrefService prefs;
scoped_refptr<ExtensionUpdater> updater =
- new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs,
- &message_loop, NULL);
+ new ExtensionUpdater(&service, prefs.get(), kUpdateFrequencySecs);
GURL url1("http://localhost/extension1.crx");
GURL url2("http://localhost/extension2.crx");
diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc
index 0234ec5..9ff30a3 100644
--- a/chrome/browser/extensions/extensions_service.cc
+++ b/chrome/browser/extensions/extensions_service.cc
@@ -82,12 +82,9 @@ ExtensionsService::ExtensionsService(Profile* profile,
const CommandLine* command_line,
PrefService* prefs,
const FilePath& install_directory,
- MessageLoop* frontend_loop,
- MessageLoop* backend_loop,
bool autoupdate_enabled)
: profile_(profile),
extension_prefs_(new ExtensionPrefs(prefs, install_directory)),
- backend_loop_(backend_loop),
install_directory_(install_directory),
extensions_enabled_(true),
show_extensions_prompts_(true),
@@ -106,11 +103,10 @@ ExtensionsService::ExtensionsService(Profile* profile,
update_frequency = StringToInt(WideToASCII(command_line->GetSwitchValue(
switches::kExtensionsUpdateFrequency)));
}
- updater_ = new ExtensionUpdater(this, prefs, update_frequency,
- backend_loop_, g_browser_process->io_thread()->message_loop());
+ updater_ = new ExtensionUpdater(this, prefs, update_frequency);
}
- backend_ = new ExtensionsServiceBackend(install_directory_, frontend_loop);
+ backend_ = new ExtensionsServiceBackend(install_directory_);
}
ExtensionsService::~ExtensionsService() {
@@ -143,7 +139,6 @@ void ExtensionsService::InstallExtension(const FilePath& extension_path) {
"", // no expected id
false, // don't delete crx when complete
true, // allow privilege increase
- backend_loop_,
this,
NULL); // no client (silent install)
}
@@ -160,7 +155,6 @@ void ExtensionsService::UpdateExtension(const std::string& id,
id,
true, // delete crx when complete
false, // do not allow upgrade of privileges
- backend_loop_,
this,
NULL); // no client (silent install)
}
@@ -196,9 +190,11 @@ void ExtensionsService::UninstallExtension(const std::string& extension_id,
// Tell the backend to start deleting installed extensions on the file thread.
if (Extension::LOAD != extension->location()) {
- backend_loop_->PostTask(FROM_HERE, NewRunnableFunction(
- &extension_file_util::UninstallExtension, extension_id,
- install_directory_));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableFunction(
+ &extension_file_util::UninstallExtension, extension_id,
+ install_directory_));
}
ExtensionDOMUI::UnregisterChromeURLOverrides(profile_,
@@ -256,9 +252,12 @@ void ExtensionsService::DisableExtension(const std::string& extension_id) {
}
void ExtensionsService::LoadExtension(const FilePath& extension_path) {
- backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
- &ExtensionsServiceBackend::LoadSingleExtension,
- extension_path, scoped_refptr<ExtensionsService>(this)));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ backend_.get(),
+ &ExtensionsServiceBackend::LoadSingleExtension,
+ extension_path, scoped_refptr<ExtensionsService>(this)));
}
void ExtensionsService::LoadAllExtensions() {
@@ -297,9 +296,12 @@ void ExtensionsService::LoadInstalledExtension(
if (location == Extension::EXTERNAL_PREF ||
location == Extension::EXTERNAL_REGISTRY) {
- backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
- &ExtensionsServiceBackend::CheckExternalUninstall,
- scoped_refptr<ExtensionsService>(this), id, location));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ backend_.get(),
+ &ExtensionsServiceBackend::CheckExternalUninstall,
+ scoped_refptr<ExtensionsService>(this), id, location));
}
}
@@ -315,11 +317,13 @@ void ExtensionsService::NotifyExtensionLoaded(Extension* extension) {
static_cast<ChromeURLRequestContextGetter*>(
profile_->GetRequestContext());
if (context_getter) {
- g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
- NewRunnableMethod(context_getter,
- &ChromeURLRequestContextGetter::OnNewExtensions,
- extension->id(),
- extension->path()));
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ context_getter,
+ &ChromeURLRequestContextGetter::OnNewExtensions,
+ extension->id(),
+ extension->path()));
}
}
@@ -342,7 +346,8 @@ void ExtensionsService::NotifyExtensionUnloaded(Extension* extension) {
static_cast<ChromeURLRequestContextGetter*>(
profile_->GetRequestContext());
if (context_getter) {
- g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
NewRunnableMethod(
context_getter,
&ChromeURLRequestContextGetter::OnUnloadedExtension,
@@ -384,10 +389,11 @@ void ExtensionsService::CheckForExternalUpdates() {
// later?
std::set<std::string> killed_extensions;
extension_prefs_->GetKilledExtensionIds(&killed_extensions);
- backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
- &ExtensionsServiceBackend::CheckForExternalUpdates,
- killed_extensions,
- scoped_refptr<ExtensionsService>(this)));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ backend_.get(), &ExtensionsServiceBackend::CheckForExternalUpdates,
+ killed_extensions, scoped_refptr<ExtensionsService>(this)));
}
void ExtensionsService::UnloadExtension(const std::string& extension_id) {
@@ -439,9 +445,11 @@ void ExtensionsService::ReloadExtensions() {
void ExtensionsService::GarbageCollectExtensions() {
InstalledExtensionSet installed(
new InstalledExtensions(extension_prefs_.get()));
- backend_loop_->PostTask(FROM_HERE, NewRunnableFunction(
- &extension_file_util::GarbageCollectExtensions, install_directory_,
- installed.extensions()));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableFunction(
+ &extension_file_util::GarbageCollectExtensions, install_directory_,
+ installed.extensions()));
}
void ExtensionsService::OnLoadedInstalledExtensions() {
@@ -601,15 +609,19 @@ Extension* ExtensionsService::GetExtensionByURL(const GURL& url) {
}
void ExtensionsService::ClearProvidersForTesting() {
- backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
- &ExtensionsServiceBackend::ClearProvidersForTesting));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ backend_.get(), &ExtensionsServiceBackend::ClearProvidersForTesting));
}
void ExtensionsService::SetProviderForTesting(
Extension::Location location, ExternalExtensionProvider* test_provider) {
- backend_loop_->PostTask(FROM_HERE, NewRunnableMethod(backend_.get(),
- &ExtensionsServiceBackend::SetProviderForTesting,
- location, test_provider));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ backend_.get(), &ExtensionsServiceBackend::SetProviderForTesting,
+ location, test_provider));
}
void ExtensionsService::OnExternalExtensionFound(const std::string& id,
@@ -639,7 +651,6 @@ void ExtensionsService::OnExternalExtensionFound(const std::string& id,
CrxInstaller::Start(path, install_directory_, location, id,
false, // don't delete crx when complete
true, // allow privilege increase
- backend_loop_,
this,
NULL); // no client (silent install)
}
@@ -664,11 +675,10 @@ void ExtensionsService::ReportExtensionLoadError(
// ExtensionsServicesBackend
ExtensionsServiceBackend::ExtensionsServiceBackend(
- const FilePath& install_directory, MessageLoop* frontend_loop)
+ const FilePath& install_directory)
: frontend_(NULL),
install_directory_(install_directory),
- alert_on_error_(false),
- frontend_loop_(frontend_loop) {
+ alert_on_error_(false) {
// TODO(aa): This ends up doing blocking IO on the UI thread because it reads
// pref data in the ctor and that is called on the UI thread. Would be better
// to re-read data each time we list external extensions, anyway.
@@ -715,25 +725,19 @@ void ExtensionsServiceBackend::LoadSingleExtension(
void ExtensionsServiceBackend::ReportExtensionLoadError(
const FilePath& extension_path, const std::string &error) {
- // In the unit tests, frontend_loop_ may be null.
- if (frontend_loop_ == NULL) {
- frontend_->ReportExtensionLoadError(
- extension_path,
- error,
- NotificationType::EXTENSION_INSTALL_ERROR,
- alert_on_error_);
- return;
- }
-
- frontend_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(frontend_,
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ frontend_,
&ExtensionsService::ReportExtensionLoadError, extension_path,
error, NotificationType::EXTENSION_INSTALL_ERROR, alert_on_error_));
}
void ExtensionsServiceBackend::ReportExtensionLoaded(Extension* extension) {
- frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- frontend_, &ExtensionsService::OnExtensionLoaded, extension, true));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ frontend_, &ExtensionsService::OnExtensionLoaded, extension, true));
}
bool ExtensionsServiceBackend::LookupExternalExtension(
@@ -795,9 +799,10 @@ void ExtensionsServiceBackend::CheckExternalUninstall(
return; // Yup, known extension, don't uninstall.
// This is an external extension that we don't have registered. Uninstall.
- frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(
- frontend.get(), &ExtensionsService::UninstallExtension,
- id, true));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ frontend.get(), &ExtensionsService::UninstallExtension, id, true));
}
void ExtensionsServiceBackend::ClearProvidersForTesting() {
@@ -815,7 +820,9 @@ void ExtensionsServiceBackend::SetProviderForTesting(
void ExtensionsServiceBackend::OnExternalExtensionFound(
const std::string& id, const Version* version, const FilePath& path,
Extension::Location location) {
- frontend_loop_->PostTask(FROM_HERE, NewRunnableMethod(frontend_,
- &ExtensionsService::OnExternalExtensionFound, id, version->GetString(),
- path, location));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ frontend_, &ExtensionsService::OnExternalExtensionFound, id,
+ version->GetString(), path, location));
}
diff --git a/chrome/browser/extensions/extensions_service.h b/chrome/browser/extensions/extensions_service.h
index ecd670d..6d525d7 100644
--- a/chrome/browser/extensions/extensions_service.h
+++ b/chrome/browser/extensions/extensions_service.h
@@ -29,7 +29,6 @@ class Extension;
class ExtensionsServiceBackend;
class ExtensionUpdater;
class GURL;
-class MessageLoop;
class PrefService;
class Profile;
class ResourceDispatcherHost;
@@ -81,8 +80,6 @@ class ExtensionsService
const CommandLine* command_line,
PrefService* prefs,
const FilePath& install_directory,
- MessageLoop* frontend_loop,
- MessageLoop* backend_loop,
bool autoupdate_enabled);
virtual ~ExtensionsService();
@@ -247,9 +244,6 @@ class ExtensionsService
// Preferences for the owning profile.
scoped_ptr<ExtensionPrefs> extension_prefs_;
- // The message loop to use with the backend.
- MessageLoop* backend_loop_;
-
// The current list of installed extensions.
ExtensionList extensions_;
@@ -286,8 +280,7 @@ class ExtensionsServiceBackend
// |rdh| can be NULL in the case of test environment.
// |extension_prefs| contains a dictionary value that points to the extension
// preferences.
- ExtensionsServiceBackend(const FilePath& install_directory,
- MessageLoop* frontend_loop);
+ ExtensionsServiceBackend(const FilePath& install_directory);
virtual ~ExtensionsServiceBackend();
@@ -366,9 +359,6 @@ class ExtensionsServiceBackend
// Whether errors result in noisy alerts.
bool alert_on_error_;
- // The message loop to use to call the frontend.
- MessageLoop* frontend_loop_;
-
// A map of all external extension providers.
typedef std::map<Extension::Location,
linked_ptr<ExternalExtensionProvider> > ProviderMap;
diff --git a/chrome/browser/extensions/extensions_service_unittest.cc b/chrome/browser/extensions/extensions_service_unittest.cc
index 8cd1af2..f31a298 100644
--- a/chrome/browser/extensions/extensions_service_unittest.cc
+++ b/chrome/browser/extensions/extensions_service_unittest.cc
@@ -194,7 +194,10 @@ class MockProviderVisitor : public ExternalExtensionProvider::Visitor {
class ExtensionsServiceTest
: public testing::Test, public NotificationObserver {
public:
- ExtensionsServiceTest() : installed_(NULL) {
+ ExtensionsServiceTest()
+ : ui_thread_(ChromeThread::UI, &loop_),
+ file_thread_(ChromeThread::FILE, &loop_),
+ installed_(NULL) {
registrar_.Add(this, NotificationType::EXTENSION_LOADED,
NotificationService::AllSources());
registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
@@ -213,8 +216,6 @@ class ExtensionsServiceTest
CommandLine::ForCurrentProcess(),
prefs_.get(),
extensions_install_dir,
- &loop_,
- &loop_,
false);
service_->set_extensions_enabled(true);
service_->set_show_extensions_prompts(false);
@@ -468,6 +469,8 @@ class ExtensionsServiceTest
scoped_refptr<ExtensionsService> service_;
size_t total_successes_;
MessageLoop loop_;
+ ChromeThread ui_thread_;
+ ChromeThread file_thread_;
ExtensionList loaded_;
std::string unloaded_id_;
Extension* installed_;
@@ -1527,6 +1530,8 @@ TEST(ExtensionsServiceTestSimple, Enabledness) {
ExtensionsReadyRecorder recorder;
TestingProfile profile;
MessageLoop loop;
+ ChromeThread ui_thread(ChromeThread::UI, &loop);
+ ChromeThread file_thread(ChromeThread::FILE, &loop);
scoped_ptr<CommandLine> command_line;
scoped_refptr<ExtensionsService> service;
FilePath install_dir = profile.GetPath()
@@ -1535,7 +1540,7 @@ TEST(ExtensionsServiceTestSimple, Enabledness) {
// By default, we are enabled.
command_line.reset(new CommandLine(CommandLine::ARGUMENTS_ONLY));
service = new ExtensionsService(&profile, command_line.get(),
- profile.GetPrefs(), install_dir, &loop, &loop, false);
+ profile.GetPrefs(), install_dir, false);
EXPECT_TRUE(service->extensions_enabled());
service->Init();
loop.RunAllPending();
@@ -1545,7 +1550,7 @@ TEST(ExtensionsServiceTestSimple, Enabledness) {
recorder.set_ready(false);
command_line->AppendSwitch(switches::kDisableExtensions);
service = new ExtensionsService(&profile, command_line.get(),
- profile.GetPrefs(), install_dir, &loop, &loop, false);
+ profile.GetPrefs(), install_dir, false);
EXPECT_FALSE(service->extensions_enabled());
service->Init();
loop.RunAllPending();
@@ -1554,7 +1559,7 @@ TEST(ExtensionsServiceTestSimple, Enabledness) {
recorder.set_ready(false);
profile.GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
service = new ExtensionsService(&profile, command_line.get(),
- profile.GetPrefs(), install_dir, &loop, &loop, false);
+ profile.GetPrefs(), install_dir, false);
EXPECT_FALSE(service->extensions_enabled());
service->Init();
loop.RunAllPending();
@@ -1563,7 +1568,7 @@ TEST(ExtensionsServiceTestSimple, Enabledness) {
recorder.set_ready(false);
command_line.reset(new CommandLine(CommandLine::ARGUMENTS_ONLY));
service = new ExtensionsService(&profile, command_line.get(),
- profile.GetPrefs(), install_dir, &loop, &loop, false);
+ profile.GetPrefs(), install_dir, false);
EXPECT_FALSE(service->extensions_enabled());
service->Init();
loop.RunAllPending();
diff --git a/chrome/browser/extensions/extensions_ui.cc b/chrome/browser/extensions/extensions_ui.cc
index ea036a7..7ca742e 100644
--- a/chrome/browser/extensions/extensions_ui.cc
+++ b/chrome/browser/extensions/extensions_ui.cc
@@ -555,9 +555,11 @@ ExtensionsUI::ExtensionsUI(TabContents* contents) : DOMUI(contents) {
ExtensionsUIHTMLSource* html_source = new ExtensionsUIHTMLSource();
// Set up the chrome://extensions/ source.
- g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
- NewRunnableMethod(&chrome_url_data_manager,
- &ChromeURLDataManager::AddDataSource, html_source));
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ &chrome_url_data_manager, &ChromeURLDataManager::AddDataSource,
+ html_source));
}
// static
diff --git a/chrome/browser/extensions/image_loading_tracker.cc b/chrome/browser/extensions/image_loading_tracker.cc
index 10bbea3..8f2541c 100644
--- a/chrome/browser/extensions/image_loading_tracker.cc
+++ b/chrome/browser/extensions/image_loading_tracker.cc
@@ -11,7 +11,7 @@
#include "base/scoped_ptr.h"
#include "base/task.h"
#include "base/thread.h"
-#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_thread.h"
#include "chrome/common/extensions/extension_resource.h"
#include "skia/ext/image_operations.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -22,7 +22,7 @@
// The LoadImageTask is for asynchronously loading the image on the file thread.
// If the image is successfully loaded and decoded it will report back on the
-// |callback_loop| to let the caller know the image is done loading.
+// calling thread to let the caller know the image is done loading.
class ImageLoadingTracker::LoadImageTask : public Task {
public:
// Constructor for the LoadImageTask class. |tracker| is the object that
@@ -35,17 +35,18 @@ class ImageLoadingTracker::LoadImageTask : public Task {
const ExtensionResource& resource,
const gfx::Size& max_size,
size_t index)
- : callback_loop_(MessageLoop::current()),
- tracker_(tracker),
+ : tracker_(tracker),
resource_(resource),
max_size_(max_size),
- index_(index) {}
+ index_(index) {
+ CHECK(ChromeThread::GetCurrentThreadIdentifier(&callback_thread_id_));
+ }
void ReportBack(SkBitmap* image) {
- callback_loop_->PostTask(FROM_HERE, NewRunnableMethod(tracker_,
- &ImageLoadingTracker::OnImageLoaded,
- image,
- index_));
+ ChromeThread::PostTask(
+ callback_thread_id_, FROM_HERE,
+ NewRunnableMethod(
+ tracker_, &ImageLoadingTracker::OnImageLoaded, image, index_));
}
virtual void Run() {
@@ -80,8 +81,8 @@ class ImageLoadingTracker::LoadImageTask : public Task {
}
private:
- // The message loop that we need to call back on to report that we are done.
- MessageLoop* callback_loop_;
+ // The thread that we need to call back on to report that we are done.
+ ChromeThread::ID callback_thread_id_;
// The object that is waiting for us to respond back.
ImageLoadingTracker* tracker_;
@@ -101,9 +102,9 @@ class ImageLoadingTracker::LoadImageTask : public Task {
void ImageLoadingTracker::PostLoadImageTask(const ExtensionResource& resource,
const gfx::Size& max_size) {
- MessageLoop* file_loop = g_browser_process->file_thread()->message_loop();
- file_loop->PostTask(FROM_HERE, new LoadImageTask(this, resource, max_size,
- posted_count_++));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ new LoadImageTask(this, resource, max_size, posted_count_++));
}
void ImageLoadingTracker::OnImageLoaded(SkBitmap* image, size_t index) {
diff --git a/chrome/browser/extensions/pack_extension_job.cc b/chrome/browser/extensions/pack_extension_job.cc
index 497f1d1..9d370a1 100644
--- a/chrome/browser/extensions/pack_extension_job.cc
+++ b/chrome/browser/extensions/pack_extension_job.cc
@@ -7,14 +7,13 @@
#include "base/message_loop.h"
#include "base/string_util.h"
#include "base/task.h"
-#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/extensions/extension_creator.h"
PackExtensionJob::PackExtensionJob(Client* client,
const FilePath& root_directory,
const FilePath& key_file)
- : ui_loop_(MessageLoop::current()), client_(client),
- root_directory_(root_directory), key_file_(key_file) {
+ : client_(client), root_directory_(root_directory), key_file_(key_file) {
+ CHECK(ChromeThread::GetCurrentThreadIdentifier(&client_thread_id_));
ChromeThread::PostTask(
ChromeThread::FILE, FROM_HERE,
NewRunnableMethod(this, &PackExtensionJob::RunOnFileThread));
@@ -34,11 +33,15 @@ void PackExtensionJob::RunOnFileThread() {
// returns. See bug 20734.
ExtensionCreator creator;
if (creator.Run(root_directory_, crx_file_out_, key_file_, key_file_out_)) {
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &PackExtensionJob::ReportSuccessOnUIThread));
+ ChromeThread::PostTask(
+ client_thread_id_, FROM_HERE,
+ NewRunnableMethod(this, &PackExtensionJob::ReportSuccessOnUIThread));
} else {
- ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &PackExtensionJob::ReportFailureOnUIThread, creator.error_message()));
+ ChromeThread::PostTask(
+ client_thread_id_, FROM_HERE,
+ NewRunnableMethod(
+ this, &PackExtensionJob::ReportFailureOnUIThread,
+ creator.error_message()));
}
}
diff --git a/chrome/browser/extensions/pack_extension_job.h b/chrome/browser/extensions/pack_extension_job.h
index b82e9d0..8a40692 100644
--- a/chrome/browser/extensions/pack_extension_job.h
+++ b/chrome/browser/extensions/pack_extension_job.h
@@ -9,8 +9,8 @@
#include "base/file_path.h"
#include "base/ref_counted.h"
+#include "chrome/browser/chrome_thread.h"
-class MessageLoop;
// Manages packing an extension on the file thread and reporting the result
// back to the UI.
@@ -38,7 +38,7 @@ class PackExtensionJob : public base::RefCountedThreadSafe<PackExtensionJob> {
void ReportSuccessOnUIThread();
void ReportFailureOnUIThread(const std::string& error);
- MessageLoop* ui_loop_;
+ ChromeThread::ID client_thread_id_;
Client* client_;
FilePath root_directory_;
FilePath key_file_;
diff --git a/chrome/browser/extensions/sandboxed_extension_unpacker.cc b/chrome/browser/extensions/sandboxed_extension_unpacker.cc
index d3d9f61..160a0de 100644
--- a/chrome/browser/extensions/sandboxed_extension_unpacker.cc
+++ b/chrome/browser/extensions/sandboxed_extension_unpacker.cc
@@ -29,14 +29,14 @@ const char SandboxedExtensionUnpacker::kExtensionHeaderMagic[] = "Cr24";
SandboxedExtensionUnpacker::SandboxedExtensionUnpacker(
const FilePath& crx_path, ResourceDispatcherHost* rdh,
SandboxedExtensionUnpackerClient* client)
- : crx_path_(crx_path), file_loop_(NULL), rdh_(rdh), client_(client),
- got_response_(false) {
+ : crx_path_(crx_path), thread_identifier_(ChromeThread::ID_COUNT),
+ rdh_(rdh), client_(client), got_response_(false) {
}
void SandboxedExtensionUnpacker::Start() {
// We assume that we are started on the thread that the client wants us to do
// file IO on.
- file_loop_ = MessageLoop::current();
+ CHECK(ChromeThread::GetCurrentThreadIdentifier(&thread_identifier_));
// Create a temporary directory to work in.
if (!temp_dir_.CreateUniqueTempDir()) {
@@ -91,13 +91,14 @@ void SandboxedExtensionUnpacker::Start() {
void SandboxedExtensionUnpacker::StartProcessOnIOThread(
const FilePath& temp_crx_path) {
- UtilityProcessHost* host = new UtilityProcessHost(rdh_, this, file_loop_);
+ UtilityProcessHost* host = new UtilityProcessHost(
+ rdh_, this, thread_identifier_);
host->StartExtensionUnpacker(temp_crx_path);
}
void SandboxedExtensionUnpacker::OnUnpackExtensionSucceeded(
const DictionaryValue& manifest) {
- DCHECK(file_loop_ == MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(thread_identifier_));
got_response_ = true;
ExtensionUnpacker::DecodedImages images;
@@ -198,7 +199,7 @@ void SandboxedExtensionUnpacker::OnUnpackExtensionSucceeded(
void SandboxedExtensionUnpacker::OnUnpackExtensionFailed(
const std::string& error) {
- DCHECK(file_loop_ == MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(thread_identifier_));
got_response_ = true;
ReportFailure(error);
}
diff --git a/chrome/browser/extensions/sandboxed_extension_unpacker.h b/chrome/browser/extensions/sandboxed_extension_unpacker.h
index 458ff29..91cd67f 100644
--- a/chrome/browser/extensions/sandboxed_extension_unpacker.h
+++ b/chrome/browser/extensions/sandboxed_extension_unpacker.h
@@ -124,7 +124,7 @@ class SandboxedExtensionUnpacker : public UtilityProcessHost::Client {
void ReportSuccess();
FilePath crx_path_;
- MessageLoop* file_loop_;
+ ChromeThread::ID thread_identifier_;
ResourceDispatcherHost* rdh_;
scoped_refptr<SandboxedExtensionUnpackerClient> client_;
ScopedTempDir temp_dir_;
diff --git a/chrome/browser/extensions/user_script_listener.cc b/chrome/browser/extensions/user_script_listener.cc
index cc77296..31f0971 100644
--- a/chrome/browser/extensions/user_script_listener.cc
+++ b/chrome/browser/extensions/user_script_listener.cc
@@ -4,28 +4,18 @@
#include "chrome/browser/extensions/user_script_listener.h"
-#include "base/message_loop.h"
+#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/notification_service.h"
#include "net/url_request/url_request.h"
-UserScriptListener::UserScriptListener(MessageLoop* ui_loop,
- MessageLoop* io_loop,
- ResourceDispatcherHost* rdh)
- : ui_loop_(ui_loop),
- io_loop_(io_loop),
- resource_dispatcher_host_(rdh),
+UserScriptListener::UserScriptListener(ResourceDispatcherHost* rdh)
+ : resource_dispatcher_host_(rdh),
user_scripts_ready_(false) {
- DCHECK(ui_loop_);
- DCHECK_EQ(ui_loop_, MessageLoop::current());
DCHECK(resource_dispatcher_host_);
- // IO loop can be NULL in unit tests.
- if (!io_loop_)
- io_loop_ = ui_loop;
-
registrar_.Add(this, NotificationType::EXTENSION_LOADED,
NotificationService::AllSources());
registrar_.Add(this, NotificationType::EXTENSION_UNLOADED,
@@ -35,7 +25,7 @@ UserScriptListener::UserScriptListener(MessageLoop* ui_loop,
}
bool UserScriptListener::ShouldStartRequest(URLRequest* request) {
- DCHECK_EQ(io_loop_, MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
// If it's a frame load, then we need to check the URL against the list of
// user scripts to see if we need to wait.
@@ -72,7 +62,7 @@ bool UserScriptListener::ShouldStartRequest(URLRequest* request) {
}
void UserScriptListener::StartDelayedRequests() {
- DCHECK_EQ(io_loop_, MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
user_scripts_ready_ = true;
@@ -92,7 +82,7 @@ void UserScriptListener::StartDelayedRequests() {
}
void UserScriptListener::AppendNewURLPatterns(const URLPatterns& new_patterns) {
- DCHECK_EQ(io_loop_, MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
user_scripts_ready_ = false;
url_patterns_.insert(url_patterns_.end(),
@@ -100,13 +90,13 @@ void UserScriptListener::AppendNewURLPatterns(const URLPatterns& new_patterns) {
}
void UserScriptListener::ReplaceURLPatterns(const URLPatterns& patterns) {
- DCHECK_EQ(io_loop_, MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
url_patterns_ = patterns;
}
void UserScriptListener::CollectURLPatterns(Extension* extension,
URLPatterns* patterns) {
- DCHECK_EQ(ui_loop_, MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
const UserScriptList& scripts = extension->content_scripts();
for (UserScriptList::const_iterator iter = scripts.begin();
@@ -120,7 +110,7 @@ void UserScriptListener::CollectURLPatterns(Extension* extension,
void UserScriptListener::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
- DCHECK_EQ(ui_loop_, MessageLoop::current());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
switch (type.value) {
case NotificationType::EXTENSION_LOADED: {
@@ -131,8 +121,10 @@ void UserScriptListener::Observe(NotificationType type,
URLPatterns new_patterns;
CollectURLPatterns(Details<Extension>(details).ptr(), &new_patterns);
if (!new_patterns.empty()) {
- io_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &UserScriptListener::AppendNewURLPatterns, new_patterns));
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ this, &UserScriptListener::AppendNewURLPatterns, new_patterns));
}
break;
}
@@ -150,13 +142,16 @@ void UserScriptListener::Observe(NotificationType type,
if (*it != unloaded_extension)
CollectURLPatterns(*it, &new_patterns);
}
- io_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &UserScriptListener::ReplaceURLPatterns, new_patterns));
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ this, &UserScriptListener::ReplaceURLPatterns, new_patterns));
break;
}
case NotificationType::USER_SCRIPTS_UPDATED: {
- io_loop_->PostTask(FROM_HERE,
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
NewRunnableMethod(this, &UserScriptListener::StartDelayedRequests));
break;
}
diff --git a/chrome/browser/extensions/user_script_listener.h b/chrome/browser/extensions/user_script_listener.h
index a742d3a..303e354 100644
--- a/chrome/browser/extensions/user_script_listener.h
+++ b/chrome/browser/extensions/user_script_listener.h
@@ -13,7 +13,6 @@
#include "chrome/common/notification_registrar.h"
class Extension;
-class MessageLoop;
class URLRequest;
// This class handles delaying of resource loads that depend on unloaded user
@@ -27,9 +26,7 @@ class UserScriptListener
: public base::RefCountedThreadSafe<UserScriptListener>,
public NotificationObserver {
public:
- UserScriptListener(MessageLoop* ui_loop,
- MessageLoop* io_loop,
- ResourceDispatcherHost* rdh);
+ UserScriptListener(ResourceDispatcherHost* rdh);
void OnResourceDispatcherHostGone() { resource_dispatcher_host_ = NULL; }
@@ -52,8 +49,6 @@ class UserScriptListener
// deleted, so user_scripts_ready_ remains unchanged.
void ReplaceURLPatterns(const URLPatterns& patterns);
- MessageLoop* ui_loop_;
- MessageLoop* io_loop_;
ResourceDispatcherHost* resource_dispatcher_host_;
// A list of every request that we delayed. Will be flushed when user scripts
diff --git a/chrome/browser/extensions/user_script_listener_unittest.cc b/chrome/browser/extensions/user_script_listener_unittest.cc
index 59357de..c644f1f 100644
--- a/chrome/browser/extensions/user_script_listener_unittest.cc
+++ b/chrome/browser/extensions/user_script_listener_unittest.cc
@@ -31,8 +31,8 @@ class SimpleTestJob : public URLRequestTestJob {
class MockUserScriptMaster : public UserScriptMaster {
public:
- explicit MockUserScriptMaster(MessageLoop* worker, const FilePath& script_dir)
- : UserScriptMaster(worker, script_dir) {}
+ explicit MockUserScriptMaster(const FilePath& script_dir)
+ : UserScriptMaster(script_dir) {}
virtual void StartScan() {
// Do nothing. We want to manually control when scans occur.
@@ -184,6 +184,8 @@ class ResourceDispatcherHostTester
class UserScriptListenerTest : public testing::Test {
public:
virtual void SetUp() {
+ ui_thread_.reset(new ChromeThread(ChromeThread::UI, &loop_));
+ file_thread_.reset(new ChromeThread(ChromeThread::FILE, &loop_));
io_thread_.reset(new MockIOThread());
base::Thread::Options options(MessageLoop::TYPE_IO, 0);
io_thread_->StartWithOptions(options);
@@ -196,14 +198,12 @@ class UserScriptListenerTest : public testing::Test {
resource_tester_ =
new ResourceDispatcherHostTester(io_thread_->message_loop());
- master_ = new MockUserScriptMaster(&loop_, install_dir);
+ master_ = new MockUserScriptMaster(install_dir);
service_ = new ExtensionsService(&profile_,
CommandLine::ForCurrentProcess(),
profile_.GetPrefs(),
install_dir,
- &loop_,
- &loop_,
false);
service_->set_extensions_enabled(true);
service_->set_show_extensions_prompts(false);
@@ -213,12 +213,16 @@ class UserScriptListenerTest : public testing::Test {
virtual void TearDown() {
io_thread_.reset();
+ file_thread_.reset();
+ ui_thread_.reset();
resource_tester_ = NULL;
}
protected:
TestingProfile profile_;
MessageLoopForUI loop_;
+ scoped_ptr<ChromeThread> ui_thread_;
+ scoped_ptr<ChromeThread> file_thread_;
scoped_ptr<MockIOThread> io_thread_;
scoped_refptr<ResourceDispatcherHostTester> resource_tester_;
scoped_refptr<MockUserScriptMaster> master_;
diff --git a/chrome/browser/extensions/user_script_master.cc b/chrome/browser/extensions/user_script_master.cc
index 024de80..b0552e0 100644
--- a/chrome/browser/extensions/user_script_master.cc
+++ b/chrome/browser/extensions/user_script_master.cc
@@ -36,8 +36,8 @@ static bool GetDeclarationValue(const base::StringPiece& line,
}
UserScriptMaster::ScriptReloader::ScriptReloader(UserScriptMaster* master)
- : master_(master),
- master_message_loop_(MessageLoop::current()) {
+ : master_(master) {
+ CHECK(ChromeThread::GetCurrentThreadIdentifier(&master_thread_id_));
}
// static
@@ -110,15 +110,15 @@ bool UserScriptMaster::ScriptReloader::ParseMetadataHeader(
}
void UserScriptMaster::ScriptReloader::StartScan(
- MessageLoop* work_loop, const FilePath& script_dir,
- const UserScriptList& lone_scripts) {
+ const FilePath& script_dir, const UserScriptList& lone_scripts) {
// Add a reference to ourselves to keep ourselves alive while we're running.
// Balanced by NotifyMaster().
AddRef();
- work_loop->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &UserScriptMaster::ScriptReloader::RunScan,
- script_dir, lone_scripts));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ this, &UserScriptMaster::ScriptReloader::RunScan, script_dir,
+ lone_scripts));
}
void UserScriptMaster::ScriptReloader::NotifyMaster(
@@ -252,17 +252,15 @@ void UserScriptMaster::ScriptReloader::RunScan(
// Scripts now contains list of up-to-date scripts. Load the content in the
// shared memory and let the master know it's ready. We need to post the task
// back even if no scripts ware found to balance the AddRef/Release calls
- master_message_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &ScriptReloader::NotifyMaster,
- Serialize(scripts)));
+ ChromeThread::PostTask(
+ master_thread_id_, FROM_HERE,
+ NewRunnableMethod(
+ this, &ScriptReloader::NotifyMaster, Serialize(scripts)));
}
-UserScriptMaster::UserScriptMaster(MessageLoop* worker_loop,
- const FilePath& script_dir)
+UserScriptMaster::UserScriptMaster(const FilePath& script_dir)
: user_script_dir_(script_dir),
- worker_loop_(worker_loop),
extensions_service_ready_(false),
pending_scan_(false) {
if (!user_script_dir_.value().empty())
@@ -383,5 +381,5 @@ void UserScriptMaster::StartScan() {
if (!script_reloader_)
script_reloader_ = new ScriptReloader(this);
- script_reloader_->StartScan(worker_loop_, user_script_dir_, lone_scripts_);
+ script_reloader_->StartScan(user_script_dir_, lone_scripts_);
}
diff --git a/chrome/browser/extensions/user_script_master.h b/chrome/browser/extensions/user_script_master.h
index c5a8803..a062448 100644
--- a/chrome/browser/extensions/user_script_master.h
+++ b/chrome/browser/extensions/user_script_master.h
@@ -11,11 +11,11 @@
#include "base/file_path.h"
#include "base/scoped_ptr.h"
#include "base/shared_memory.h"
+#include "chrome/browser/chrome_thread.h"
#include "chrome/common/extensions/user_script.h"
#include "chrome/common/notification_registrar.h"
#include "testing/gtest/include/gtest/gtest_prod.h"
-class MessageLoop;
namespace base {
class StringPiece;
}
@@ -26,10 +26,9 @@ class UserScriptMaster : public base::RefCountedThreadSafe<UserScriptMaster>,
public DirectoryWatcher::Delegate,
public NotificationObserver {
public:
- // For testability, the constructor takes the MessageLoop to run the
- // script-reloading worker on as well as the path the scripts live in.
- // These are normally the file thread and a directory inside the profile.
- UserScriptMaster(MessageLoop* worker, const FilePath& script_dir);
+ // For testability, the constructor takes the path the scripts live in.
+ // This is normally a directory inside the profile.
+ UserScriptMaster(const FilePath& script_dir);
virtual ~UserScriptMaster();
// Add a watched directory. All scripts will be reloaded when any file in
@@ -82,7 +81,7 @@ class UserScriptMaster : public base::RefCountedThreadSafe<UserScriptMaster>,
// Start a scan for scripts.
// Will always send a message to the master upon completion.
- void StartScan(MessageLoop* work_loop, const FilePath& script_dir,
+ void StartScan(const FilePath& script_dir,
const UserScriptList& external_scripts);
// The master is going away; don't call it back.
@@ -114,7 +113,7 @@ class UserScriptMaster : public base::RefCountedThreadSafe<UserScriptMaster>,
// The message loop to call our master back on.
// Expected to always outlive us.
- MessageLoop* master_message_loop_;
+ ChromeThread::ID master_thread_id_;
DISALLOW_COPY_AND_ASSIGN(ScriptReloader);
};
@@ -136,10 +135,6 @@ class UserScriptMaster : public base::RefCountedThreadSafe<UserScriptMaster>,
// The watcher watches the profile's user scripts directory for new scripts.
std::vector<DirectoryWatcher*> dir_watchers_;
- // The MessageLoop that the scanner worker runs on.
- // Typically the file thread; configurable for testing.
- MessageLoop* worker_loop_;
-
// ScriptReloader (in another thread) reloads script off disk.
// We hang on to our pointer to know if we've already got one running.
scoped_refptr<ScriptReloader> script_reloader_;
diff --git a/chrome/browser/extensions/user_script_master_unittest.cc b/chrome/browser/extensions/user_script_master_unittest.cc
index e7c4206..840d8a3 100644
--- a/chrome/browser/extensions/user_script_master_unittest.cc
+++ b/chrome/browser/extensions/user_script_master_unittest.cc
@@ -11,6 +11,7 @@
#include "base/message_loop.h"
#include "base/path_service.h"
#include "base/string_util.h"
+#include "chrome/browser/chrome_thread.h"
#include "chrome/common/notification_registrar.h"
#include "chrome/common/notification_service.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -39,12 +40,18 @@ class UserScriptMasterTest : public testing::Test,
// Register for all user script notifications.
registrar_.Add(this, NotificationType::USER_SCRIPTS_UPDATED,
NotificationService::AllSources());
+
+ // UserScriptMaster posts tasks to the file thread so make the current
+ // thread look like one.
+ file_thread_.reset(new ChromeThread(
+ ChromeThread::FILE, MessageLoop::current()));
}
virtual void TearDown() {
// Clean up test directory.
ASSERT_TRUE(file_util::Delete(script_dir_, true));
ASSERT_FALSE(file_util::PathExists(script_dir_));
+ file_thread_.reset();
}
virtual void Observe(NotificationType type,
@@ -62,6 +69,8 @@ class UserScriptMasterTest : public testing::Test,
// MessageLoop used in tests.
MessageLoop message_loop_;
+ scoped_ptr<ChromeThread> file_thread_;
+
// Directory containing user scripts.
FilePath script_dir_;
@@ -71,9 +80,7 @@ class UserScriptMasterTest : public testing::Test,
// Test that we get notified even when there are no scripts.
TEST_F(UserScriptMasterTest, NoScripts) {
-
- scoped_refptr<UserScriptMaster> master(
- new UserScriptMaster(MessageLoop::current(), script_dir_));
+ scoped_refptr<UserScriptMaster> master(new UserScriptMaster(script_dir_));
master->StartScan();
message_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask);
message_loop_.Run();
@@ -85,8 +92,7 @@ TEST_F(UserScriptMasterTest, NoScripts) {
#if defined(OS_WIN) || defined(OS_MACOSX)
// Test that we get notified about new scripts after they're added.
TEST_F(UserScriptMasterTest, NewScripts) {
- scoped_refptr<UserScriptMaster> master(
- new UserScriptMaster(MessageLoop::current(), script_dir_));
+ scoped_refptr<UserScriptMaster> master(new UserScriptMaster(script_dir_));
FilePath path = script_dir_.AppendASCII("script.user.js");
@@ -112,8 +118,7 @@ TEST_F(UserScriptMasterTest, ExistingScripts) {
size_t written = file_util::WriteFile(path, content, sizeof(content));
ASSERT_EQ(written, sizeof(content));
- scoped_refptr<UserScriptMaster> master(
- new UserScriptMaster(MessageLoop::current(), script_dir_));
+ scoped_refptr<UserScriptMaster> master(new UserScriptMaster(script_dir_));
master->StartScan();
message_loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask);