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