1 /* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "WebDevToolsFrontendImpl.h" 33 34 #include "BoundObject.h" 35 #include "ContextMenuController.h" 36 #include "ContextMenuItem.h" 37 #include "DOMWindow.h" 38 #include "Document.h" 39 #include "Event.h" 40 #include "Frame.h" 41 #include "InspectorController.h" 42 #include "InspectorFrontendClientImpl.h" 43 #include "InspectorFrontendHost.h" 44 #include "Node.h" 45 #include "Page.h" 46 #include "Pasteboard.h" 47 #include "PlatformString.h" 48 #include "SecurityOrigin.h" 49 #include "Settings.h" 50 #include "V8Binding.h" 51 #include "V8DOMWrapper.h" 52 #include "V8InspectorFrontendHost.h" 53 #include "V8MouseEvent.h" 54 #include "V8Node.h" 55 #include "V8Proxy.h" 56 #include "V8Utilities.h" 57 #include "WebDevToolsFrontendClient.h" 58 #include "WebFrameImpl.h" 59 #include "WebScriptSource.h" 60 #include "WebViewImpl.h" 61 #include <wtf/OwnPtr.h> 62 #include <wtf/Vector.h> 63 64 using namespace WebCore; 65 66 namespace WebKit { 67 68 static v8::Local<v8::String> ToV8String(const String& s) 69 { 70 if (s.isNull()) 71 return v8::Local<v8::String>(); 72 73 return v8::String::New(reinterpret_cast<const uint16_t*>(s.characters()), s.length()); 74 } 75 76 WebDevToolsFrontend* WebDevToolsFrontend::create( 77 WebView* view, 78 WebDevToolsFrontendClient* client, 79 const WebString& applicationLocale) 80 { 81 return new WebDevToolsFrontendImpl( 82 static_cast<WebViewImpl*>(view), 83 client, 84 applicationLocale); 85 } 86 87 WebDevToolsFrontendImpl::WebDevToolsFrontendImpl( 88 WebViewImpl* webViewImpl, 89 WebDevToolsFrontendClient* client, 90 const String& applicationLocale) 91 : m_webViewImpl(webViewImpl) 92 , m_client(client) 93 , m_applicationLocale(applicationLocale) 94 { 95 InspectorController* ic = m_webViewImpl->page()->inspectorController(); 96 ic->setInspectorFrontendClient(new InspectorFrontendClientImpl(m_webViewImpl->page(), m_client, this)); 97 98 // Put each DevTools frontend Page into its own (single page) group so that it's not 99 // deferred along with the inspected page. 100 m_webViewImpl->page()->setGroupName(String()); 101 } 102 103 WebDevToolsFrontendImpl::~WebDevToolsFrontendImpl() 104 { 105 } 106 107 void WebDevToolsFrontendImpl::dispatchOnInspectorFrontend(const WebString& message) 108 { 109 WebFrameImpl* frame = m_webViewImpl->mainFrameImpl(); 110 v8::HandleScope scope; 111 v8::Handle<v8::Context> frameContext = V8Proxy::context(frame->frame()); 112 v8::Context::Scope contextScope(frameContext); 113 v8::Handle<v8::Value> inspectorBackendValue = frameContext->Global()->Get(v8::String::New("InspectorBackend")); 114 if (!inspectorBackendValue->IsObject()) 115 return; 116 v8::Handle<v8::Object> inspectorBackend = v8::Handle<v8::Object>::Cast(inspectorBackendValue); 117 v8::Handle<v8::Value> dispatchFunction = inspectorBackend->Get(v8::String::New("dispatch")); 118 // The frame might have navigated away from the front-end page (which is still weird). 119 if (!dispatchFunction->IsFunction()) 120 return; 121 v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(dispatchFunction); 122 Vector< v8::Handle<v8::Value> > args; 123 args.append(ToV8String(message)); 124 v8::TryCatch tryCatch; 125 tryCatch.SetVerbose(true); 126 function->Call(inspectorBackend, args.size(), args.data()); 127 } 128 129 void WebDevToolsFrontendImpl::frontendLoaded() 130 { 131 m_client->sendFrontendLoaded(); 132 } 133 134 } // namespace WebKit 135