summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-30 10:10:54 +0000
committerpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-30 10:10:54 +0000
commitfb68e6c9f20785ccd0024f14b09c200060931953 (patch)
tree1f1a90bddb9ad23b8b3a739c99ba0f3e2cb9a615
parent435e1dd51514b412072fa7cf1653a8696cebcdbc (diff)
downloadchromium_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.cc9
-rw-r--r--chrome/browser/devtools/adb/android_usb_socket.h5
-rw-r--r--chrome/browser/devtools/devtools_adb_bridge.cc22
-rw-r--r--chrome/browser/devtools/devtools_adb_bridge.h9
-rw-r--r--chrome/browser/ui/webui/inspect_ui.cc3
-rw-r--r--chrome/browser/ui/webui/inspect_ui_browsertest.cc8
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