blob: fcac547d9913418e444f29c124ab335a46139cc8 (
plain)
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
 | // Copyright 2013 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_devtools_delegate.h"
#include "base/bind.h"
#include "base/stringprintf.h"
#include "content/public/browser/android/devtools_auth.h"
#include "content/public/browser/devtools_http_handler.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/url_constants.h"
#include "net/base/unix_domain_socket_posix.h"
#include "ui/base/resource/resource_bundle.h"
namespace {
const char kSocketNameFormat[] = "webview_devtools_remote_%d";
}
namespace android_webview {
AwDevToolsDelegate::AwDevToolsDelegate(content::BrowserContext* browser_context)
    : browser_context_(browser_context) {
  devtools_http_handler_ = content::DevToolsHttpHandler::Start(
      new net::UnixDomainSocketWithAbstractNamespaceFactory(
          StringPrintf(kSocketNameFormat, getpid()),
          base::Bind(&content::CanUserConnectToDevTools)),
      "",
      this);
}
AwDevToolsDelegate::~AwDevToolsDelegate() {
}
void AwDevToolsDelegate::Stop() {
  // The HTTP handler will delete our instance.
  devtools_http_handler_->Stop();
}
std::string AwDevToolsDelegate::GetDiscoveryPageHTML() {
  // This is a temporary way of providing the list of inspectable WebViews.
  // Since WebView doesn't have its own resources now, it doesn't seem
  // reasonable to create a dedicated .pak file just for this temporary page.
  const char html[] =
      "<html>"
      "<head>"
      "<title>WebView remote debugging</title>"
      "<style>"
      "</style>"
      "<script>"
      "function onLoad() {"
      "  var tabs_list_request = new XMLHttpRequest();"
      "  tabs_list_request.open("
      "\"GET\", \"/json/list?t=\" + new Date().getTime(), true);"
      "  tabs_list_request.onreadystatechange = onReady;"
      "  tabs_list_request.send();"
      "}"
      "function onReady() {"
      "  if(this.readyState == 4 && this.status == 200) {"
      "    if(this.response != null)"
      "      var responseJSON = JSON.parse(this.response);"
      "      for (var i = 0; i < responseJSON.length; ++i)"
      "        appendItem(responseJSON[i]);"
      "  }"
      "}"
      "function appendItem(item_object) {"
      "  var frontend_ref;"
      "  if (item_object.devtoolsFrontendUrl) {"
      "    frontend_ref = document.createElement(\"a\");"
      "    frontend_ref.href = item_object.devtoolsFrontendUrl;"
      "    frontend_ref.title = item_object.title;"
      "  } else {"
      "    frontend_ref = document.createElement(\"div\");"
      "    frontend_ref.title = "
      "\"The view already has active debugging session\";"
      "  }"
      "  var text = document.createElement(\"div\");"
      "  if (item_object.title)"
      "    text.innerText = item_object.title;"
      "  else"
      "    text.innerText = \"(untitled tab)\";"
      "  text.style.cssText = "
      "\"background-image:url(\" + item_object.faviconUrl + \")\";"
      "  frontend_ref.appendChild(text);"
      "  var item = document.createElement(\"p\");"
      "  item.appendChild(frontend_ref);"
      "  document.getElementById(\"items\").appendChild(item);"
      "}"
      "</script>"
      "</head>"
      "<body onload='onLoad()'>"
      "  <div id='caption'>Inspectable WebViews</div>"
      "  <div id='items'></div>"
      "</body>"
      "</html>";
  return html;
}
bool AwDevToolsDelegate::BundlesFrontendResources() {
  return true;
}
base::FilePath AwDevToolsDelegate::GetDebugFrontendDir() {
  return base::FilePath();
}
std::string AwDevToolsDelegate::GetPageThumbnailData(const GURL& url) {
  return "";
}
content::RenderViewHost* AwDevToolsDelegate::CreateNewTarget() {
  return NULL;
}
content::DevToolsHttpHandlerDelegate::TargetType
AwDevToolsDelegate::GetTargetType(content::RenderViewHost*) {
  return kTargetTypeTab;
}
}  // namespace android_webview
 |