diff options
author | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 10:10:54 +0000 |
---|---|---|
committer | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-30 10:10:54 +0000 |
commit | fb68e6c9f20785ccd0024f14b09c200060931953 (patch) | |
tree | 1f1a90bddb9ad23b8b3a739c99ba0f3e2cb9a615 | |
parent | 435e1dd51514b412072fa7cf1653a8696cebcdbc (diff) | |
download | chromium_src-fb68e6c9f20785ccd0024f14b09c200060931953.zip chromium_src-fb68e6c9f20785ccd0024f14b09c200060931953.tar.gz chromium_src-fb68e6c9f20785ccd0024f14b09c200060931953.tar.bz2 |
Don't crash when inspect is reloaded
BUG=
R=kaznacheev@chromium.org, pfeldman@chromium.org
Review URL: https://codereview.chromium.org/20410002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@214332 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/devtools/adb/android_usb_socket.cc | 9 | ||||
-rw-r--r-- | chrome/browser/devtools/adb/android_usb_socket.h | 5 | ||||
-rw-r--r-- | chrome/browser/devtools/devtools_adb_bridge.cc | 22 | ||||
-rw-r--r-- | chrome/browser/devtools/devtools_adb_bridge.h | 9 | ||||
-rw-r--r-- | chrome/browser/ui/webui/inspect_ui.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/webui/inspect_ui_browsertest.cc | 8 |
6 files changed, 42 insertions, 14 deletions
diff --git a/chrome/browser/devtools/adb/android_usb_socket.cc b/chrome/browser/devtools/adb/android_usb_socket.cc index c9b87b4..fa87376 100644 --- a/chrome/browser/devtools/adb/android_usb_socket.cc +++ b/chrome/browser/devtools/adb/android_usb_socket.cc @@ -28,8 +28,7 @@ AndroidUsbSocket::AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device, uint32 socket_id, const std::string& command, base::Callback<void(uint32)> delete_callback) - : message_loop_(base::MessageLoop::current()), - device_(device), + : device_(device), command_(command), delete_callback_(delete_callback), local_id_(socket_id), @@ -39,7 +38,7 @@ AndroidUsbSocket::AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device, } AndroidUsbSocket::~AndroidUsbSocket() { - DCHECK_EQ(message_loop_, base::MessageLoop::current()); + DCHECK(CalledOnValidThread()); if (is_connected_) Disconnect(); delete_callback_.Run(local_id_); @@ -149,7 +148,7 @@ bool AndroidUsbSocket::SetSendBufferSize(int32 size) { } int AndroidUsbSocket::Connect(const net::CompletionCallback& callback) { - CHECK_EQ(message_loop_, base::MessageLoop::current()); + DCHECK(CalledOnValidThread()); if (device_->terminated()) return net::ERR_FAILED; connect_callback_ = callback; @@ -164,7 +163,7 @@ void AndroidUsbSocket::Disconnect() { } bool AndroidUsbSocket::IsConnected() const { - CHECK_EQ(message_loop_, base::MessageLoop::current()); + DCHECK(CalledOnValidThread()); return is_connected_; } diff --git a/chrome/browser/devtools/adb/android_usb_socket.h b/chrome/browser/devtools/adb/android_usb_socket.h index 8479040..0839c60 100644 --- a/chrome/browser/devtools/adb/android_usb_socket.h +++ b/chrome/browser/devtools/adb/android_usb_socket.h @@ -8,6 +8,7 @@ #include <deque> #include "base/memory/ref_counted.h" +#include "base/threading/non_thread_safe.h" #include "chrome/browser/devtools/adb/android_usb_device.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" @@ -19,7 +20,8 @@ class MessageLoop; class AdbMessage; -class AndroidUsbSocket : public net::StreamSocket { +class AndroidUsbSocket : public net::StreamSocket, + public base::NonThreadSafe { public: AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device, uint32 socket_id, @@ -69,7 +71,6 @@ class AndroidUsbSocket : public net::StreamSocket { void RespondToReaders(bool diconnect); void RespondToWriters(); - base::MessageLoop* message_loop_; scoped_refptr<AndroidUsbDevice> device_; std::string command_; base::Callback<void(uint32)> delete_callback_; diff --git a/chrome/browser/devtools/devtools_adb_bridge.cc b/chrome/browser/devtools/devtools_adb_bridge.cc index b15537b..00dc3bd 100644 --- a/chrome/browser/devtools/devtools_adb_bridge.cc +++ b/chrome/browser/devtools/devtools_adb_bridge.cc @@ -15,7 +15,7 @@ #include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/singleton.h" -#include "base/message_loop/message_loop_proxy.h" +#include "base/message_loop/message_loop.h" #include "base/rand_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -29,7 +29,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_switches.h" #include "components/browser_context_keyed_service/browser_context_dependency_manager.h" -#include "content/public/browser/browser_thread.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_client_host.h" #include "content/public/browser/devtools_external_agent_proxy.h" @@ -196,7 +195,9 @@ class AdbQueryCommand : public base::RefCounted<AdbQueryCommand> { Callback callback_; }; -class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { +class AdbPagesCommand : public base::RefCountedThreadSafe< + AdbPagesCommand, + content::BrowserThread::DeleteOnUIThread> { public: explicit AdbPagesCommand(DevToolsAdbBridge* bridge, const PagesCallback& callback) @@ -208,8 +209,13 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { } private: - friend class base::RefCountedThreadSafe<AdbPagesCommand>; - virtual ~AdbPagesCommand() {} + friend struct content::BrowserThread::DeleteOnThread< + content::BrowserThread::UI>; + friend class base::DeleteHelper<AdbPagesCommand>; + + virtual ~AdbPagesCommand() { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + } void ReceivedUsbDevices(const AndroidDevices& devices) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); @@ -225,6 +231,7 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { } void ProcessSerials() { + DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); if (devices_.size() == 0) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, @@ -252,6 +259,7 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { } void ReceivedModel(int result, const std::string& response) { + DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); if (result < 0) { devices_.pop_back(); ProcessSerials(); @@ -265,6 +273,7 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { void ReceivedSockets(int result, const std::string& response) { + DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); if (result < 0) { devices_.pop_back(); ProcessSerials(); @@ -281,6 +290,7 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { } void ProcessSockets() { + DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); if (sockets_.size() == 0) { devices_.pop_back(); ProcessSerials(); @@ -293,6 +303,7 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { void ReceivedVersion(int result, const std::string& response) { + DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); if (result < 0) { sockets_.pop_back(); ProcessSockets(); @@ -319,6 +330,7 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<AdbPagesCommand> { void ReceivedPages(int result, const std::string& response) { + DCHECK_EQ(bridge_->GetAdbMessageLoop(), base::MessageLoop::current()); std::string socket = sockets_.back(); sockets_.pop_back(); if (result < 0) { diff --git a/chrome/browser/devtools/devtools_adb_bridge.h b/chrome/browser/devtools/devtools_adb_bridge.h index 39e491b..f3733a06 100644 --- a/chrome/browser/devtools/devtools_adb_bridge.h +++ b/chrome/browser/devtools/devtools_adb_bridge.h @@ -14,6 +14,7 @@ #include "chrome/browser/devtools/adb/android_usb_device.h" #include "components/browser_context_keyed_service/browser_context_keyed_service.h" #include "components/browser_context_keyed_service/browser_context_keyed_service_factory.h" +#include "content/public/browser/browser_thread.h" #include "net/socket/tcp_client_socket.h" template<typename T> struct DefaultSingletonTraits; @@ -41,7 +42,9 @@ typedef base::Callback<void(int, const std::string&)> CommandCallback; typedef base::Callback<void(int result, net::StreamSocket*)> SocketCallback; class DevToolsAdbBridge - : public base::RefCountedThreadSafe<DevToolsAdbBridge> { + : public base::RefCountedThreadSafe< + DevToolsAdbBridge, + content::BrowserThread::DeleteOnUIThread> { public: typedef base::Callback<void(int result, const std::string& response)> Callback; @@ -181,7 +184,9 @@ class DevToolsAdbBridge base::MessageLoop* GetAdbMessageLoop(); private: - friend class base::RefCountedThreadSafe<DevToolsAdbBridge>; + friend struct content::BrowserThread::DeleteOnThread< + content::BrowserThread::UI>; + friend class base::DeleteHelper<DevToolsAdbBridge>; friend class AdbWebSocket; friend class AgentHostDelegate; diff --git a/chrome/browser/ui/webui/inspect_ui.cc b/chrome/browser/ui/webui/inspect_ui.cc index 893f7df..32c5846 100644 --- a/chrome/browser/ui/webui/inspect_ui.cc +++ b/chrome/browser/ui/webui/inspect_ui.cc @@ -397,6 +397,9 @@ void InspectUI::Observe(int type, } void InspectUI::StartListeningNotifications() { + if (observer_) + return; + observer_ = new WorkerCreationDestructionListener(); observer_->Init(this); diff --git a/chrome/browser/ui/webui/inspect_ui_browsertest.cc b/chrome/browser/ui/webui/inspect_ui_browsertest.cc index 158cd0b..3028744 100644 --- a/chrome/browser/ui/webui/inspect_ui_browsertest.cc +++ b/chrome/browser/ui/webui/inspect_ui_browsertest.cc @@ -56,4 +56,12 @@ IN_PROC_BROWSER_TEST_F(InspectUITest, DISABLED_SharedWorkersList) { ASSERT_TRUE(result.find(kSharedWorkerTestPage) != std::string::npos); } +IN_PROC_BROWSER_TEST_F(InspectUITest, ReloadCrash) { + ASSERT_TRUE(test_server()->Start()); + // Make sure that loading the inspect UI twice in the same tab + // connects/disconnects listeners without crashing. + ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL)); + ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIInspectURL)); +} + } // namespace |