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

Unified Diff: content/browser/devtools/devtools_manager_impl.cc

Issue 467653002: Revert of [DevTools] Make DevTools clients talk directly to DevToolsAgentHost instead of using DevToolsManage… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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/devtools/devtools_manager_impl.cc
diff --git a/content/browser/devtools/devtools_manager_impl.cc b/content/browser/devtools/devtools_manager_impl.cc
index 4f40e80bae7d728f88a026ecc25e146e16200fd2..3aafd1c2e2e2fa3ba1315af2b0545877ebfc2fee 100644
--- a/content/browser/devtools/devtools_manager_impl.cc
+++ b/content/browser/devtools/devtools_manager_impl.cc
@@ -4,15 +4,25 @@
#include "content/browser/devtools/devtools_manager_impl.h"
+#include <vector>
+
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "content/browser/devtools/devtools_netlog_observer.h"
+#include "content/browser/devtools/render_view_devtools_agent_host.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/devtools_agent_host.h"
+#include "content/public/browser/devtools_client_host.h"
#include "content/public/browser/devtools_manager_delegate.h"
namespace content {
+
+// static
+DevToolsManager* DevToolsManager::GetInstance() {
+ return DevToolsManagerImpl::GetInstance();
+}
// static
DevToolsManagerImpl* DevToolsManagerImpl::GetInstance() {
@@ -20,32 +30,173 @@
}
DevToolsManagerImpl::DevToolsManagerImpl()
- : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()),
- client_count_(0) {
+ : delegate_(GetContentClient()->browser()->GetDevToolsManagerDelegate()) {
}
DevToolsManagerImpl::~DevToolsManagerImpl() {
- DCHECK(!client_count_);
-}
-
-void DevToolsManagerImpl::OnClientAttached() {
- if (!client_count_) {
+ DCHECK(agent_to_client_host_.empty());
+ DCHECK(client_to_agent_host_.empty());
+}
+
+void DevToolsManagerImpl::Inspect(BrowserContext* browser_context,
+ DevToolsAgentHost* agent_host) {
+ if (delegate_)
+ delegate_->Inspect(browser_context, agent_host);
+}
+
+DevToolsClientHost* DevToolsManagerImpl::GetDevToolsClientHostFor(
+ DevToolsAgentHostImpl* agent_host_impl) {
+ AgentToClientHostMap::iterator it =
+ agent_to_client_host_.find(agent_host_impl);
+ if (it != agent_to_client_host_.end())
+ return it->second;
+ return NULL;
+}
+
+DevToolsAgentHost* DevToolsManagerImpl::GetDevToolsAgentHostFor(
+ DevToolsClientHost* client_host) {
+ ClientToAgentHostMap::iterator it = client_to_agent_host_.find(client_host);
+ if (it != client_to_agent_host_.end())
+ return it->second.get();
+ return NULL;
+}
+
+void DevToolsManagerImpl::RegisterDevToolsClientHostFor(
+ DevToolsAgentHost* agent_host,
+ DevToolsClientHost* client_host) {
+ DevToolsAgentHostImpl* agent_host_impl =
+ static_cast<DevToolsAgentHostImpl*>(agent_host);
+ DevToolsClientHost* old_client_host =
+ GetDevToolsClientHostFor(agent_host_impl);
+ if (old_client_host) {
+ old_client_host->ReplacedWithAnotherClient();
+ UnregisterDevToolsClientHostFor(agent_host_impl);
+ }
+ BindClientHost(agent_host_impl, client_host);
+ agent_host_impl->Attach();
+}
+
+bool DevToolsManagerImpl::DispatchOnInspectorBackend(
+ DevToolsClientHost* from,
+ const std::string& message) {
+ DevToolsAgentHost* agent_host = GetDevToolsAgentHostFor(from);
+ if (!agent_host)
+ return false;
+ DevToolsAgentHostImpl* agent_host_impl =
+ static_cast<DevToolsAgentHostImpl*>(agent_host);
+ agent_host_impl->DispatchOnInspectorBackend(message);
+ return true;
+}
+
+void DevToolsManagerImpl::DispatchOnInspectorFrontend(
+ DevToolsAgentHost* agent_host,
+ const std::string& message) {
+ DevToolsAgentHostImpl* agent_host_impl =
+ static_cast<DevToolsAgentHostImpl*>(agent_host);
+ DevToolsClientHost* client_host = GetDevToolsClientHostFor(agent_host_impl);
+ if (!client_host) {
+ // Client window was closed while there were messages
+ // being sent to it.
+ return;
+ }
+ client_host->DispatchOnInspectorFrontend(message);
+}
+
+void DevToolsManagerImpl::ClientHostClosing(DevToolsClientHost* client_host) {
+ DevToolsAgentHost* agent_host = GetDevToolsAgentHostFor(client_host);
+ if (!agent_host)
+ return;
+ DevToolsAgentHostImpl* agent_host_impl =
+ static_cast<DevToolsAgentHostImpl*>(agent_host);
+ UnbindClientHost(agent_host_impl, client_host);
+}
+
+void DevToolsManagerImpl::AgentHostClosing(DevToolsAgentHostImpl* agent_host) {
+ UnregisterDevToolsClientHostFor(agent_host);
+}
+
+void DevToolsManagerImpl::UnregisterDevToolsClientHostFor(
+ DevToolsAgentHostImpl* agent_host_impl) {
+ DevToolsClientHost* client_host = GetDevToolsClientHostFor(agent_host_impl);
+ if (!client_host)
+ return;
+ UnbindClientHost(agent_host_impl, client_host);
+ client_host->InspectedContentsClosing();
+}
+
+void DevToolsManagerImpl::BindClientHost(
+ DevToolsAgentHostImpl* agent_host,
+ DevToolsClientHost* client_host) {
+ DCHECK(agent_to_client_host_.find(agent_host) ==
+ agent_to_client_host_.end());
+ DCHECK(client_to_agent_host_.find(client_host) ==
+ client_to_agent_host_.end());
+
+ if (client_to_agent_host_.empty()) {
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
base::Bind(&DevToolsNetLogObserver::Attach));
}
- client_count_++;
-}
-
-void DevToolsManagerImpl::OnClientDetached() {
- client_count_--;
- if (!client_count_) {
+ agent_to_client_host_[agent_host] = client_host;
+ client_to_agent_host_[client_host] = agent_host;
+ agent_host->set_close_listener(this);
+}
+
+void DevToolsManagerImpl::UnbindClientHost(DevToolsAgentHostImpl* agent_host,
+ DevToolsClientHost* client_host) {
+ DCHECK(agent_host);
+ scoped_refptr<DevToolsAgentHostImpl> protect(agent_host);
+ DCHECK(agent_to_client_host_.find(agent_host)->second ==
+ client_host);
+ DCHECK(client_to_agent_host_.find(client_host)->second.get() == agent_host);
+ agent_host->set_close_listener(NULL);
+
+ agent_to_client_host_.erase(agent_host);
+ client_to_agent_host_.erase(client_host);
+
+ if (client_to_agent_host_.empty()) {
BrowserThread::PostTask(
BrowserThread::IO,
FROM_HERE,
base::Bind(&DevToolsNetLogObserver::Detach));
}
+ // Lazy agent hosts can be deleted from within detach.
+ // Do not access agent_host below this line.
+ agent_host->Detach();
+}
+
+void DevToolsManagerImpl::CloseAllClientHosts() {
+ std::vector<DevToolsAgentHostImpl*> agents;
+ for (AgentToClientHostMap::iterator it =
+ agent_to_client_host_.begin();
+ it != agent_to_client_host_.end(); ++it) {
+ agents.push_back(it->first);
+ }
+ for (std::vector<DevToolsAgentHostImpl*>::iterator it = agents.begin();
+ it != agents.end(); ++it) {
+ UnregisterDevToolsClientHostFor(*it);
+ }
+}
+
+void DevToolsManagerImpl::AddAgentStateCallback(const Callback& callback) {
+ callbacks_.push_back(&callback);
+}
+
+void DevToolsManagerImpl::RemoveAgentStateCallback(const Callback& callback) {
+ CallbackContainer::iterator it =
+ std::find(callbacks_.begin(), callbacks_.end(), &callback);
+ DCHECK(it != callbacks_.end());
+ callbacks_.erase(it);
+}
+
+void DevToolsManagerImpl::NotifyObservers(DevToolsAgentHost* agent_host,
+ bool attached) {
+ CallbackContainer copy(callbacks_);
+ if (delegate_)
+ delegate_->DevToolsAgentStateChanged(agent_host, attached);
+ for (CallbackContainer::iterator it = copy.begin(); it != copy.end(); ++it)
+ (*it)->Run(agent_host, attached);
}
} // namespace content
« no previous file with comments | « content/browser/devtools/devtools_manager_impl.h ('k') | content/browser/devtools/devtools_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698