void Console::profile(const String& title, ScriptCallStack* callStack) { Page* page = this->page(); if (!page) return; #if ENABLE(INSPECTOR) InspectorController* controller = page->inspectorController(); // FIXME: log a console message when profiling is disabled. if (!controller->profilerEnabled()) return; #endif String resolvedTitle = title; if (title.isNull()) // no title so give it the next user initiated profile title. #if ENABLE(INSPECTOR) resolvedTitle = controller->getCurrentUserInitiatedProfileName(true); #else resolvedTitle = ""; #endif ScriptProfiler::start(callStack->state(), resolvedTitle); #if ENABLE(INSPECTOR) const ScriptCallFrame& lastCaller = callStack->at(0); controller->addStartProfilingMessageToConsole(resolvedTitle, lastCaller.lineNumber(), lastCaller.sourceURL()); #endif }
bool WebDevToolsAgentImpl::handleInputEvent(WebCore::Page* page, const WebInputEvent& inputEvent) { if (!m_attached && !m_generatingEvent) return false; InspectorController* ic = inspectorController(); if (!ic) return false; if (WebInputEvent::isGestureEventType(inputEvent.type) && inputEvent.type == WebInputEvent::GestureTap) { // Only let GestureTab in (we only need it and we know PlatformGestureEventBuilder supports it). PlatformGestureEvent gestureEvent = PlatformGestureEventBuilder(page->mainFrame()->view(), *static_cast<const WebGestureEvent*>(&inputEvent)); return ic->handleGestureEvent(page->mainFrame(), gestureEvent); } if (WebInputEvent::isMouseEventType(inputEvent.type) && inputEvent.type != WebInputEvent::MouseEnter) { // PlatformMouseEventBuilder does not work with MouseEnter type, so we filter it out manually. PlatformMouseEvent mouseEvent = PlatformMouseEventBuilder(page->mainFrame()->view(), *static_cast<const WebMouseEvent*>(&inputEvent)); return ic->handleMouseEvent(page->mainFrame(), mouseEvent); } if (WebInputEvent::isTouchEventType(inputEvent.type)) { PlatformTouchEvent touchEvent = PlatformTouchEventBuilder(page->mainFrame()->view(), *static_cast<const WebTouchEvent*>(&inputEvent)); return ic->handleTouchEvent(page->mainFrame(), touchEvent); } if (WebInputEvent::isKeyboardEventType(inputEvent.type)) { PlatformKeyboardEvent keyboardEvent = PlatformKeyboardEventBuilder(*static_cast<const WebKeyboardEvent*>(&inputEvent)); return ic->handleKeyboardEvent(page->mainFrame(), keyboardEvent); } return false; }
static JSValueRef getResourceDocumentNode(JSContextRef ctx, JSObjectRef /*function*/, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* /*exception*/) { JSValueRef undefined = JSValueMakeUndefined(ctx); InspectorController* controller = reinterpret_cast<InspectorController*>(JSObjectGetPrivate(thisObject)); if (!argumentCount || argumentCount > 1 || !controller) return undefined; JSValueRef identifierValue = arguments[0]; if (!JSValueIsNumber(ctx, identifierValue)) return undefined; unsigned long identifier = static_cast<unsigned long>(JSValueToNumber(ctx, identifierValue, 0)); RefPtr<InspectorResource> resource = controller->resources().get(identifier); ASSERT(resource); if (!resource) return undefined; FrameLoader* frameLoader = resource->loader->frameLoader(); if (!frameLoader) return undefined; Document* document = frameLoader->frame()->document(); if (!document) return undefined; if (document->isPluginDocument() || document->isImageDocument()) return undefined; KJS::JSLock lock; JSValueRef documentValue = toRef(toJS(toJS(controller->scriptContext()), document)); return documentValue; }
void WebDevToolsAgentImpl::attach() { if (m_attached) return; m_debuggerAgentImpl.set( new DebuggerAgentImpl(m_webViewImpl, m_debuggerAgentDelegateStub.get(), this)); createInspectorFrontendProxy(); // Allow controller to send messages to the frontend. InspectorController* ic = inspectorController(); { // TODO(yurys): the source should have already been pushed by the frontend. v8::HandleScope scope; v8::Context::Scope contextScope(m_utilityContext); v8::Handle<v8::Value> constructorValue = m_utilityContext->Global()->Get( v8::String::New("injectedScriptConstructor")); if (constructorValue->IsFunction()) { String source = WebCore::toWebCoreString(constructorValue); ic->injectedScriptHost()->setInjectedScriptSource("(" + source + ")"); } } setInspectorFrontendProxyToInspectorController(); m_attached = true; }
PassRefPtr<ResourceHandle> ApplicationCacheGroup::createResourceHandle(const KURL& url, ApplicationCacheResource* newestCachedResource) { ResourceRequest request(url); m_frame->loader()->applyUserAgent(request); request.setHTTPHeaderField("Cache-Control", "max-age=0"); if (newestCachedResource) { const String& lastModified = newestCachedResource->response().httpHeaderField("Last-Modified"); const String& eTag = newestCachedResource->response().httpHeaderField("ETag"); if (!lastModified.isEmpty() || !eTag.isEmpty()) { if (!lastModified.isEmpty()) request.setHTTPHeaderField("If-Modified-Since", lastModified); if (!eTag.isEmpty()) request.setHTTPHeaderField("If-None-Match", eTag); } } RefPtr<ResourceHandle> handle = ResourceHandle::create(m_frame->loader()->networkingContext(), request, this, false, true); #if ENABLE(INSPECTOR) // Because willSendRequest only gets called during redirects, we initialize // the identifier and the first willSendRequest here. m_currentResourceIdentifier = m_frame->page()->progress()->createUniqueIdentifier(); if (Page* page = m_frame->page()) { InspectorController* inspectorController = page->inspectorController(); inspectorController->identifierForInitialRequest(m_currentResourceIdentifier, m_frame->loader()->documentLoader(), handle->firstRequest()); ResourceResponse redirectResponse = ResourceResponse(); inspectorController->willSendRequest(m_currentResourceIdentifier, request, redirectResponse); } #endif return handle; }
void Console::profileEnd(const JSC::UString& title, ScriptCallStack* callStack) { Page* page = this->page(); if (!page) return; if (!this->page()) return; #if ENABLE(INSPECTOR) InspectorController* controller = page->inspectorController(); if (!controller->profilerEnabled()) return; #endif RefPtr<JSC::Profile> profile = JSC::Profiler::profiler()->stopProfiling(callStack->state(), title); if (!profile) return; m_profiles.append(profile); #if ENABLE(INSPECTOR) const ScriptCallFrame& lastCaller = callStack->at(0); controller->addProfile(profile, lastCaller.lineNumber(), lastCaller.sourceURL()); #endif }
static JSValueRef inspectedWindow(JSContextRef ctx, JSObjectRef /*function*/, JSObjectRef thisObject, size_t /*argumentCount*/, const JSValueRef[] /*arguments[]*/, JSValueRef* /*exception*/) { InspectorController* controller = reinterpret_cast<InspectorController*>(JSObjectGetPrivate(thisObject)); if (!controller) return JSValueMakeUndefined(ctx); return toRef(KJS::Window::retrieve(controller->inspectedPage()->mainFrame())); }
void WebDevToolsAgentImpl::setTimelineProfilingEnabled(bool enabled) { InspectorController* ic = inspectorController(); if (enabled) ic->startTimelineProfiler(); else ic->stopTimelineProfiler(); }
void WebDevToolsAgentImpl::setJavaScriptProfilingEnabled(bool enabled) { InspectorController* ic = inspectorController(); if (enabled) ic->enableProfiler(); else ic->disableProfiler(); }
static JSValueRef detach(JSContextRef ctx, JSObjectRef /*function*/, JSObjectRef thisObject, size_t /*argumentCount*/, const JSValueRef[] /*arguments[]*/, JSValueRef* /*exception*/) { InspectorController* controller = reinterpret_cast<InspectorController*>(JSObjectGetPrivate(thisObject)); if (!controller) return JSValueMakeUndefined(ctx); controller->detachWindow(); return JSValueMakeUndefined(ctx); }
// WebPageOverlay void WebDevToolsAgentImpl::paintPageOverlay(WebCanvas* canvas) { InspectorController* ic = inspectorController(); if (ic) { GraphicsContext context(canvas); context.setCertainlyOpaque(false); ic->drawHighlight(context); } }
void WebDevToolsAgentImpl::detach() { blink::Platform::current()->currentThread()->removeTaskObserver(this); // Prevent controller from sending messages to the frontend. InspectorController* ic = inspectorController(); ic->disconnectFrontend(); m_attached = false; }
void WebDevToolsAgentImpl::detach() { // Prevent controller from sending messages to the frontend. InspectorController* ic = inspectorController(); ic->disconnectFrontend(); ic->hideHighlight(); ic->close(); m_attached = false; }
void WebDevToolsAgentImpl::flushPendingFrontendMessages() { InspectorController* ic = inspectorController(); ic->flushPendingFrontendMessages(); for (size_t i = 0; i < m_frontendMessageQueue.size(); ++i) m_client->sendMessageToInspectorFrontend(m_frontendMessageQueue[i]->toJSONString()); m_frontendMessageQueue.clear(); }
void WebDevToolsAgentImpl::setInspectorFrontendProxyToInspectorController() { v8::HandleScope scope; ScriptState* state = ScriptState::forContext( v8::Local<v8::Context>::New(m_utilityContext)); InspectorController* ic = inspectorController(); ic->setFrontend(new InspectorFrontend( ScriptObject(state, m_utilityContext->Global()))); }
void InspectorInstrumentation::didReceiveResourceResponseImpl(const InspectorInstrumentationCookie& cookie, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response) { InspectorController* ic = cookie.first; if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(ic)) resourceAgent->didReceiveResponse(identifier, loader, response); // FIXME(52282): move this to console agent. ic->didReceiveResponse(identifier, response); if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) timelineAgent->didReceiveResourceResponse(); }
bool WebDevToolsAgentImpl::handleInputEvent(WebCore::Page* page, const WebInputEvent& inputEvent) { if (!m_attached && !m_generatingEvent) return false; // FIXME: This workaround is required for touch emulation on Mac, where // compositor-side pinch handling is not enabled. See http://crbug.com/138003. bool isPinch = inputEvent.type == WebInputEvent::GesturePinchBegin || inputEvent.type == WebInputEvent::GesturePinchUpdate || inputEvent.type == WebInputEvent::GesturePinchEnd; if (isPinch && m_touchEventEmulationEnabled && m_emulateViewportEnabled) { FrameView* frameView = page->mainFrame()->view(); PlatformGestureEventBuilder gestureEvent(frameView, *static_cast<const WebGestureEvent*>(&inputEvent)); float pageScaleFactor = page->pageScaleFactor(); if (gestureEvent.type() == PlatformEvent::GesturePinchBegin) { m_lastPinchAnchorCss = adoptPtr(new WebCore::IntPoint(frameView->scrollPosition() + gestureEvent.position())); m_lastPinchAnchorDip = adoptPtr(new WebCore::IntPoint(gestureEvent.position())); m_lastPinchAnchorDip->scale(pageScaleFactor, pageScaleFactor); } if (gestureEvent.type() == PlatformEvent::GesturePinchUpdate && m_lastPinchAnchorCss) { float newPageScaleFactor = pageScaleFactor * gestureEvent.scale(); WebCore::IntPoint anchorCss(*m_lastPinchAnchorDip.get()); anchorCss.scale(1.f / newPageScaleFactor, 1.f / newPageScaleFactor); m_webViewImpl->setPageScaleFactor(newPageScaleFactor); m_webViewImpl->setMainFrameScrollOffset(*m_lastPinchAnchorCss.get() - toIntSize(anchorCss)); } if (gestureEvent.type() == PlatformEvent::GesturePinchEnd) { m_lastPinchAnchorCss.clear(); m_lastPinchAnchorDip.clear(); } return true; } InspectorController* ic = inspectorController(); if (!ic) return false; if (WebInputEvent::isGestureEventType(inputEvent.type) && inputEvent.type == WebInputEvent::GestureTap) { // Only let GestureTab in (we only need it and we know PlatformGestureEventBuilder supports it). PlatformGestureEvent gestureEvent = PlatformGestureEventBuilder(page->mainFrame()->view(), *static_cast<const WebGestureEvent*>(&inputEvent)); return ic->handleGestureEvent(page->mainFrame(), gestureEvent); } if (WebInputEvent::isMouseEventType(inputEvent.type) && inputEvent.type != WebInputEvent::MouseEnter) { // PlatformMouseEventBuilder does not work with MouseEnter type, so we filter it out manually. PlatformMouseEvent mouseEvent = PlatformMouseEventBuilder(page->mainFrame()->view(), *static_cast<const WebMouseEvent*>(&inputEvent)); return ic->handleMouseEvent(page->mainFrame(), mouseEvent); } if (WebInputEvent::isTouchEventType(inputEvent.type)) { PlatformTouchEvent touchEvent = PlatformTouchEventBuilder(page->mainFrame()->view(), *static_cast<const WebTouchEvent*>(&inputEvent)); return ic->handleTouchEvent(page->mainFrame(), touchEvent); } if (WebInputEvent::isKeyboardEventType(inputEvent.type)) { PlatformKeyboardEvent keyboardEvent = PlatformKeyboardEventBuilder(*static_cast<const WebKeyboardEvent*>(&inputEvent)); return ic->handleKeyboardEvent(page->mainFrame(), keyboardEvent); } return false; }
void InspectorServerRequestHandlerQt::webSocketReadyRead() { Q_ASSERT(m_tcpConnection); if (!m_tcpConnection->bytesAvailable()) return; QByteArray content = m_tcpConnection->read(m_tcpConnection->bytesAvailable()); m_data.append(content); while (m_data.size() > 0) { const bool isMasked = m_data[1] & 0x80; quint64 payloadLen = m_data[1] & 0x7F; int pos = 2; if (payloadLen == 126) { payloadLen = qFromBigEndian<quint16>(*reinterpret_cast<quint16*>(m_data.mid(pos, 2).data())); pos = 4; } else if (payloadLen == 127) { payloadLen = qFromBigEndian<quint64>(*reinterpret_cast<quint64*>(m_data.mid(pos, 8).data())); pos = 8; } QByteArray payload; if (isMasked) { QByteArray maskingKey = m_data.mid(pos, 4); pos += 4; payload = applyMask(m_data.mid(pos, payloadLen), maskingKey); } else payload = m_data.mid(pos, payloadLen); // Handle fragmentation if (!(m_data[0] & 0x80)) { // Non-last fragmented payload m_fragmentedPayload.append(payload); m_data = m_data.mid(pos + payloadLen); continue; } if (!(m_data[0] & 0x0F)) { // Last fragment m_fragmentedPayload.append(payload); payload = m_fragmentedPayload; m_fragmentedPayload.clear(); } // Remove this WebSocket message from m_data (payload, start-of-frame byte, end-of-frame byte). // Truncate data before delivering message in case of re-entrancy. m_data = m_data.mid(pos + payloadLen); #if ENABLE(INSPECTOR) if (m_inspectorClient) { InspectorController* inspectorController = m_inspectorClient->m_inspectedWebPage->page->inspectorController(); inspectorController->dispatchMessageFromFrontend(QString::fromUtf8(payload)); } #endif } }
void WebDevToolsAgentImpl::setRuntimeProperty(const WebString& name, const WebString& value) { if (name == kApuAgentFeatureName) setApuAgentEnabled(value == "true"); else if (name == kInspectorStateFeatureName) { InspectorController* ic = inspectorController(); ic->restoreInspectorStateFromCookie(value); } else if (name == kFrontendConnectedFeatureName && !inspectorController()->hasFrontend()) { inspectorController()->injectedScriptHost()->setInjectedScriptSource(value); connectFrontend(true); } }
void DumpRenderTreeSupportQt::setTimelineProfilingEnabled(QWebPage* page, bool enabled) { #if ENABLE(INSPECTOR) InspectorController* controller = page->handle()->page->inspectorController(); if (!controller) return; if (enabled) controller->startTimelineProfiler(); else controller->stopTimelineProfiler(); #endif }
static JSValueRef hideDOMNodeHighlight(JSContextRef context, JSObjectRef /*function*/, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* /*exception*/) { JSValueRef undefined = JSValueMakeUndefined(context); InspectorController* controller = reinterpret_cast<InspectorController*>(JSObjectGetPrivate(thisObject)); if (argumentCount || !controller) return undefined; controller->hideHighlight(); return undefined; }
void WebDevToolsAgentImpl::detach() { // Prevent controller from sending messages to the frontend. InspectorController* ic = m_webViewImpl->page()->inspectorController(); ic->disconnectFrontend(); ic->hideHighlight(); ic->close(); disposeUtilityContext(); m_debuggerAgentImpl.set(0); m_attached = false; m_apuAgentEnabled = false; }
void DumpRenderTreeSupportQt::setJavaScriptProfilingEnabled(QWebFrame* frame, bool enabled) { #if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR) Frame* coreFrame = QWebFramePrivate::core(frame); InspectorController* controller = coreFrame->page()->inspectorController(); if (!controller) return; if (enabled) controller->enableProfiler(); else controller->disableProfiler(); #endif }
QT_END_NAMESPACE void QWEBKIT_EXPORT qt_drt_setJavaScriptProfilingEnabled(QWebFrame* qframe, bool enabled) { Frame* frame = QWebFramePrivate::core(qframe); InspectorController* controller = frame->page()->inspectorController(); if (!controller) return; if (enabled) controller->enableProfiler(); else controller->disableProfiler(); }
void WebDevToolsAgentImpl::setRuntimeFeatureEnabled(const WebString& feature, bool enabled) { if (feature == kApuAgentFeatureName) setApuAgentEnabled(enabled); else if (feature == kTimelineFeatureName) setTimelineProfilingEnabled(enabled); else if (feature == kResourceTrackingFeatureName) { InspectorController* ic = m_webViewImpl->page()->inspectorController(); if (enabled) ic->enableResourceTracking(false /* not sticky */, false /* no reload */); else ic->disableResourceTracking(false /* not sticky */); } }
WebDevToolsFrontendImpl::WebDevToolsFrontendImpl( WebViewImpl* webViewImpl, WebDevToolsFrontendClient* client, const String& applicationLocale) : m_webViewImpl(webViewImpl) , m_client(client) , m_applicationLocale(applicationLocale) , m_loaded(false) { InspectorController* ic = m_webViewImpl->page()->inspectorController(); ic->setInspectorFrontendClient(new InspectorFrontendClientImpl(m_webViewImpl->page(), m_client, this)); // Put each DevTools frontend Page into its own (single page) group so that it's not // deferred along with the inspected page. m_webViewImpl->page()->setGroupName(String()); }
WebCore::InspectorFrontendChannel* InspectorClientQt::openInspectorFrontend(WebCore::InspectorController* inspectorController) { WebCore::InspectorFrontendChannel* frontendChannel = 0; #if ENABLE(INSPECTOR) QObject* view = 0; QWebPageAdapter* inspectorPage = 0; m_inspectedWebPage->createWebInspector(&view, &inspectorPage); OwnPtr<QObject> inspectorView = adoptPtr(view); QObject* inspector = m_inspectedWebPage->inspectorHandle(); // Remote frontend was attached. if (m_remoteFrontEndChannel) return 0; // This is a known hook that allows changing the default URL for the // Web inspector. This is used for SDK purposes. Please keep this hook // around and don't remove it. // https://bugs.webkit.org/show_bug.cgi?id=35340 QUrl inspectorUrl; #ifndef QT_NO_PROPERTIES inspectorUrl = inspector->property("_q_inspectorUrl").toUrl(); #endif if (!inspectorUrl.isValid()) inspectorUrl = QUrl(QLatin1String("qrc:/webkit/inspector/inspector.html")); #ifndef QT_NO_PROPERTIES QVariant inspectorJavaScriptWindowObjects = inspector->property("_q_inspectorJavaScriptWindowObjects"); if (inspectorJavaScriptWindowObjects.isValid()) inspectorPage->handle()->setProperty("_q_inspectorJavaScriptWindowObjects", inspectorJavaScriptWindowObjects); #endif inspectorPage->mainFrameAdapter()->load(QNetworkRequest(inspectorUrl)); m_inspectedWebPage->setInspectorFrontend(inspectorView.get()); // Is 'controller' the same object as 'inspectorController' (which appears to be unused)? InspectorController* controller = inspectorPage->page->inspectorController(); OwnPtr<InspectorFrontendClientQt> frontendClient = adoptPtr(new InspectorFrontendClientQt(m_inspectedWebPage, inspectorView.release(), inspectorPage->page, this)); m_frontendClient = frontendClient.get(); controller->setInspectorFrontendClient(frontendClient.release()); m_frontendWebPage = inspectorPage; // Web Inspector should not belong to any other page groups since it is a specialized debugger window. m_frontendWebPage->page->setGroupName("__WebInspectorPageGroup__"); frontendChannel = this; #endif return frontendChannel; }
void WebDevToolsAgentImpl::setApuAgentEnabled(bool enabled) { m_apuAgentEnabled = enabled; InspectorController* ic = inspectorController(); if (enabled) { if (!ic->hasFrontend()) connectFrontend(true); m_resourceTrackingWasEnabled = ic->resourceTrackingEnabled(); ic->startTimelineProfiler(); if (!m_resourceTrackingWasEnabled) { // TODO(knorton): Introduce some kind of agents dependency here so that // user could turn off resource tracking while apu agent is on. ic->setResourceTrackingEnabled(true); } m_debuggerAgentImpl->setAutoContinueOnException(true); } else { ic->stopTimelineProfiler(); if (!m_resourceTrackingWasEnabled) ic->setResourceTrackingEnabled(false); m_resourceTrackingWasEnabled = false; } m_client->runtimePropertyChanged( kApuAgentFeatureName, enabled ? String("true") : String("false")); }
void InspectorServerRequestHandlerQt::webSocketReadyRead() { Q_ASSERT(m_tcpConnection); if (!m_tcpConnection->bytesAvailable()) return; QByteArray content = m_tcpConnection->read(m_tcpConnection->bytesAvailable()); m_data.append(content); while (m_data.size() > 0) { // first byte in websocket frame should be 0 Q_ASSERT(!m_data[0]); // Start of WebSocket frame is indicated by 0 if (m_data[0]) { qCritical() << "webSocketReadyRead: unknown frame type" << m_data[0]; m_data.clear(); m_tcpConnection->close(); return; } // End of WebSocket frame indicated by 0xff. int pos = m_data.indexOf(0xff, 1); if (pos < 1) return; // After above checks, length will be >= 0. size_t length = pos - 1; if (length <= 0) return; QByteArray payload = m_data.mid(1, length); // Remove this WebSocket message from m_data (payload, start-of-frame byte, end-of-frame byte). // Truncate data before delivering message in case of re-entrancy. m_data = m_data.mid(length + 2); #if ENABLE(INSPECTOR) if (m_inspectorClient) { InspectorController* inspectorController = m_inspectorClient->m_inspectedWebPage->d->page->inspectorController(); inspectorController->dispatchMessageFromFrontend(QString::fromUtf8(payload)); } #endif } }
InspectorFrontendChannel* InspectorClientEfl::openInspectorFrontend(InspectorController*) { evas_object_smart_callback_call(m_inspectedView, "inspector,view,create", 0); Evas_Object* inspectorView = ewk_view_inspector_view_get(m_inspectedView); if (!inspectorView) return 0; m_inspectorView = inspectorView; String inspectorUri = inspectorFilesPath() + "/inspector.html"; ewk_view_uri_set(m_inspectorView, inspectorUri.utf8().data()); OwnPtr<InspectorFrontendClientEfl> frontendClient = adoptPtr(new InspectorFrontendClientEfl(m_inspectedView, m_inspectorView, this)); m_frontendClient = frontendClient.get(); InspectorController* controller = EWKPrivate::corePage(m_inspectorView)->inspectorController(); controller->setInspectorFrontendClient(frontendClient.release()); return this; }