15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "InspectorFrontendClientImpl.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "V8InspectorFrontendHost.h" 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebDevToolsFrontendClient.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "WebDevToolsFrontendImpl.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptController.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorFrontendHost.h" 401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Frame.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h" 425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebFloatPoint.h" 435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h" 44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h" 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore; 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorFrontendClientImpl::InspectorFrontendClientImpl(Page* frontendPage, WebDevToolsFrontendClient* client, WebDevToolsFrontendImpl* frontend) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_frontendPage(frontendPage) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_client(client) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorFrontendClientImpl::~InspectorFrontendClientImpl() 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_frontendHost) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontendHost->disconnectClient(); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client = 0; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorFrontendClientImpl::windowObjectCleared() 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 65a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) v8::Isolate* isolate = v8::Isolate::GetCurrent(); 66a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) v8::HandleScope handleScope(isolate); 67f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) v8::Handle<v8::Context> frameContext = m_frontendPage->mainFrame() ? m_frontendPage->mainFrame()->script().currentWorldContext() : v8::Local<v8::Context>(); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Context::Scope contextScope(frameContext); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_frontendHost) 715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_frontendHost->disconnectClient(); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontendHost = InspectorFrontendHost::create(this, m_frontendPage); 73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) v8::Handle<v8::Value> frontendHostObj = toV8(m_frontendHost.get(), v8::Handle<v8::Object>(), frameContext->GetIsolate()); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Object> global = frameContext->Global(); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 76a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) global->Set(v8::String::NewFromUtf8(isolate, "InspectorFrontendHost"), frontendHostObj); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 78f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ScriptController* scriptController = m_frontendPage->mainFrame() ? &m_frontendPage->mainFrame()->script() : 0; 798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (scriptController) { 808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) String installLegacyOverrides = 811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "" // Support for legacy front-ends (<M31). Do not add items here. 821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "(function(host, methodNames) {" 831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " var callId = 0;" 841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " function dispatch(methodName)" 851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " {" 868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " var argsArray = Array.prototype.slice.call(arguments, 1);" 871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " var message = {\"method\": methodName, \"id\": ++callId};" 888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " if (argsArray.length)" 898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " message.params = argsArray;" 908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " this.sendMessageToEmbedder(JSON.stringify(message));" 918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " };" 921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " methodNames.forEach(function(methodName) { host[methodName] = dispatch.bind(host, methodName); });" 938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) "})(InspectorFrontendHost," 941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " ['addFileSystem'," 951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " 'append'," 968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " 'bringToFront'," 971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " 'indexPath'," 981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " 'moveWindowBy'," 998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " 'openInNewTab'," 1001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " 'removeFileSystem'," 1018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " 'requestFileSystems'," 1021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " 'requestSetDockSide'," 1031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " 'save'," 1048abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) " 'searchInPath'," 1051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) " 'stopIndexing']);" 1061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "" 1071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "" // Support for legacy front-ends (<M28). Do not add items here. 1081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.canInspectWorkers = function() { return true; };" 1091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.canSaveAs = function() { return true; };" 1101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.canSave = function() { return true; };" 1111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.supportsFileSystems = function() { return true; };" 1121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.loaded = function() {};" 1131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.hiddenPanels = function() { return ""; };" 1141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.localizedStringsURL = function() { return ""; };" 1151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) "InspectorFrontendHost.close = function(url) { };"; 1161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) scriptController->executeScriptInMainWorld(installLegacyOverrides, ScriptController::ExecuteScriptWhenScriptsDisabled); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorFrontendClientImpl::inspectedURLChanged(const String& url) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontendPage->mainFrame()->document()->setTitle("Developer Tools - " + url); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorFrontendClientImpl::sendMessageToBackend(const String& message) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_client->sendMessageToBackend(message); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void InspectorFrontendClientImpl::sendMessageToEmbedder(const String& message) 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 1328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_client->sendMessageToEmbedder(message); 133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool InspectorFrontendClientImpl::isUnderTest() 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_client->isUnderTest(); 138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 14051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 141