Commit f30ed78e authored by pfeldman@chromium.org's avatar pfeldman@chromium.org

DevTools: allow inspecting browsers using custom front-ends.

Review URL: https://codereview.chromium.org/278953002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@271052 0039d316-1c4b-4281-b951-d872f2087c98
parent 71480169
...@@ -56,6 +56,7 @@ const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n"; ...@@ -56,6 +56,7 @@ const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n";
const char kNewPageRequestWithURL[] = "GET /json/new?%s HTTP/1.1\r\n\r\n"; const char kNewPageRequestWithURL[] = "GET /json/new?%s HTTP/1.1\r\n\r\n";
const char kActivatePageRequest[] = const char kActivatePageRequest[] =
"GET /json/activate/%s HTTP/1.1\r\n\r\n"; "GET /json/activate/%s HTTP/1.1\r\n\r\n";
const char kBrowserTargetSocket[] = "/devtools/browser";
const int kAdbPollingIntervalMs = 1000; const int kAdbPollingIntervalMs = 1000;
const char kUrlParam[] = "url"; const char kUrlParam[] = "url";
...@@ -1036,6 +1037,12 @@ void DevToolsAndroidBridge::RemoteBrowser::Open( ...@@ -1036,6 +1037,12 @@ void DevToolsAndroidBridge::RemoteBrowser::Open(
this, callback)); this, callback));
} }
scoped_refptr<content::DevToolsAgentHost>
DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() {
return AgentHostDelegate::GetOrCreateAgentHost(
"adb:" + serial_ + ":" + socket_, this, kBrowserTargetSocket);
}
void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread( void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread(
const DevToolsAndroidBridge::RemotePageCallback& callback, const DevToolsAndroidBridge::RemotePageCallback& callback,
int result, int result,
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "chrome/browser/devtools/device/android_device_manager.h" #include "chrome/browser/devtools/device/android_device_manager.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/devtools_agent_host.h"
#include "ui/gfx/size.h" #include "ui/gfx/size.h"
template<typename T> struct DefaultSingletonTraits; template<typename T> struct DefaultSingletonTraits;
...@@ -142,6 +143,8 @@ class DevToolsAndroidBridge ...@@ -142,6 +143,8 @@ class DevToolsAndroidBridge
void Open(const std::string& url, void Open(const std::string& url,
const RemotePageCallback& callback); const RemotePageCallback& callback);
scoped_refptr<content::DevToolsAgentHost> GetAgentHost();
scoped_refptr<AndroidWebSocket> CreateWebSocket( scoped_refptr<AndroidWebSocket> CreateWebSocket(
const std::string& url, const std::string& url,
DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate); DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate);
......
...@@ -77,7 +77,7 @@ class CancelableTimer { ...@@ -77,7 +77,7 @@ class CancelableTimer {
FROM_HERE, FROM_HERE,
base::Bind(&CancelableTimer::Fire, weak_factory_.GetWeakPtr()), base::Bind(&CancelableTimer::Fire, weak_factory_.GetWeakPtr()),
delay); delay);
}; }
private: private:
void Fire() { callback_.Run(); } void Fire() { callback_.Run(); }
...@@ -344,6 +344,9 @@ class AdbTargetsUIHandler ...@@ -344,6 +344,9 @@ class AdbTargetsUIHandler
const std::string& url, const std::string& url,
const DevToolsTargetsUIHandler::TargetCallback&) OVERRIDE; const DevToolsTargetsUIHandler::TargetCallback&) OVERRIDE;
virtual scoped_refptr<content::DevToolsAgentHost> GetBrowserAgentHost(
const std::string& browser_id) OVERRIDE;
private: private:
// DevToolsAndroidBridge::Listener overrides. // DevToolsAndroidBridge::Listener overrides.
virtual void DeviceListChanged( virtual void DeviceListChanged(
...@@ -388,6 +391,13 @@ void AdbTargetsUIHandler::Open( ...@@ -388,6 +391,13 @@ void AdbTargetsUIHandler::Open(
it->second->Open(url, base::Bind(&CallOnTarget, callback)); it->second->Open(url, base::Bind(&CallOnTarget, callback));
} }
scoped_refptr<content::DevToolsAgentHost>
AdbTargetsUIHandler::GetBrowserAgentHost(
const std::string& browser_id) {
RemoteBrowsers::iterator it = remote_browsers_.find(browser_id);
return it != remote_browsers_.end() ? it->second->GetAgentHost() : NULL;
}
void AdbTargetsUIHandler::DeviceListChanged( void AdbTargetsUIHandler::DeviceListChanged(
const DevToolsAndroidBridge::RemoteDevices& devices) { const DevToolsAndroidBridge::RemoteDevices& devices) {
remote_browsers_.clear(); remote_browsers_.clear();
...@@ -531,6 +541,11 @@ void DevToolsTargetsUIHandler::Open(const std::string& browser_id, ...@@ -531,6 +541,11 @@ void DevToolsTargetsUIHandler::Open(const std::string& browser_id,
callback.Run(NULL); callback.Run(NULL);
} }
scoped_refptr<content::DevToolsAgentHost>
DevToolsTargetsUIHandler::GetBrowserAgentHost(const std::string& browser_id) {
return NULL;
}
base::DictionaryValue* DevToolsTargetsUIHandler::Serialize( base::DictionaryValue* DevToolsTargetsUIHandler::Serialize(
const DevToolsTargetImpl& target) { const DevToolsTargetImpl& target) {
base::DictionaryValue* target_data = new base::DictionaryValue(); base::DictionaryValue* target_data = new base::DictionaryValue();
......
...@@ -45,6 +45,9 @@ class DevToolsTargetsUIHandler { ...@@ -45,6 +45,9 @@ class DevToolsTargetsUIHandler {
virtual void Open(const std::string& browser_id, const std::string& url, virtual void Open(const std::string& browser_id, const std::string& url,
const TargetCallback& callback); const TargetCallback& callback);
virtual scoped_refptr<content::DevToolsAgentHost> GetBrowserAgentHost(
const std::string& browser_id);
protected: protected:
base::DictionaryValue* Serialize(const DevToolsTargetImpl& target); base::DictionaryValue* Serialize(const DevToolsTargetImpl& target);
void SendSerializedTargets(scoped_ptr<base::ListValue> list); void SendSerializedTargets(scoped_ptr<base::ListValue> list);
......
...@@ -217,6 +217,10 @@ img { ...@@ -217,6 +217,10 @@ img {
text-decoration: underline; text-decoration: underline;
} }
.browser-header .action {
margin-left: 10px;
}
.list:not(.pages) .subrow { .list:not(.pages) .subrow {
min-height: 19px; min-height: 19px;
} }
......
...@@ -7,6 +7,20 @@ var MIN_VERSION_TARGET_ID = 26; ...@@ -7,6 +7,20 @@ var MIN_VERSION_TARGET_ID = 26;
var MIN_VERSION_NEW_TAB = 29; var MIN_VERSION_NEW_TAB = 29;
var MIN_VERSION_TAB_ACTIVATE = 30; var MIN_VERSION_TAB_ACTIVATE = 30;
var queryParamsObject = {};
(function() {
var queryParams = window.location.search;
if (!queryParams)
return;
var params = queryParams.substring(1).split('&');
for (var i = 0; i < params.length; ++i) {
var pair = params[i].split('=');
queryParamsObject[pair[0]] = pair[1];
}
})();
function sendCommand(command, args) { function sendCommand(command, args) {
chrome.send(command, Array.prototype.slice.call(arguments, 1)); chrome.send(command, Array.prototype.slice.call(arguments, 1));
} }
...@@ -267,6 +281,18 @@ function populateRemoteTargets(devices) { ...@@ -267,6 +281,18 @@ function populateRemoteTargets(devices) {
browserHeader.appendChild(newPage); browserHeader.appendChild(newPage);
} }
if (queryParamsObject['browser-inspector']) {
var link = document.createElement('span');
link.classList.add('action');
link.setAttribute('tabindex', 1);
link.textContent = 'inspect';
browserHeader.appendChild(link);
link.addEventListener(
'click',
sendCommand.bind(null, 'inspect-browser', browser.source,
browser.id, queryParamsObject['browser-inspector']), false);
}
pageList = document.createElement('div'); pageList = document.createElement('div');
pageList.className = 'list pages'; pageList.className = 'list pages';
browserSection.appendChild(pageList); browserSection.appendChild(pageList);
......
...@@ -8,17 +8,21 @@ ...@@ -8,17 +8,21 @@
#include "base/stl_util.h" #include "base/stl_util.h"
#include "chrome/browser/devtools/devtools_target_impl.h" #include "chrome/browser/devtools/devtools_target_impl.h"
#include "chrome/browser/devtools/devtools_targets_ui.h" #include "chrome/browser/devtools/devtools_targets_ui.h"
#include "chrome/browser/devtools/devtools_ui_bindings.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/singleton_tabs.h" #include "chrome/browser/ui/singleton_tabs.h"
#include "chrome/browser/ui/webui/theme_source.h" #include "chrome/browser/ui/webui/theme_source.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h" #include "chrome/common/url_constants.h"
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/devtools_manager.h"
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h" #include "content/public/browser/notification_source.h"
#include "content/public/browser/notification_types.h" #include "content/public/browser/notification_types.h"
#include "content/public/browser/user_metrics.h" #include "content/public/browser/user_metrics.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h"
#include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h" #include "content/public/browser/web_ui_data_source.h"
#include "content/public/browser/web_ui_message_handler.h" #include "content/public/browser/web_ui_message_handler.h"
...@@ -35,6 +39,7 @@ const char kActivateCommand[] = "activate"; ...@@ -35,6 +39,7 @@ const char kActivateCommand[] = "activate";
const char kCloseCommand[] = "close"; const char kCloseCommand[] = "close";
const char kReloadCommand[] = "reload"; const char kReloadCommand[] = "reload";
const char kOpenCommand[] = "open"; const char kOpenCommand[] = "open";
const char kInspectBrowser[] = "inspect-browser";
const char kDiscoverUsbDevicesEnabledCommand[] = const char kDiscoverUsbDevicesEnabledCommand[] =
"set-discover-usb-devices-enabled"; "set-discover-usb-devices-enabled";
...@@ -61,6 +66,7 @@ class InspectMessageHandler : public WebUIMessageHandler { ...@@ -61,6 +66,7 @@ class InspectMessageHandler : public WebUIMessageHandler {
void HandleCloseCommand(const base::ListValue* args); void HandleCloseCommand(const base::ListValue* args);
void HandleReloadCommand(const base::ListValue* args); void HandleReloadCommand(const base::ListValue* args);
void HandleOpenCommand(const base::ListValue* args); void HandleOpenCommand(const base::ListValue* args);
void HandleInspectBrowserCommand(const base::ListValue* args);
void HandleBooleanPrefChanged(const char* pref_name, void HandleBooleanPrefChanged(const char* pref_name,
const base::ListValue* args); const base::ListValue* args);
void HandlePortForwardingConfigCommand(const base::ListValue* args); void HandlePortForwardingConfigCommand(const base::ListValue* args);
...@@ -100,6 +106,9 @@ void InspectMessageHandler::RegisterMessages() { ...@@ -100,6 +106,9 @@ void InspectMessageHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(kOpenCommand, web_ui()->RegisterMessageCallback(kOpenCommand,
base::Bind(&InspectMessageHandler::HandleOpenCommand, base::Bind(&InspectMessageHandler::HandleOpenCommand,
base::Unretained(this))); base::Unretained(this)));
web_ui()->RegisterMessageCallback(kInspectBrowser,
base::Bind(&InspectMessageHandler::HandleInspectBrowserCommand,
base::Unretained(this)));
} }
void InspectMessageHandler::HandleInitUICommand(const base::ListValue*) { void InspectMessageHandler::HandleInitUICommand(const base::ListValue*) {
...@@ -152,6 +161,17 @@ void InspectMessageHandler::HandleOpenCommand(const base::ListValue* args) { ...@@ -152,6 +161,17 @@ void InspectMessageHandler::HandleOpenCommand(const base::ListValue* args) {
inspect_ui_->Open(source_id, browser_id, url); inspect_ui_->Open(source_id, browser_id, url);
} }
void InspectMessageHandler::HandleInspectBrowserCommand(
const base::ListValue* args) {
std::string source_id;
std::string browser_id;
std::string front_end;
if (ParseStringArgs(args, &source_id, &browser_id, &front_end)) {
inspect_ui_->InspectBrowserWithCustomFrontend(
source_id, browser_id, GURL(front_end));
}
}
void InspectMessageHandler::HandleBooleanPrefChanged( void InspectMessageHandler::HandleBooleanPrefChanged(
const char* pref_name, const char* pref_name,
const base::ListValue* args) { const base::ListValue* args) {
...@@ -238,6 +258,44 @@ void InspectUI::Open(const std::string& source_id, ...@@ -238,6 +258,44 @@ void InspectUI::Open(const std::string& source_id,
handler->Open(browser_id, url, base::Bind(&NoOp)); handler->Open(browser_id, url, base::Bind(&NoOp));
} }
void InspectUI::InspectBrowserWithCustomFrontend(
const std::string& source_id,
const std::string& browser_id,
const GURL& frontend_url) {
DevToolsTargetsUIHandler* handler = FindTargetHandler(source_id);
if (!handler)
return;
// Fetch agent host from remote browser.
scoped_refptr<content::DevToolsAgentHost> agent_host =
handler->GetBrowserAgentHost(browser_id);
if (agent_host->IsAttached())
return;
// Create web contents for the front-end.
WebContents* inspect_ui = web_ui()->GetWebContents();
WebContents* front_end = inspect_ui->GetDelegate()->OpenURLFromTab(
inspect_ui,
content::OpenURLParams(GURL(content::kAboutBlankURL),
content::Referrer(),
NEW_FOREGROUND_TAB,
content::PAGE_TRANSITION_AUTO_TOPLEVEL,
false));
// Install devtools bindings.
DevToolsUIBindings* bindings = DevToolsUIBindings::GetOrCreateFor(front_end);
// Navigate to a page.
front_end->GetController().LoadURL(
frontend_url, content::Referrer(),
content::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string());
// Engage remote debugging between front-end and agent host.
content::DevToolsManager::GetInstance()->RegisterDevToolsClientHostFor(
agent_host, bindings->frontend_host());
}
void InspectUI::InspectDevices(Browser* browser) { void InspectUI::InspectDevices(Browser* browser) {
content::RecordAction(base::UserMetricsAction("InspectDevices")); content::RecordAction(base::UserMetricsAction("InspectDevices"));
chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams( chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams(
......
...@@ -39,6 +39,10 @@ class InspectUI : public content::WebUIController, ...@@ -39,6 +39,10 @@ class InspectUI : public content::WebUIController,
void Open(const std::string& source_id, void Open(const std::string& source_id,
const std::string& browser_id, const std::string& browser_id,
const std::string& url); const std::string& url);
void InspectBrowserWithCustomFrontend(
const std::string& source_id,
const std::string& browser_id,
const GURL& frontend_url);
static void InspectDevices(Browser* browser); static void InspectDevices(Browser* browser);
......
...@@ -44,7 +44,6 @@ void DevToolsBrowserTarget::RegisterDomainHandler( ...@@ -44,7 +44,6 @@ void DevToolsBrowserTarget::RegisterDomainHandler(
void DevToolsBrowserTarget::HandleMessage(const std::string& data) { void DevToolsBrowserTarget::HandleMessage(const std::string& data) {
DCHECK_EQ(message_loop_proxy_, base::MessageLoopProxy::current()); DCHECK_EQ(message_loop_proxy_, base::MessageLoopProxy::current());
std::string error_response; std::string error_response;
scoped_refptr<DevToolsProtocol::Command> command = scoped_refptr<DevToolsProtocol::Command> command =
DevToolsProtocol::ParseCommand(data, &error_response); DevToolsProtocol::ParseCommand(data, &error_response);
......
...@@ -171,7 +171,7 @@ DevToolsTracingHandler::OnStart( ...@@ -171,7 +171,7 @@ DevToolsTracingHandler::OnStart(
TracingController::GetInstance()->EnableRecording( TracingController::GetInstance()->EnableRecording(
categories, options, TracingController::EnableRecordingDoneCallback()); categories, options, TracingController::EnableRecordingDoneCallback());
return NULL; return command->SuccessResponse(NULL);
} }
void DevToolsTracingHandler::OnBufferUsage(float usage) { void DevToolsTracingHandler::OnBufferUsage(float usage) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment