Skip to content
Snippets Groups Projects
Commit 6fad2633 authored by jam@chromium.org's avatar jam@chromium.org
Browse files

Third patch in getting rid of caching MessageLoop pointers and always using ChromeThread instead.

BUG=25354

Review URL: http://codereview.chromium.org/342068

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30687 0039d316-1c4b-4281-b951-d872f2087c98
parent f75c8f13
No related merge requests found
Showing
with 118 additions and 88 deletions
......@@ -7,6 +7,7 @@
#include "base/string_util.h"
#include "chrome/browser/autocomplete/autocomplete.h"
#include "chrome/browser/autocomplete/history_contents_provider.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/history/history.h"
#include "chrome/test/testing_profile.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -29,6 +30,9 @@ struct TestEntry {
class HistoryContentsProviderTest : public testing::Test,
public ACProviderListener {
public:
HistoryContentsProviderTest()
: ui_thread_(ChromeThread::UI, &message_loop_),
file_thread_(ChromeThread::FILE, &message_loop_) {}
void RunQuery(const AutocompleteInput& input,
bool minimal_changes) {
......@@ -87,6 +91,8 @@ class HistoryContentsProviderTest : public testing::Test,
}
MessageLoopForUI message_loop_;
ChromeThread ui_thread_;
ChromeThread file_thread_;
std::wstring history_dir_;
......
......@@ -8,6 +8,7 @@
#include "base/string_util.h"
#include "chrome/browser/autocomplete/history_url_provider.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/history/history.h"
#include "chrome/test/testing_profile.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -94,6 +95,11 @@ static TestURLInfo test_db[] = {
class HistoryURLProviderTest : public testing::Test,
public ACProviderListener {
public:
HistoryURLProviderTest()
: ui_thread_(ChromeThread::UI, &message_loop_),
file_thread_(ChromeThread::FILE, &message_loop_) {}
// ACProviderListener
virtual void OnProviderUpdate(bool updated_matches);
......@@ -114,6 +120,8 @@ class HistoryURLProviderTest : public testing::Test,
size_t num_results);
MessageLoopForUI message_loop_;
ChromeThread ui_thread_;
ChromeThread file_thread_;
ACMatches matches_;
scoped_ptr<TestingProfile> profile_;
HistoryService* history_service_;
......@@ -130,6 +138,7 @@ void HistoryURLProviderTest::OnProviderUpdate(bool updated_matches) {
void HistoryURLProviderTest::SetUp() {
profile_.reset(new TestingProfile());
profile_->CreateBookmarkModel(true);
profile_->BlockUntilBookmarkModelLoaded();
profile_->CreateHistoryService(true);
history_service_ = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
......
......@@ -4,14 +4,26 @@
#include "app/os_exchange_data.h"
#include "app/os_exchange_data_provider_win.h"
#include "base/message_loop.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/bookmarks/bookmark_drag_data.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/test/testing_profile.h"
#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"
typedef testing::Test BookmarkDragDataTest;
class BookmarkDragDataTest : public testing::Test {
public:
BookmarkDragDataTest()
: ui_thread_(ChromeThread::UI, &loop_),
file_thread_(ChromeThread::FILE, &loop_) { }
private:
MessageLoop loop_;
ChromeThread ui_thread_;
ChromeThread file_thread_;
};
namespace {
......@@ -59,6 +71,7 @@ TEST_F(BookmarkDragDataTest, URL) {
// Write a single node representing a URL to the clipboard.
TestingProfile profile;
profile.CreateBookmarkModel(false);
profile.BlockUntilBookmarkModelLoaded();
profile.SetID(L"id");
BookmarkModel* model = profile.GetBookmarkModel();
const BookmarkNode* root = model->GetBookmarkBarNode();
......@@ -101,6 +114,7 @@ TEST_F(BookmarkDragDataTest, URL) {
TEST_F(BookmarkDragDataTest, Group) {
TestingProfile profile;
profile.CreateBookmarkModel(false);
profile.BlockUntilBookmarkModelLoaded();
profile.SetID(L"id");
BookmarkModel* model = profile.GetBookmarkModel();
const BookmarkNode* root = model->GetBookmarkBarNode();
......@@ -140,6 +154,7 @@ TEST_F(BookmarkDragDataTest, GroupWithChild) {
TestingProfile profile;
profile.SetID(L"id");
profile.CreateBookmarkModel(false);
profile.BlockUntilBookmarkModelLoaded();
BookmarkModel* model = profile.GetBookmarkModel();
const BookmarkNode* root = model->GetBookmarkBarNode();
const BookmarkNode* group = model->AddGroup(root, 0, L"g1");
......@@ -178,6 +193,7 @@ TEST_F(BookmarkDragDataTest, MultipleNodes) {
TestingProfile profile;
profile.SetID(L"id");
profile.CreateBookmarkModel(false);
profile.BlockUntilBookmarkModelLoaded();
BookmarkModel* model = profile.GetBookmarkModel();
const BookmarkNode* root = model->GetBookmarkBarNode();
const BookmarkNode* group = model->AddGroup(root, 0, L"g1");
......
......@@ -2,8 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/message_loop.h"
#include "base/string_util.h"
#include "chrome/browser/bookmarks/bookmark_folder_tree_model.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/test/testing_profile.h"
#include "grit/generated_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -31,12 +33,15 @@ class BookmarkFolderTreeModelTest : public testing::Test,
added_count_(0),
removed_count_(0),
changed_count_(0),
reordered_count_(0) {
reordered_count_(0),
ui_thread_(ChromeThread::UI, &loop_),
file_thread_(ChromeThread::FILE, &loop_) {
}
virtual void SetUp() {
profile_.reset(new TestingProfile());
profile_->CreateBookmarkModel(true);
profile_->BlockUntilBookmarkModelLoaded();
// Populate with some default data.
const BookmarkNode* bb = bookmark_model()->GetBookmarkBarNode();
bookmark_model()->AddURL(bb, 0, L"url1", url1_);
......@@ -112,6 +117,9 @@ class BookmarkFolderTreeModelTest : public testing::Test,
int removed_count_;
int reordered_count_;
scoped_ptr<TestingProfile> profile_;
MessageLoop loop_;
ChromeThread ui_thread_;
ChromeThread file_thread_;
};
// Verifies the root node has 4 nodes, and the contents of the bookmark bar
......
......@@ -14,6 +14,7 @@
#include "base/values.h"
#include "chrome/browser/bookmarks/bookmark_codec.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/history/history_types.h"
#include "grit/generated_resources.h"
#include "net/base/escape.h"
......@@ -316,18 +317,13 @@ class Writer : public Task {
} // namespace
void WriteBookmarks(MessageLoop* thread,
BookmarkModel* model,
const FilePath& path) {
void WriteBookmarks(BookmarkModel* model, const FilePath& path) {
// BookmarkModel isn't thread safe (nor would we want to lock it down
// for the duration of the write), as such we make a copy of the
// BookmarkModel using BookmarkCodec then write from that.
BookmarkCodec codec;
scoped_ptr<Writer> writer(new Writer(codec.Encode(model), path));
if (thread)
thread->PostTask(FROM_HERE, writer.release());
else
writer->Run();
ChromeThread::PostTask(
ChromeThread::FILE, FROM_HERE, new Writer(codec.Encode(model), path));
}
} // namespace bookmark_html_writer
......@@ -12,14 +12,11 @@ class MessageLoop;
namespace bookmark_html_writer {
// Writes the bookmarks out in the 'bookmarks.html' format understood by
// Firefox and IE. The results are written to the file at |path|.
// If |thread| is non-null, writing is done on that thread, otherwise
// writing is synchronous.
// Firefox and IE. The results are written to the file at |path|. The file
// thread is used.
//
// TODO(sky): need a callback on failure.
void WriteBookmarks(MessageLoop* thread,
BookmarkModel* model,
const FilePath& path);
void WriteBookmarks(BookmarkModel* model, const FilePath& path);
}
......
......@@ -6,12 +6,14 @@
#include "app/l10n_util.h"
#include "base/file_util.h"
#include "base/message_loop.h"
#include "base/path_service.h"
#include "base/string_util.h"
#include "base/time.h"
#include "base/i18n/time_formatting.h"
#include "chrome/browser/bookmarks/bookmark_html_writer.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/importer/firefox2_importer.h"
#include "grit/generated_resources.h"
......@@ -149,7 +151,10 @@ TEST_F(BookmarkHTMLWriterTest, Test) {
url4, t4);
// Write to a temp file.
bookmark_html_writer::WriteBookmarks(NULL, &model, path_);
MessageLoop message_loop;
ChromeThread fake_file_thread(ChromeThread::FILE, &message_loop);
bookmark_html_writer::WriteBookmarks(&model, path_);
message_loop.RunAllPending();
// Read the bookmarks back in.
std::vector<ProfileWriter::BookmarkEntry> parsed_bookmarks;
......
......@@ -9,6 +9,7 @@
#include "base/string_util.h"
#include "chrome/browser/bookmarks/bookmark_index.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/history/history_database.h"
#include "chrome/browser/history/in_memory_database.h"
#include "chrome/browser/history/query_parser.h"
......@@ -212,6 +213,8 @@ TEST_F(BookmarkIndexTest, GetResultsSortedByTypedCount) {
// This ensures MessageLoop::current() will exist, which is needed by
// TestingProfile::BlockUntilHistoryProcessesPendingRequests().
MessageLoop loop(MessageLoop::TYPE_DEFAULT);
ChromeThread ui_thread(ChromeThread::UI, &loop);
ChromeThread file_thread(ChromeThread::FILE, &loop);
TestingProfile profile;
profile.CreateHistoryService(true);
......
......@@ -562,6 +562,10 @@ static void PopulateBookmarkNode(TestNode* parent,
class BookmarkModelTestWithProfile : public testing::Test,
public BookmarkModelObserver {
public:
BookmarkModelTestWithProfile()
: ui_thread_(ChromeThread::UI, &message_loop_),
file_thread_(ChromeThread::FILE, &message_loop_) {}
virtual void SetUp() {
}
......@@ -652,6 +656,8 @@ class BookmarkModelTestWithProfile : public testing::Test,
const BookmarkNode* node) {}
MessageLoopForUI message_loop_;
ChromeThread ui_thread_;
ChromeThread file_thread_;
};
// Creates a set of nodes in the bookmark bar model, then recreates the
......
......@@ -7,12 +7,10 @@
#include "base/compiler_specific.h"
#include "base/file_util.h"
#include "base/histogram.h"
#include "base/message_loop.h"
#include "base/thread.h"
#include "base/time.h"
#include "chrome/browser/bookmarks/bookmark_codec.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/profile.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/json_value_serializer.h"
......@@ -65,11 +63,9 @@ class FileDeleteTask : public Task {
class BookmarkStorage::LoadTask : public Task {
public:
LoadTask(const FilePath& path,
MessageLoop* loop,
BookmarkStorage* storage,
LoadDetails* details)
: path_(path),
loop_(loop),
storage_(storage),
details_(details) {
}
......@@ -103,13 +99,11 @@ class BookmarkStorage::LoadTask : public Task {
}
}
if (loop_) {
loop_->PostTask(FROM_HERE, NewRunnableMethod(
storage_.get(), &BookmarkStorage::OnLoadFinished,
bookmark_file_exists, path_));
} else {
storage_->OnLoadFinished(bookmark_file_exists, path_);
}
ChromeThread::PostTask(
ChromeThread::UI, FROM_HERE,
NewRunnableMethod(
storage_.get(), &BookmarkStorage::OnLoadFinished,
bookmark_file_exists, path_));
}
private:
......@@ -125,7 +119,6 @@ class BookmarkStorage::LoadTask : public Task {
}
const FilePath path_;
MessageLoop* loop_;
scoped_refptr<BookmarkStorage> storage_;
LoadDetails* details_;
......@@ -137,13 +130,12 @@ class BookmarkStorage::LoadTask : public Task {
BookmarkStorage::BookmarkStorage(Profile* profile, BookmarkModel* model)
: profile_(profile),
model_(model),
backend_thread_(g_browser_process->file_thread()),
writer_(profile->GetPath().Append(chrome::kBookmarksFileName),
backend_thread_),
writer_(profile->GetPath().Append(chrome::kBookmarksFileName)),
tmp_history_path_(
profile->GetPath().Append(chrome::kHistoryBookmarksFileName)) {
writer_.set_commit_interval(base::TimeDelta::FromMilliseconds(kSaveDelayMS));
RunTaskOnBackendThread(new BackupTask(writer_.path()));
ChromeThread::PostTask(
ChromeThread::FILE, FROM_HERE, new BackupTask(writer_.path()));
}
BookmarkStorage::~BookmarkStorage() {
......@@ -159,11 +151,8 @@ void BookmarkStorage::LoadBookmarks(LoadDetails* details) {
}
void BookmarkStorage::DoLoadBookmarks(const FilePath& path) {
Task* task = new LoadTask(path,
backend_thread() ? MessageLoop::current() : NULL,
this,
details_.get());
RunTaskOnBackendThread(task);
ChromeThread::PostTask(
ChromeThread::FILE, FROM_HERE, new LoadTask(path, this, details_.get()));
}
void BookmarkStorage::MigrateFromHistory() {
......@@ -238,7 +227,8 @@ void BookmarkStorage::OnLoadFinished(bool file_exists, const FilePath& path) {
SaveNow();
// Clean up after migration from history.
RunTaskOnBackendThread(new FileDeleteTask(tmp_history_path_));
ChromeThread::PostTask(
ChromeThread::FILE, FROM_HERE, new FileDeleteTask(tmp_history_path_));
}
}
......@@ -270,12 +260,3 @@ bool BookmarkStorage::SaveNow() {
writer_.WriteNow(data);
return true;
}
void BookmarkStorage::RunTaskOnBackendThread(Task* task) const {
if (backend_thread()) {
backend_thread()->message_loop()->PostTask(FROM_HERE, task);
} else {
task->Run();
delete task;
}
}
......@@ -19,10 +19,6 @@ class Profile;
class Task;
class Value;
namespace base {
class Thread;
}
// BookmarkStorage handles reading/write the bookmark bar model. The
// BookmarkModel uses the BookmarkStorage to load bookmarks from disk, as well
// as notifying the BookmarkStorage every time the model changes.
......@@ -143,23 +139,12 @@ class BookmarkStorage : public NotificationObserver,
// Returns true on successful serialization.
bool SaveNow();
// Runs task on backend thread (or on current thread if backend thread
// is NULL). Takes ownership of |task|.
void RunTaskOnBackendThread(Task* task) const;
// Returns the thread the backend is run on.
const base::Thread* backend_thread() const { return backend_thread_; }
// Keep the pointer to profile, we may need it for migration from history.
Profile* profile_;
// The model. The model is NULL once BookmarkModelDeleted has been invoked.
BookmarkModel* model_;
// Thread read/writing is run on. This comes from the profile, and is null
// during testing.
const base::Thread* backend_thread_;
// Helper to write bookmark data safely.
ImportantFileWriter writer_;
......
......@@ -3,9 +3,11 @@
// found in the LICENSE file.
#include "app/table_model_observer.h"
#include "base/message_loop.h"
#include "base/string_util.h"
#include "base/time.h"
#include "chrome/browser/bookmarks/bookmark_table_model.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/test/testing_profile.h"
#include "grit/generated_resources.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -32,12 +34,15 @@ class BookmarkTableModelTest : public testing::Test,
changed_count_(0),
item_changed_count_(0),
added_count_(0),
removed_count_(0) {
removed_count_(0),
ui_thread_(ChromeThread::UI, &loop_),
file_thread_(ChromeThread::FILE, &loop_) {
}
virtual void SetUp() {
profile_.reset(new TestingProfile());
profile_->CreateBookmarkModel(true);
profile_->BlockUntilBookmarkModelLoaded();
// Populate with some default data.
Time t0 = Time::Now();
const BookmarkNode* bb = bookmark_model()->GetBookmarkBarNode();
......@@ -110,6 +115,9 @@ class BookmarkTableModelTest : public testing::Test,
int added_count_;
int removed_count_;
scoped_ptr<TestingProfile> profile_;
MessageLoop loop_;
ChromeThread ui_thread_;
ChromeThread file_thread_;
};
// Verifies the count when showing various nodes.
......
......@@ -21,6 +21,7 @@
#include "base/tracked_objects.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/dom_ui/chrome_url_data_manager.h"
#include "chrome/browser/memory_details.h"
#include "chrome/browser/net/dns_global.h"
......@@ -567,8 +568,10 @@ AboutSource::AboutSource()
about_source = this;
// Add us to the global URL handler on the IO thread.
g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
NewRunnableMethod(Singleton<ChromeURLDataManager>().get(),
ChromeThread::PostTask(
ChromeThread::IO, FROM_HERE,
NewRunnableMethod(
Singleton<ChromeURLDataManager>().get(),
&ChromeURLDataManager::AddDataSource, this));
}
......
......@@ -6,6 +6,7 @@
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/tab_contents/navigation_controller.h"
#include "chrome/browser/tab_contents/navigation_entry.h"
#include "chrome/common/url_constants.h"
......@@ -78,6 +79,8 @@ TEST_F(BrowserCommandsTest, DuplicateTab) {
}
TEST_F(BrowserCommandsTest, BookmarkCurrentPage) {
ChromeThread ui_loop(ChromeThread::UI, MessageLoop::current());
ChromeThread file_loop(ChromeThread::FILE, MessageLoop::current());
// We use profile() here, since it's a TestingProfile.
profile()->CreateBookmarkModel(true);
profile()->BlockUntilBookmarkModelLoaded();
......
......@@ -443,8 +443,7 @@ int BrowserMain(const MainFunctionParams& parameters) {
parsed_command_line.HasSwitch(switches::kParentProfile)) {
FilePath parent_profile = FilePath::FromWStringHack(
parsed_command_line.GetSwitchValue(switches::kParentProfile));
PrefService parent_local_state(parent_profile,
g_browser_process->file_thread());
PrefService parent_local_state(parent_profile);
parent_local_state.RegisterStringPref(prefs::kApplicationLocale,
std::wstring());
// Right now, we only inherit the locale setting from the parent profile.
......
......@@ -397,7 +397,7 @@ void BrowserProcessImpl::CreateLocalState() {
FilePath local_state_path;
PathService::Get(chrome::FILE_LOCAL_STATE, &local_state_path);
local_state_.reset(new PrefService(local_state_path, file_thread()));
local_state_.reset(new PrefService(local_state_path));
}
#if defined(OS_WIN)
......
......@@ -14,6 +14,7 @@
#include "base/time.h"
#include "base/waitable_event.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/dom_ui/chrome_url_data_manager.h"
#include "chrome/browser/first_run.h"
#include "chrome/browser/jankometer.h"
......@@ -90,10 +91,9 @@ FilePath GetShutdownMsPath() {
void Shutdown() {
// Unload plugins. This needs to happen on the IO thread.
if (g_browser_process->io_thread()) {
g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
ChromeThread::PostTask(
ChromeThread::IO, FROM_HERE,
NewRunnableFunction(&ChromePluginLib::UnloadAllPlugins));
}
// WARNING: During logoff/shutdown (WM_ENDSESSION) we may not have enough
// time to get here. If you have something that *must* happen on end session,
......
......@@ -5,7 +5,6 @@
#include "chrome/browser/browsing_data_remover.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/download/download_manager.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/profile.h"
......@@ -133,18 +132,17 @@ void BrowsingDataRemover::Remove(int remove_mask) {
if (remove_mask & REMOVE_CACHE) {
// Invoke ClearBrowsingDataView::ClearCache on the IO thread.
base::Thread* thread = g_browser_process->io_thread();
if (thread) {
waiting_for_clear_cache_ = true;
UserMetrics::RecordAction(L"ClearBrowsingData_Cache", profile_);
thread->message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
this,
&BrowsingDataRemover::ClearCacheOnIOThread,
profile_->GetRequestContext(),
delete_begin_,
delete_end_,
MessageLoop::current()));
}
waiting_for_clear_cache_ = true;
UserMetrics::RecordAction(L"ClearBrowsingData_Cache", profile_);
ChromeThread::PostTask(
ChromeThread::IO, FROM_HERE,
NewRunnableMethod(
this,
&BrowsingDataRemover::ClearCacheOnIOThread,
profile_->GetRequestContext(),
delete_begin_,
delete_end_,
MessageLoop::current()));
}
NotifyAndDeleteIfDone();
......
......@@ -17,6 +17,7 @@
#include "base/singleton.h"
#include "base/string_util.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/chrome_plugin_browsing_context.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/dom_ui/html_dialog_ui.h"
......@@ -817,7 +818,8 @@ void CPHandleCommand(int command, CPCommandInterface* data,
// brain trying to compile the Tuple3 ctor. This cast works.
int32 context_as_int32 = static_cast<int32>(context);
// Plugins can only be accessed on the IO thread.
g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
ChromeThread::PostTask(
ChromeThread::IO, FROM_HERE,
NewRunnableFunction(PluginCommandHandler::HandleCommand,
command, data, context_as_int32));
}
......@@ -6,6 +6,7 @@
#define CHROME_BROWSER_COCOA_BROWSER_TEST_HELPER_H_
#include "chrome/browser/browser.h"
#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/profile.h"
#include "chrome/test/testing_profile.h"
......@@ -18,7 +19,9 @@
// navigation_controller_unittest.cc, ..
class BrowserTestHelper {
public:
BrowserTestHelper() {
BrowserTestHelper()
: ui_thread_(ChromeThread::UI, &message_loop_),
file_thread_(ChromeThread::FILE, &message_loop_) {
profile_.reset(new TestingProfile());
profile_->CreateBookmarkModel(true);
profile_->BlockUntilBookmarkModelLoaded();
......@@ -32,6 +35,8 @@ class BrowserTestHelper {
scoped_ptr<TestingProfile> profile_;
scoped_ptr<Browser> browser_;
MessageLoopForUI message_loop_;
ChromeThread ui_thread_;
ChromeThread file_thread_;
};
#endif // CHROME_BROWSER_COCOA_BROWSER_TEST_HELPER_H_
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment