15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 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" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorCanvasAgent.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptProfiler.h" 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptValue.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCanvasElement.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/BindingVisitors.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScript.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScriptCanvasModule.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScriptManager.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorPageAgent.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h" 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h" 4493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "core/loader/DocumentLoader.h" 4576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h" 46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::TypeBuilder::Array; 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::TypeBuilder::Canvas::ResourceId; 50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::TypeBuilder::Canvas::ResourceState; 51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::TypeBuilder::Canvas::TraceLog; 52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::TypeBuilder::Canvas::TraceLogId; 53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::TypeBuilder::Page::FrameId; 54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using blink::TypeBuilder::Runtime::RemoteObject; 55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 56c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace CanvasAgentState { 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char canvasAgentEnabled[] = "canvasAgentEnabled"; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)InspectorCanvasAgent::InspectorCanvasAgent(InspectorPageAgent* pageAgent, InjectedScriptManager* injectedScriptManager) 6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) : InspectorBaseAgent<InspectorCanvasAgent>("Canvas") 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_pageAgent(pageAgent) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_injectedScriptManager(injectedScriptManager) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_frontend(0) 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_enabled(false) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorCanvasAgent::~InspectorCanvasAgent() 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void InspectorCanvasAgent::trace(Visitor* visitor) 76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_pageAgent); 78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) visitor->trace(m_injectedScriptManager); 79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) InspectorBaseAgent::trace(visitor); 80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 81c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCanvasAgent::setFrontend(InspectorFrontend* frontend) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(frontend); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend = frontend->canvas(); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCanvasAgent::clearFrontend() 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_frontend = 0; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) disable(0); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCanvasAgent::restore() 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_state->getBoolean(CanvasAgentState::canvasAgentEnabled)) { 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ErrorString error; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enable(&error); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCanvasAgent::enable(ErrorString*) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_enabled) 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_enabled = true; 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_state->setBoolean(CanvasAgentState::canvasAgentEnabled, m_enabled); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_instrumentingAgents->setInspectorCanvasAgent(this); 109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) findFramesWithUninstrumentedCanvases(); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorCanvasAgent::disable(ErrorString*) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_enabled = false; 115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_state->setBoolean(CanvasAgentState::canvasAgentEnabled, m_enabled); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_instrumentingAgents->setInspectorCanvasAgent(0); 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_framesWithUninstrumentedCanvases.clear(); 1185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_frontend) 1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_frontend->traceLogsRemoved(0, 0); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::dropTraceLog(ErrorString* errorString, const TraceLogId& traceLogId) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, traceLogId); 12510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) module.dropTraceLog(errorString, traceLogId); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::hasUninstrumentedCanvases(ErrorString* errorString, bool* result) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!checkIsEnabled(errorString)) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1330019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch for (FramesWithUninstrumentedCanvases::const_iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) { 134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (it->value) { 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *result = true; 136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *result = false; 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::captureFrame(ErrorString* errorString, const FrameId* frameId, TraceLogId* traceLogId) 143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 144d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = frameId ? m_pageAgent->assertFrame(errorString, *frameId) : m_pageAgent->mainFrame(); 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frame) 146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 147f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, ScriptState::forMainWorld(frame)); 14810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) module.captureFrame(errorString, traceLogId); 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::startCapturing(ErrorString* errorString, const FrameId* frameId, TraceLogId* traceLogId) 153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = frameId ? m_pageAgent->assertFrame(errorString, *frameId) : m_pageAgent->mainFrame(); 155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frame) 156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 157f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, ScriptState::forMainWorld(frame)); 15810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) module.startCapturing(errorString, traceLogId); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::stopCapturing(ErrorString* errorString, const TraceLogId& traceLogId) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, traceLogId); 16510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) module.stopCapturing(errorString, traceLogId); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::getTraceLog(ErrorString* errorString, const TraceLogId& traceLogId, const int* startOffset, const int* maxLength, RefPtr<TraceLog>& traceLog) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, traceLogId); 17210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) module.traceLog(errorString, traceLogId, startOffset, maxLength, &traceLog); 174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorCanvasAgent::replayTraceLog(ErrorString* errorString, const TraceLogId& traceLogId, int stepNo, RefPtr<ResourceState>& result, double* replayTime) 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, traceLogId); 17910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 1807757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch module.replayTraceLog(errorString, traceLogId, stepNo, &result, replayTime); 181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::getResourceState(ErrorString* errorString, const TraceLogId& traceLogId, const ResourceId& resourceId, RefPtr<ResourceState>& result) 184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, traceLogId); 18610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) module.resourceState(errorString, traceLogId, resourceId, &result); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 190591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorCanvasAgent::evaluateTraceLogCallArgument(ErrorString* errorString, const TraceLogId& traceLogId, int callIndex, int argumentIndex, const String* objectGroup, RefPtr<RemoteObject>& result, RefPtr<ResourceState>& resourceState) 191591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 192591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch InjectedScriptCanvasModule module = injectedScriptCanvasModule(errorString, traceLogId); 19310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 194591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch module.evaluateTraceLogCallArgument(errorString, traceLogId, callIndex, argumentIndex, objectGroup ? *objectGroup : String(), &result, &resourceState); 195591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 196591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 197d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ScriptValue InspectorCanvasAgent::wrapCanvas2DRenderingContextForInstrumentation(const ScriptValue& context) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ErrorString error; 200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = injectedScriptCanvasModule(&error, context); 20110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (module.isEmpty()) 202d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return ScriptValue(); 203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return notifyRenderingContextWasWrapped(module.wrapCanvas2DContext(context)); 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 206d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ScriptValue InspectorCanvasAgent::wrapWebGLRenderingContextForInstrumentation(const ScriptValue& glContext) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ErrorString error; 209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = injectedScriptCanvasModule(&error, glContext); 21010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (module.isEmpty()) 211d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return ScriptValue(); 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return notifyRenderingContextWasWrapped(module.wrapWebGLContext(glContext)); 213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 215d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ScriptValue InspectorCanvasAgent::notifyRenderingContextWasWrapped(const ScriptValue& wrappedContext) 216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT(m_frontend); 218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ScriptState* scriptState = wrappedContext.scriptState(); 21976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) LocalDOMWindow* domWindow = 0; 2205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (scriptState) 2215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) domWindow = scriptState->domWindow(); 222d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = domWindow ? domWindow->frame() : 0; 223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (frame && !m_framesWithUninstrumentedCanvases.contains(frame)) 224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_framesWithUninstrumentedCanvases.set(frame, false); 225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) String frameId = m_pageAgent->frameId(frame); 226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!frameId.isEmpty()) 227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_frontend->contextCreated(frameId); 228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return wrappedContext; 229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)InjectedScriptCanvasModule InspectorCanvasAgent::injectedScriptCanvasModule(ErrorString* errorString, ScriptState* scriptState) 232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!checkIsEnabled(errorString)) 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return InjectedScriptCanvasModule(); 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScriptCanvasModule module = InjectedScriptCanvasModule::moduleForState(m_injectedScriptManager, scriptState); 23610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (module.isEmpty()) { 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_NOT_REACHED(); 238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *errorString = "Internal error: no Canvas module"; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return module; 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 243d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)InjectedScriptCanvasModule InspectorCanvasAgent::injectedScriptCanvasModule(ErrorString* errorString, const ScriptValue& scriptValue) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!checkIsEnabled(errorString)) 246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return InjectedScriptCanvasModule(); 247d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) if (scriptValue.isEmpty()) { 248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_NOT_REACHED(); 249d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) *errorString = "Internal error: original ScriptValue has no value"; 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return InjectedScriptCanvasModule(); 251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 252d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return injectedScriptCanvasModule(errorString, scriptValue.scriptState()); 253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)InjectedScriptCanvasModule InspectorCanvasAgent::injectedScriptCanvasModule(ErrorString* errorString, const String& objectId) 256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!checkIsEnabled(errorString)) 258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return InjectedScriptCanvasModule(); 259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) InjectedScript injectedScript = m_injectedScriptManager->injectedScriptForObjectId(objectId); 26010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (injectedScript.isEmpty()) { 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *errorString = "Inspected frame has gone"; 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return InjectedScriptCanvasModule(); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return injectedScriptCanvasModule(errorString, injectedScript.scriptState()); 265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::findFramesWithUninstrumentedCanvases() 268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 26909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) class NodeVisitor FINAL : public WrappedNodeVisitor { 270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) public: 271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) NodeVisitor(Page* page, FramesWithUninstrumentedCanvases& result) 272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) : m_page(page) 273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_framesWithUninstrumentedCanvases(result) 274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void visitNode(Node* node) OVERRIDE 278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ASSERT(node); 280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!isHTMLCanvasElement(*node) || !node->document().frame()) 281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 28202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) LocalFrame* frame = node->document().frame(); 284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (frame->page() != m_page) 285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 287e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (toHTMLCanvasElement(node)->renderingContext()) 288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_framesWithUninstrumentedCanvases.set(frame, true); 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) private: 292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) Page* m_page; 293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FramesWithUninstrumentedCanvases& m_framesWithUninstrumentedCanvases; 294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } nodeVisitor(m_pageAgent->page(), m_framesWithUninstrumentedCanvases); 295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_framesWithUninstrumentedCanvases.clear(); 297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ScriptProfiler::visitNodeWrappers(&nodeVisitor); 298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (m_frontend) { 3000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch for (FramesWithUninstrumentedCanvases::const_iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) { 3015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) String frameId = m_pageAgent->frameId(it->key); 3025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!frameId.isEmpty()) 3035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) m_frontend->contextCreated(frameId); 3045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool InspectorCanvasAgent::checkIsEnabled(ErrorString* errorString) const 309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_enabled) 311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return true; 312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *errorString = "Canvas agent is not enabled"; 313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return false; 314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 316d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorCanvasAgent::didCommitLoad(LocalFrame*, DocumentLoader* loader) 317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_enabled) 319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 320f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) Frame* frame = loader->frame(); 321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (frame == m_pageAgent->mainFrame()) { 322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (FramesWithUninstrumentedCanvases::iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) 3230019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch it->value = false; 324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_frontend->traceLogsRemoved(0, 0); 325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) while (frame) { 327f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (frame->isLocalFrame()) { 328f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) LocalFrame* localFrame = toLocalFrame(frame); 329f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_framesWithUninstrumentedCanvases.contains(localFrame)) 330f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_framesWithUninstrumentedCanvases.set(localFrame, false); 331f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (m_pageAgent->hasIdForFrame(localFrame)) { 332f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) String frameId = m_pageAgent->frameId(localFrame); 333f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) m_frontend->traceLogsRemoved(&frameId, 0); 334f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) } 335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 336f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) frame = frame->tree().traverseNext(); 337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 341d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorCanvasAgent::frameDetachedFromParent(LocalFrame* frame) 342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (m_enabled) 344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_framesWithUninstrumentedCanvases.remove(frame); 345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorCanvasAgent::didBeginFrame() 348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!m_enabled) 350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ErrorString error; 3520019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch for (FramesWithUninstrumentedCanvases::const_iterator it = m_framesWithUninstrumentedCanvases.begin(); it != m_framesWithUninstrumentedCanvases.end(); ++it) { 353f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu InjectedScriptCanvasModule module = injectedScriptCanvasModule(&error, ScriptState::forMainWorld(it->key)); 35410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch if (!module.isEmpty()) 355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) module.markFrameEnd(); 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 359c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 361