blob: 96cab3f708f4ec4ff91f9fbbbaaa709768264032 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/browser/aw_dev_tools_discovery_provider.h"
#include "android_webview/browser/browser_view_renderer.h"
#include "base/json/json_writer.h"
#include "base/memory/ptr_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "components/devtools_discovery/basic_target_descriptor.h"
#include "components/devtools_discovery/devtools_discovery_manager.h"
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/web_contents.h"
using content::DevToolsAgentHost;
using content::WebContents;
namespace {
std::string GetViewDescription(WebContents* web_contents) {
android_webview::BrowserViewRenderer* bvr =
android_webview::BrowserViewRenderer::FromWebContents(web_contents);
if (!bvr) return "";
base::DictionaryValue description;
description.SetBoolean("attached", bvr->attached_to_window());
description.SetBoolean("visible", bvr->IsVisible());
gfx::Rect screen_rect = bvr->GetScreenRect();
description.SetInteger("screenX", screen_rect.x());
description.SetInteger("screenY", screen_rect.y());
description.SetBoolean("empty", screen_rect.size().IsEmpty());
if (!screen_rect.size().IsEmpty()) {
description.SetInteger("width", screen_rect.width());
description.SetInteger("height", screen_rect.height());
}
std::string json;
base::JSONWriter::Write(description, &json);
return json;
}
class TargetDescriptor : public devtools_discovery::BasicTargetDescriptor {
public:
explicit TargetDescriptor(scoped_refptr<DevToolsAgentHost> agent_host);
// devtools_discovery::BasicTargetDescriptor overrides.
std::string GetDescription() const override { return description_; }
private:
std::string description_;
DISALLOW_COPY_AND_ASSIGN(TargetDescriptor);
};
TargetDescriptor::TargetDescriptor(scoped_refptr<DevToolsAgentHost> agent_host)
: BasicTargetDescriptor(agent_host) {
if (WebContents* web_contents = agent_host->GetWebContents())
description_ = GetViewDescription(web_contents);
}
} // namespace
namespace android_webview {
// static
void AwDevToolsDiscoveryProvider::Install() {
devtools_discovery::DevToolsDiscoveryManager* discovery_manager =
devtools_discovery::DevToolsDiscoveryManager::GetInstance();
discovery_manager->AddProvider(
base::WrapUnique(new AwDevToolsDiscoveryProvider()));
}
AwDevToolsDiscoveryProvider::AwDevToolsDiscoveryProvider() {
}
AwDevToolsDiscoveryProvider::~AwDevToolsDiscoveryProvider() {
}
devtools_discovery::DevToolsTargetDescriptor::List
AwDevToolsDiscoveryProvider::GetDescriptors() {
DevToolsAgentHost::List agent_hosts = DevToolsAgentHost::GetOrCreateAll();
devtools_discovery::DevToolsTargetDescriptor::List result;
result.reserve(agent_hosts.size());
for (const auto& agent_host : agent_hosts)
result.push_back(new TargetDescriptor(agent_host));
return result;
}
} // namespace android_webview