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

Unified Diff: chrome/browser/devtools/devtools_adb_bridge.cc

Issue 22277007: chrome://inspect: Add "open", "close" and "reload" actions to Devices tab (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 7 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
« no previous file with comments | « chrome/browser/devtools/devtools_adb_bridge.h ('k') | chrome/browser/resources/inspect/inspect.css » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/devtools/devtools_adb_bridge.cc
diff --git a/chrome/browser/devtools/devtools_adb_bridge.cc b/chrome/browser/devtools/devtools_adb_bridge.cc
index 3b9dd6a4d746fa3fc9ab50142459e966d33a42fe..2973fa266f732573079e73e283980ce3c66854ec 100644
--- a/chrome/browser/devtools/devtools_adb_bridge.cc
+++ b/chrome/browser/devtools/devtools_adb_bridge.cc
@@ -24,6 +24,7 @@
#include "chrome/browser/devtools/adb/android_rsa.h"
#include "chrome/browser/devtools/adb_client_socket.h"
#include "chrome/browser/devtools/adb_web_socket.h"
+#include "chrome/browser/devtools/devtools_protocol.h"
#include "chrome/browser/devtools/devtools_window.h"
#include "chrome/browser/devtools/tethering_adb_filter.h"
#include "chrome/browser/profiles/profile.h"
@@ -51,10 +52,16 @@ static const char kOpenedUnixSocketsCommand[] = "shell:cat /proc/net/unix";
static const char kPageListRequest[] = "GET /json HTTP/1.1\r\n\r\n";
static const char kVersionRequest[] = "GET /json/version HTTP/1.1\r\n\r\n";
+static const char kClosePageRequest[] = "GET /json/close/%s HTTP/1.1\r\n\r\n";
+static const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n";
const int kAdbPort = 5037;
const int kBufferSize = 16 * 1024;
const int kAdbPollingIntervalMs = 1000;
+static const char kUrlParam[] = "url";
+static const char kPageReloadCommand[] = "Page.reload";
+static const char kPageNavigateCommand[] = "Page.navigate";
+
typedef DevToolsAdbBridge::Callback Callback;
typedef std::vector<scoped_refptr<DevToolsAdbBridge::AndroidDevice> >
AndroidDevices;
@@ -382,6 +389,57 @@ class AdbPagesCommand : public base::RefCountedThreadSafe<
scoped_ptr<DevToolsAdbBridge::RemoteDevices> remote_devices_;
};
+// AdbProtocolCommand ---------------------------------------------------------
+
+class AdbProtocolCommand : public AdbWebSocket::Delegate {
+ public:
+ AdbProtocolCommand(
+ scoped_refptr<DevToolsAdbBridge> bridge_,
+ scoped_refptr<DevToolsAdbBridge::AndroidDevice> device,
+ const std::string& socket_name,
+ const std::string& debug_url,
+ const std::string& command);
+
+ private:
+ virtual void OnSocketOpened() OVERRIDE;
+ virtual void OnFrameRead(const std::string& message) OVERRIDE;
+ virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
+ virtual bool ProcessIncomingMessage(const std::string& message) OVERRIDE;
+
+ scoped_refptr<DevToolsAdbBridge> bridge_;
+ const std::string command_;
+ scoped_refptr<AdbWebSocket> web_socket_;
+
+ DISALLOW_COPY_AND_ASSIGN(AdbProtocolCommand);
+};
+
+AdbProtocolCommand::AdbProtocolCommand(
+ scoped_refptr<DevToolsAdbBridge> bridge,
+ scoped_refptr<DevToolsAdbBridge::AndroidDevice> device,
+ const std::string& socket_name,
+ const std::string& debug_url,
+ const std::string& command)
+ : bridge_(bridge),
+ command_(command) {
+ web_socket_ = new AdbWebSocket(
+ device, socket_name, debug_url, bridge_->GetAdbMessageLoop(), this);
+}
+
+void AdbProtocolCommand::OnSocketOpened() {
+ web_socket_->SendFrame(command_);
+ web_socket_->Disconnect();
+}
+
+void AdbProtocolCommand::OnFrameRead(const std::string& message) {}
+
+void AdbProtocolCommand::OnSocketClosed(bool closed_by_device) {
+ delete this;
+}
+
+bool AdbProtocolCommand::ProcessIncomingMessage(const std::string& message) {
+ return false;
+}
+
} // namespace
const char kDevToolsChannelNameFormat[] = "%s_devtools_remote";
@@ -443,7 +501,7 @@ void DevToolsAdbBridge::AndroidDevice::HttpQuery(
request, callback));
}
-void DevToolsAdbBridge::AndroidDevice::HttpQuery(
+void DevToolsAdbBridge::AndroidDevice::HttpUpgrade(
const std::string& la_name,
const std::string& request,
const SocketCallback& callback) {
@@ -581,23 +639,48 @@ DevToolsAdbBridge::RemotePage::RemotePage(
frontend_url_ = frontend_url_.substr(0, ws_param);
if (frontend_url_.find("http:") == 0)
frontend_url_ = "https:" + frontend_url_.substr(5);
-
- global_id_ = base::StringPrintf(
- "%s:%s:%s", device->serial().c_str(), socket_.c_str(), id_.c_str());
}
void DevToolsAdbBridge::RemotePage::Inspect(Profile* profile) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ std::string agent_id = base::StringPrintf("%s:%s:%s",
+ device_->serial().c_str(), socket_.c_str(), id_.c_str());
AgentHostDelegates::iterator it =
- g_host_delegates.Get().find(global_id());
+ g_host_delegates.Get().find(agent_id);
if (it != g_host_delegates.Get().end())
it->second->OpenFrontend();
else if (!debug_url_.empty())
new AgentHostDelegate(
- global_id_, device_, socket_, debug_url_,
+ agent_id, device_, socket_, debug_url_,
frontend_url_, bridge_->GetAdbMessageLoop(), profile);
}
+static void Noop(int, const std::string&) {}
+
+void DevToolsAdbBridge::RemotePage::Close() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ if (attached())
+ return;
+ std::string request = base::StringPrintf(kClosePageRequest, id_.c_str());
+ bridge_->GetAdbMessageLoop()->PostTask(FROM_HERE,
+ base::Bind(&AndroidDevice::HttpQuery,
+ device_, socket_, request, base::Bind(&Noop)));
+}
+
+void DevToolsAdbBridge::RemotePage::Reload() {
+ SendProtocolCommand(kPageReloadCommand, NULL);
+}
+
+void DevToolsAdbBridge::RemotePage::SendProtocolCommand(
+ const std::string& method,
+ base::DictionaryValue* params) {
+ if (attached())
+ return;
+ DevToolsProtocol::Command command(1, method, params);
+ new AdbProtocolCommand(
+ bridge_, device_, socket_, debug_url_, command.Serialize());
+}
+
DevToolsAdbBridge::RemotePage::~RemotePage() {
}
@@ -612,6 +695,35 @@ DevToolsAdbBridge::RemoteBrowser::RemoteBrowser(
name_(name) {
}
+void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) {
+ bridge_->GetAdbMessageLoop()->PostTask(FROM_HERE,
+ base::Bind(&AndroidDevice::HttpQuery,
+ device_, socket_, kNewPageRequest,
+ base::Bind(&RemoteBrowser::PageCreatedOnHandlerThread, this, url)));
+}
+
+void DevToolsAdbBridge::RemoteBrowser::PageCreatedOnHandlerThread(
+ const std::string& url, int result, const std::string& response) {
+ if (result < 0)
+ return;
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&RemoteBrowser::PageCreatedOnUIThread, this, response, url));
+}
+
+void DevToolsAdbBridge::RemoteBrowser::PageCreatedOnUIThread(
+ const std::string& response, const std::string& url) {
+ scoped_ptr<base::Value> value(base::JSONReader::Read(response));
+ base::DictionaryValue* dict;
+ if (value && value->GetAsDictionary(&dict)) {
+ scoped_refptr<RemotePage> new_page =
+ new RemotePage(bridge_, device_, socket_, *dict);
+ base::DictionaryValue params;
+ params.SetString(kUrlParam, url);
+ new_page->SendProtocolCommand(kPageNavigateCommand, &params);
+ }
+}
+
DevToolsAdbBridge::RemoteBrowser::~RemoteBrowser() {
}
« no previous file with comments | « chrome/browser/devtools/devtools_adb_bridge.h ('k') | chrome/browser/resources/inspect/inspect.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698