| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this |
| 2 // source code is governed by a BSD-style license that can be found in the | 2 // source code is governed by a BSD-style license that can be found in the |
| 3 // LICENSE file. | 3 // LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/in_process_webkit/webkit_thread.h" | 5 #include "chrome/browser/in_process_webkit/webkit_thread.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "chrome/browser/in_process_webkit/browser_webkitclient_impl.h" | 8 #include "chrome/browser/in_process_webkit/browser_webkitclient_impl.h" |
| 9 #include "chrome/common/chrome_switches.h" | 9 #include "chrome/common/chrome_switches.h" |
| 10 #include "webkit/api/public/WebKit.h" | 10 #include "webkit/api/public/WebKit.h" |
| 11 | 11 |
| 12 // This happens on the UI thread before the IO thread has been shut down. | 12 // This happens on the UI thread before the IO thread has been shut down. |
| 13 WebKitThread::WebKitThread() { | 13 WebKitThread::WebKitThread() |
| 14 : io_message_loop_(ChromeThread::GetMessageLoop(ChromeThread::IO)) { |
| 14 // The thread is started lazily by InitializeThread() on the IO thread. | 15 // The thread is started lazily by InitializeThread() on the IO thread. |
| 15 } | 16 } |
| 16 | 17 |
| 17 // This happens on the UI thread after the IO thread has been shut down. | 18 // This happens on the UI thread after the IO thread has been shut down. |
| 18 WebKitThread::~WebKitThread() { | 19 WebKitThread::~WebKitThread() { |
| 20 // There's no good way to see if we're on the UI thread. |
| 19 DCHECK(!ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); | 21 DCHECK(!ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
| 22 DCHECK(!ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| 23 DCHECK(!io_message_loop_); |
| 24 } |
| 25 |
| 26 void WebKitThread::Shutdown() { |
| 27 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
| 28 DCHECK(io_message_loop_); |
| 29 |
| 30 // TODO(jorlow): Start flushing LocalStorage? |
| 31 |
| 32 AutoLock lock(io_message_loop_lock_); |
| 33 io_message_loop_ = NULL; |
| 34 } |
| 35 |
| 36 bool WebKitThread::PostIOThreadTask( |
| 37 const tracked_objects::Location& from_here, Task* task) { |
| 38 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::WEBKIT)); |
| 39 { |
| 40 AutoLock lock(io_message_loop_lock_); |
| 41 if (io_message_loop_) { |
| 42 io_message_loop_->PostTask(from_here, task); |
| 43 return true; |
| 44 } |
| 45 } |
| 46 delete task; |
| 47 return false; |
| 20 } | 48 } |
| 21 | 49 |
| 22 WebKitThread::InternalWebKitThread::InternalWebKitThread() | 50 WebKitThread::InternalWebKitThread::InternalWebKitThread() |
| 23 : ChromeThread(ChromeThread::WEBKIT), | 51 : ChromeThread(ChromeThread::WEBKIT), |
| 24 webkit_client_(NULL) { | 52 webkit_client_(NULL) { |
| 25 } | 53 } |
| 26 | 54 |
| 27 void WebKitThread::InternalWebKitThread::Init() { | 55 void WebKitThread::InternalWebKitThread::Init() { |
| 28 DCHECK(!webkit_client_); | 56 DCHECK(!webkit_client_); |
| 29 webkit_client_ = new BrowserWebKitClientImpl; | 57 webkit_client_ = new BrowserWebKitClientImpl; |
| 30 DCHECK(webkit_client_); | 58 DCHECK(webkit_client_); |
| 31 WebKit::initialize(webkit_client_); | 59 WebKit::initialize(webkit_client_); |
| 32 // Don't do anything heavyweight here since this can block the IO thread from | 60 // If possible, post initialization tasks to this thread (rather than doing |
| 33 // executing (since InitializeThread() is called on the IO thread). | 61 // them now) so we don't block the IO thread any longer than we have to. |
| 34 } | 62 } |
| 35 | 63 |
| 36 void WebKitThread::InternalWebKitThread::CleanUp() { | 64 void WebKitThread::InternalWebKitThread::CleanUp() { |
| 37 // Don't do anything heavyweight here since this can block the IO thread from | 65 // TODO(jorlow): Block on LocalStorage being 100% shut down. |
| 38 // executing (since the thread is shutdown from the IO thread). | |
| 39 DCHECK(webkit_client_); | 66 DCHECK(webkit_client_); |
| 40 WebKit::shutdown(); | 67 WebKit::shutdown(); |
| 41 delete webkit_client_; | 68 delete webkit_client_; |
| 42 } | 69 } |
| 43 | 70 |
| 44 MessageLoop* WebKitThread::InitializeThread() { | 71 MessageLoop* WebKitThread::InitializeThread() { |
| 45 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 72 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) |
| 46 return NULL; | 73 return NULL; |
| 47 | 74 |
| 75 DCHECK(io_message_loop_); |
| 48 DCHECK(!webkit_thread_.get()); | 76 DCHECK(!webkit_thread_.get()); |
| 49 webkit_thread_.reset(new InternalWebKitThread); | 77 webkit_thread_.reset(new InternalWebKitThread); |
| 50 bool started = webkit_thread_->Start(); | 78 bool started = webkit_thread_->Start(); |
| 51 DCHECK(started); | 79 DCHECK(started); |
| 52 return webkit_thread_->message_loop(); | 80 return webkit_thread_->message_loop(); |
| 53 } | 81 } |
| OLD | NEW |