void WebDevToolsAgentImpl::connectFrontend(bool afterNavigation) { if (afterNavigation) inspectorController()->reuseFrontend(); else inspectorController()->connectFrontend(); // We know that by this time injected script has already been pushed to the backend. m_client->runtimePropertyChanged(kFrontendConnectedFeatureName, inspectorController()->injectedScriptHost()->injectedScriptSource()); }
void WebDevToolsAgentImpl::attach() { if (m_attached) return; inspectorController()->connectFrontend(this); inspectorController()->webViewResized(m_webViewImpl->size()); blink::Platform::current()->currentThread()->addTaskObserver(this); m_attached = true; }
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 WebDevToolsAgentImpl::didProcessTask() { if (InspectorController* ic = inspectorController()) ic->didProcessTask(); if (m_attached) flush(); }
WebDevToolsAgentImpl::WebDevToolsAgentImpl( WebViewImpl* webViewImpl, WebDevToolsAgentClient* client) : m_debuggerId(client->debuggerId()) , m_layerTreeId(0) , m_client(client) , m_webViewImpl(webViewImpl) , m_attached(false) , m_generatingEvent(false) , m_webViewDidLayoutOnceAfterLoad(false) , m_deviceMetricsEnabled(false) , m_emulateMobileEnabled(false) , m_originalViewportEnabled(false) , m_isOverlayScrollbarsEnabled(false) , m_originalMinimumPageScaleFactor(0) , m_originalMaximumPageScaleFactor(0) , m_pageScaleLimitsOverriden(false) , m_touchEventEmulationEnabled(false) { long processId = client->processId(); ASSERT(processId > 0); inspectorController()->setProcessId(processId); ASSERT(m_debuggerId > 0); ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); }
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 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; }
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; }
void WebDevToolsAgentImpl::willSendRequest(unsigned long resourceId, WebURLRequest& request) { if (InspectorController* ic = inspectorController()) { ic->willSendRequest(resourceId, request.toMutableResourceRequest(), ResourceResponse()); if (ic->hasFrontend() && request.reportLoadTiming()) request.setReportRawHeaders(true); } }
void WebDevToolsAgentImpl::setJavaScriptProfilingEnabled(bool enabled) { InspectorController* ic = inspectorController(); if (enabled) ic->enableProfiler(); else ic->disableProfiler(); }
void WebDevToolsAgentImpl::setTimelineProfilingEnabled(bool enabled) { InspectorController* ic = inspectorController(); if (enabled) ic->startTimelineProfiler(); else ic->stopTimelineProfiler(); }
void WebDevToolsAgentImpl::willProcessTask() { if (!m_attached) return; if (InspectorController* ic = inspectorController()) ic->willProcessTask(); TRACE_EVENT_BEGIN0(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Program"); }
// WebPageOverlay void WebDevToolsAgentImpl::paintPageOverlay(WebCanvas* canvas) { InspectorController* ic = inspectorController(); if (ic) { GraphicsContext context(canvas); context.setCertainlyOpaque(false); ic->drawHighlight(context); } }
void WebDevToolsAgentImpl::attach(const WebString& hostId) { if (m_attached) return; inspectorController()->connectFrontend(hostId, this); blink::Platform::current()->currentThread()->addTaskObserver(this); m_attached = true; }
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::reattach(const WebString& savedState) { if (m_attached) return; inspectorController()->reuseFrontend(this, savedState); blink::Platform::current()->currentThread()->addTaskObserver(this); m_attached = true; }
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 WebDevToolsAgentImpl::reattach(const WebString& savedState) { if (m_attached) return; ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); inspectorController()->restoreInspectorStateFromCookie(savedState); m_attached = true; }
void WebDevToolsAgentImpl::dispatchOnInjectedScript(int callId, int injectedScriptId, const String& functionName, const String& jsonArgs, bool async) { inspectorController()->inspectorBackend()->dispatchOnInjectedScript( callId, injectedScriptId, functionName, jsonArgs, async); }
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::reattach(const WebString& savedState) { if (m_attached) return; ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); inspectorController()->reconnectFrontend(this, savedState); m_attached = true; }
void WebDevToolsAgentImpl::attach() { if (m_attached) return; ClientMessageLoopAdapter::ensureClientMessageLoopCreated(m_client); inspectorController()->connectFrontend(this); m_attached = true; }
void WebDevToolsAgentImpl::didProcessTask() { if (!m_attached) return; if (InspectorController* ic = inspectorController()) ic->didProcessTask(); TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "Program"); flushPendingFrontendMessages(); }
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; }
//------- WebKit/plugin resource load notifications --------------- void WebDevToolsAgentImpl::identifierForInitialRequest( unsigned long resourceId, WebFrame* frame, const WebURLRequest& request) { if (InspectorController* ic = inspectorController()) { WebFrameImpl* webFrameImpl = static_cast<WebFrameImpl*>(frame); FrameLoader* frameLoader = webFrameImpl->frame()->loader(); DocumentLoader* loader = frameLoader->activeDocumentLoader(); ic->identifierForInitialRequest(resourceId, loader, request.toResourceRequest()); } }
void WebDevToolsAgentImpl::evaluateInWebInspector(long callId, const WebString& script) { InspectorController* ic = inspectorController(); ic->evaluateForTestInFrontend(callId, script); }
void WebDevToolsAgentImpl::didFailLoading(unsigned long resourceId, const WebURLError& error) { ResourceError resourceError; if (InspectorController* ic = inspectorController()) ic->didFailLoading(resourceId, resourceError); }
void WebDevToolsAgentImpl::didFinishLoading(unsigned long resourceId) { if (InspectorController* ic = inspectorController()) ic->didFinishLoading(resourceId); }
void WebDevToolsAgentImpl::didReceiveResponse(unsigned long resourceId, const WebURLResponse& response) { if (InspectorController* ic = inspectorController()) ic->didReceiveResponse(resourceId, response.toResourceResponse()); }