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, ¶ms); |
+ } |
+} |
+ |
DevToolsAdbBridge::RemoteBrowser::~RemoteBrowser() { |
} |