| Index: chrome/browser/debugger/devtools_http_protocol_handler.cc | 
| diff --git a/chrome/browser/debugger/devtools_http_protocol_handler.cc b/chrome/browser/debugger/devtools_http_protocol_handler.cc | 
| index 910027ada019f9c10d8b0888f8c86c95e838b1f4..5d63cb1748579dad1c4a210c1c94d7118372218c 100644 | 
| --- a/chrome/browser/debugger/devtools_http_protocol_handler.cc | 
| +++ b/chrome/browser/debugger/devtools_http_protocol_handler.cc | 
| @@ -71,6 +71,17 @@ class DevToolsClientHostImpl : public DevToolsClientHost { | 
|  | 
| }  // namespace | 
|  | 
| + | 
| +// static | 
| +scoped_refptr<DevToolsHttpProtocolHandler> DevToolsHttpProtocolHandler::Start( | 
| +    int port, | 
| +    const std::string& frontend_url) { | 
| +  scoped_refptr<DevToolsHttpProtocolHandler> http_handler = | 
| +      new DevToolsHttpProtocolHandler(port, frontend_url); | 
| +  http_handler->Start(); | 
| +  return http_handler; | 
| +} | 
| + | 
| DevToolsHttpProtocolHandler::~DevToolsHttpProtocolHandler() { | 
| // Stop() must be called prior to this being called | 
| DCHECK(server_.get() == NULL); | 
| @@ -170,7 +181,22 @@ void DevToolsHttpProtocolHandler::OnClose(HttpListenSocket* socket) { | 
| void DevToolsHttpProtocolHandler::OnHttpRequestUI( | 
| HttpListenSocket* socket, | 
| const HttpServerRequestInfo& info) { | 
| -  std::string response = "<html><body>"; | 
| +  std::string response = "<html><body><script>" | 
| +      "function addTab(id, url, attached, frontendUrl) {" | 
| +      "    if (!attached) {" | 
| +      "        var a = document.createElement('a');" | 
| +      "        a.textContent = url;" | 
| +      "        a.href = frontendUrl + '?remotehost=' + window.location.host +" | 
| +      "            '&page=' + id;" | 
| +      "        document.body.appendChild(a);" | 
| +      "    } else {" | 
| +      "        var span = document.createElement('span');" | 
| +      "        span.textContent = url + ' (attached)';" | 
| +      "        document.body.appendChild(span);" | 
| +      "    }" | 
| +      "    document.body.appendChild(document.createElement('br'));" | 
| +      "}"; | 
| + | 
| for (BrowserList::const_iterator it = BrowserList::begin(), | 
| end = BrowserList::end(); it != end; ++it) { | 
| TabStripModel* model = (*it)->tabstrip_model(); | 
| @@ -187,21 +213,15 @@ void DevToolsHttpProtocolHandler::OnHttpRequestUI( | 
| DevToolsClientHost* client_host = DevToolsManager::GetInstance()-> | 
| GetDevToolsClientHostFor(tab_contents->tab_contents()-> | 
| render_view_host()); | 
| -      if (!client_host) { | 
| -        response += StringPrintf( | 
| -            "<a href='/devtools/devtools.html?page=%d'>%s (%s)</a><br>", | 
| -            controller.session_id().id(), | 
| -            UTF16ToUTF8(entry->title()).c_str(), | 
| -            entry->url().spec().c_str()); | 
| -      } else { | 
| -        response += StringPrintf( | 
| -            "%s (%s)<br>", | 
| -            UTF16ToUTF8(entry->title()).c_str(), | 
| -            entry->url().spec().c_str()); | 
| -      } | 
| +      response += StringPrintf( | 
| +          "addTab(%d, '%s', %s, '%s');\n", | 
| +          controller.session_id().id(), | 
| +          entry->url().spec().c_str(), | 
| +          client_host ? "true" : "false", | 
| +          overriden_frontend_url_.c_str()); | 
| } | 
| } | 
| -  response += "</body></html>"; | 
| +  response += "</script></body></html>"; | 
| Send200(socket, response, "text/html; charset=UTF-8"); | 
| } | 
|  | 
| @@ -340,9 +360,14 @@ void DevToolsHttpProtocolHandler::OnReadCompleted(net::URLRequest* request, | 
| RequestCompleted(request); | 
| } | 
|  | 
| -DevToolsHttpProtocolHandler::DevToolsHttpProtocolHandler(int port) | 
| +DevToolsHttpProtocolHandler::DevToolsHttpProtocolHandler( | 
| +    int port, | 
| +    const std::string& frontend_host) | 
| : port_(port), | 
| +      overriden_frontend_url_(frontend_host), | 
| server_(NULL) { | 
| +  if (overriden_frontend_url_.empty()) | 
| +      overriden_frontend_url_ = "/devtools/devtools.html"; | 
| } | 
|  | 
| void DevToolsHttpProtocolHandler::Init() { | 
| @@ -428,8 +453,9 @@ TabContents* DevToolsHttpProtocolHandler::GetTabContents(int session_id) { | 
| end = BrowserList::end(); it != end; ++it) { | 
| TabStripModel* model = (*it)->tabstrip_model(); | 
| for (int i = 0, size = model->count(); i < size; ++i) { | 
| +      TabContentsWrapper* tab_contents = model->GetTabContentsAt(i); | 
| NavigationController& controller = | 
| -          model->GetTabContentsAt(i)->controller(); | 
| +          tab_contents->controller(); | 
| if (controller.session_id().id() == session_id) | 
| return controller.tab_contents(); | 
| } | 
|  |