summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/dev_tools_agent.cc
diff options
context:
space:
mode:
authoryurys@google.com <yurys@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-05 10:43:58 +0000
committeryurys@google.com <yurys@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-05 10:43:58 +0000
commitac5815ee2f99c89d726dacf7053a8416d78d8841 (patch)
treecfa6ccf92d5ed4bf88ff310fef26d9893e86995b /chrome/renderer/dev_tools_agent.cc
parenta7d936dd1175d6c8bbcd55be3790ee73c4631cd1 (diff)
downloadchromium_src-ac5815ee2f99c89d726dacf7053a8416d78d8841.zip
chromium_src-ac5815ee2f99c89d726dacf7053a8416d78d8841.tar.gz
chromium_src-ac5815ee2f99c89d726dacf7053a8416d78d8841.tar.bz2
- DevToolsAgent is notified in render thread when RenderView is being detroyed.
- Methods of RenderView are called only on render thread in DevToolsAgent(earlier routing_id() was called on IO thread) BUG=8378 Review URL: http://codereview.chromium.org/39182 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10980 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/dev_tools_agent.cc')
-rw-r--r--chrome/renderer/dev_tools_agent.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/chrome/renderer/dev_tools_agent.cc b/chrome/renderer/dev_tools_agent.cc
index 891e895..ec00906 100644
--- a/chrome/renderer/dev_tools_agent.cc
+++ b/chrome/renderer/dev_tools_agent.cc
@@ -16,6 +16,7 @@
DevToolsAgent::DevToolsAgent(RenderView* view, MessageLoop* view_loop)
: debugger_(NULL),
+ routing_id_(view->routing_id()),
view_(view),
view_loop_(view_loop),
channel_(NULL),
@@ -25,6 +26,12 @@ DevToolsAgent::DevToolsAgent(RenderView* view, MessageLoop* view_loop)
DevToolsAgent::~DevToolsAgent() {
}
+// Called on render thread.
+void DevToolsAgent::RenderViewDestroyed() {
+ DCHECK(MessageLoop::current() == view_loop_);
+ view_ = NULL;
+}
+
void DevToolsAgent::Send(const IPC::Message& tools_client_message) {
// It's possible that this will get cleared out from under us.
MessageLoop* io_loop = io_loop_;
@@ -32,7 +39,7 @@ void DevToolsAgent::Send(const IPC::Message& tools_client_message) {
return;
IPC::Message* m = new ViewHostMsg_ForwardToDevToolsClient(
- view_->routing_id(),
+ routing_id_,
tools_client_message);
io_loop->PostTask(FROM_HERE, NewRunnableMethod(
this, &DevToolsAgent::SendFromIOThread, m));
@@ -56,7 +63,7 @@ void DevToolsAgent::OnFilterAdded(IPC::Channel* channel) {
bool DevToolsAgent::OnMessageReceived(const IPC::Message& message) {
DCHECK(MessageLoop::current() == io_loop_);
- if (message.routing_id() != view_->routing_id())
+ if (message.routing_id() != routing_id_)
return false;
bool handled = true;
@@ -70,6 +77,7 @@ bool DevToolsAgent::OnMessageReceived(const IPC::Message& message) {
return handled;
}
+// Called on IO thread.
void DevToolsAgent::OnFilterRemoved() {
io_loop_ = NULL;
channel_ = NULL;
@@ -81,7 +89,9 @@ void DevToolsAgent::DebuggerOutput(const std::wstring& out) {
void DevToolsAgent::EvaluateScript(const std::wstring& script) {
DCHECK(MessageLoop::current() == view_loop_);
- view_->EvaluateScript(L"", script);
+ // view_ may have been cleared after this method execution was scheduled.
+ if (view_)
+ view_->EvaluateScript(L"", script);
}
void DevToolsAgent::OnDebugAttach() {