Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(500)

Unified Diff: content/browser/browser_main_loop.cc

Issue 9150016: Move creation and ownership of ResourceDispatcherHost and PluginService to content. This gives a ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/browser_main_loop.cc
===================================================================
--- content/browser/browser_main_loop.cc (revision 116798)
+++ content/browser/browser_main_loop.cc (working copy)
@@ -13,7 +13,11 @@
#include "base/metrics/histogram.h"
#include "base/threading/thread_restrictions.h"
#include "content/browser/browser_thread_impl.h"
+#include "content/browser/download/download_file_manager.h"
+#include "content/browser/download/save_file_manager.h"
#include "content/browser/in_process_webkit/webkit_thread.h"
+#include "content/browser/plugin_service_impl.h"
+#include "content/browser/renderer_host/resource_dispatcher_host.h"
#include "content/browser/trace_controller.h"
#include "content/common/hi_res_timer_manager.h"
#include "content/common/sandbox_policy.h"
@@ -290,6 +294,12 @@
system_message_window_.reset(new SystemMessageWindowWin);
#endif
+ // Prior to any processing happening on the io thread, we create the
+ // plugin service as it is predominantly used from the io thread,
+ // but must be created on the main thread. The service ctor is
+ // inexpensive and does not invoke the io_thread() accessor.
+ PluginService::GetInstance()->Init();
+
if (parts_.get())
parts_->PostMainMessageLoopStart();
}
@@ -364,9 +374,6 @@
BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id);
- if (parts_.get())
- parts_->PreStartThread(id);
-
if (thread_id == BrowserThread::WEBKIT_DEPRECATED) {
webkit_thread_.reset(new WebKitThread);
webkit_thread_->Initialize();
@@ -376,9 +383,6 @@
} else {
NOTREACHED();
}
-
- if (parts_.get())
- parts_->PostStartThread(id);
}
if (parts_.get())
@@ -416,6 +420,12 @@
if (parts_.get())
parts_->PostMainMessageLoopRun();
+ // Cancel pending requests and prevent new requests.
+ ResourceDispatcherHost* rdh = ResourceDispatcherHost::IsCreated() ?
+ ResourceDispatcherHost::Get() : NULL;
+ if (rdh)
+ rdh->Shutdown();
+
// Must be size_t so we can subtract from it.
for (size_t thread_id = BrowserThread::ID_COUNT - 1;
thread_id >= (BrowserThread::UI + 1);
@@ -452,12 +462,24 @@
case BrowserThread::WEBKIT_DEPRECATED:
// Special case as WebKitThread is a separate
// type. |thread_to_stop| is not used in this case.
+
+ // Need to destroy ResourceDispatcherHost before PluginService
+ // and since it caches a pointer to it.
+ if (rdh)
+ delete rdh;
break;
case BrowserThread::FILE_USER_BLOCKING:
thread_to_stop = &file_user_blocking_thread_;
break;
case BrowserThread::FILE:
thread_to_stop = &file_thread_;
+
+ // Clean up state that lives on or uses the file_thread_ before
+ // it goes away.
+ if (rdh) {
+ rdh->download_file_manager()->Shutdown();
+ rdh->save_file_manager()->Shutdown();
+ }
break;
case BrowserThread::PROCESS_LAUNCHER:
thread_to_stop = &process_launcher_thread_;
@@ -482,9 +504,6 @@
BrowserThread::ID id = static_cast<BrowserThread::ID>(thread_id);
- if (parts_.get())
- parts_->PreStopThread(id);
-
if (id == BrowserThread::WEBKIT_DEPRECATED) {
webkit_thread_.reset();
} else if (thread_to_stop) {
@@ -492,9 +511,6 @@
} else {
NOTREACHED();
}
-
- if (parts_.get())
- parts_->PostStopThread(id);
}
if (parts_.get())

Powered by Google App Engine
This is Rietveld 408576698