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/InjectedScriptCanvasModule.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "InjectedScriptCanvasModuleSource.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptFunctionCall.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptObject.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using WebCore::TypeBuilder::Array;
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using WebCore::TypeBuilder::Canvas::ResourceId;
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using WebCore::TypeBuilder::Canvas::ResourceState;
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using WebCore::TypeBuilder::Canvas::TraceLog;
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)using WebCore::TypeBuilder::Canvas::TraceLogId;
43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochusing WebCore::TypeBuilder::Runtime::RemoteObject;
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InjectedScriptCanvasModule::InjectedScriptCanvasModule()
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : InjectedScriptModule("InjectedScriptCanvasModule")
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InjectedScriptCanvasModule InjectedScriptCanvasModule::moduleForState(InjectedScriptManager* injectedScriptManager, ScriptState* scriptState)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InjectedScriptCanvasModule result;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.ensureInjected(injectedScriptManager, scriptState);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String InjectedScriptCanvasModule::source() const
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String(reinterpret_cast<const char*>(InjectedScriptCanvasModuleSource_js), sizeof(InjectedScriptCanvasModuleSource_js));
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScriptObject InjectedScriptCanvasModule::wrapCanvas2DContext(const ScriptObject& context)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return callWrapContextFunction("wrapCanvas2DContext", context);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScriptObject InjectedScriptCanvasModule::wrapWebGLContext(const ScriptObject& glContext)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return callWrapContextFunction("wrapWebGLContext", glContext);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ScriptObject InjectedScriptCanvasModule::callWrapContextFunction(const String& functionName, const ScriptObject& context)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptFunctionCall function(injectedScriptObject(), functionName);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function.appendArgument(context);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hadException = false;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptValue resultValue = callFunctionWithEvalEnabled(function, hadException);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hadException || resultValue.hasNoValue() || !resultValue.isObject()) {
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ScriptObject();
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ScriptObject(context.scriptState(), resultValue);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::markFrameEnd()
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScriptFunctionCall function(injectedScriptObject(), "markFrameEnd");
90591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONValue> resultValue;
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    makeCall(function, &resultValue);
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(resultValue);
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::captureFrame(ErrorString* errorString, TraceLogId* traceLogId)
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    callStartCapturingFunction("captureFrame", errorString, traceLogId);
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::startCapturing(ErrorString* errorString, TraceLogId* traceLogId)
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    callStartCapturingFunction("startCapturing", errorString, traceLogId);
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::callStartCapturingFunction(const String& functionName, ErrorString* errorString, TraceLogId* traceLogId)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScriptFunctionCall function(injectedScriptObject(), functionName);
108591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONValue> resultValue;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    makeCall(function, &resultValue);
110591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!resultValue || resultValue->type() != JSONValue::TypeString || !resultValue->asString(traceLogId))
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Internal error: " + functionName;
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::stopCapturing(ErrorString* errorString, const TraceLogId& traceLogId)
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    callVoidFunctionWithTraceLogIdArgument("stopCapturing", errorString, traceLogId);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::dropTraceLog(ErrorString* errorString, const TraceLogId& traceLogId)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    callVoidFunctionWithTraceLogIdArgument("dropTraceLog", errorString, traceLogId);
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::callVoidFunctionWithTraceLogIdArgument(const String& functionName, ErrorString* errorString, const TraceLogId& traceLogId)
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScriptFunctionCall function(injectedScriptObject(), functionName);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function.appendArgument(traceLogId);
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hadException = false;
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    callFunctionWithEvalEnabled(function, hadException);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!hadException);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hadException)
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        *errorString = "Internal error: " + functionName;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::traceLog(ErrorString* errorString, const TraceLogId& traceLogId, const int* startOffset, const int* maxLength, RefPtr<TraceLog>* traceLog)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptFunctionCall function(injectedScriptObject(), "traceLog");
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function.appendArgument(traceLogId);
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (startOffset)
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function.appendArgument(*startOffset);
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (maxLength)
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function.appendArgument(*maxLength);
143591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONValue> resultValue;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    makeCall(function, &resultValue);
145591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!resultValue || resultValue->type() != JSONValue::TypeObject) {
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!resultValue->asString(errorString))
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *errorString = "Internal error: traceLog";
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    *traceLog = TraceLog::runtimeCast(resultValue);
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InjectedScriptCanvasModule::replayTraceLog(ErrorString* errorString, const TraceLogId& traceLogId, int stepNo, RefPtr<ResourceState>* result, double* replayTime)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptFunctionCall function(injectedScriptObject(), "replayTraceLog");
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function.appendArgument(traceLogId);
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    function.appendArgument(stepNo);
158591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONValue> resultValue;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    makeCall(function, &resultValue);
160591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!resultValue || resultValue->type() != JSONValue::TypeObject) {
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!resultValue->asString(errorString))
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *errorString = "Internal error: replayTraceLog";
163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RefPtr<JSONObject> resultObject = resultValue->asObject();
1667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    RefPtr<JSONObject> resourceStateObject = resultObject->getObject("resourceState");
1677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (!resourceStateObject) {
1687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        *errorString = "Internal error: replayTraceLog: no resourceState";
1697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        return;
1707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
1717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    *result = ResourceState::runtimeCast(resourceStateObject);
1727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (!resultObject->getNumber("replayTime", replayTime))
1737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        *errorString = "Internal error: replayTraceLog: no replayTime";
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InjectedScriptCanvasModule::resourceState(ErrorString* errorString, const TraceLogId& traceLogId, const ResourceId& resourceId, RefPtr<ResourceState>* result)
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ScriptFunctionCall function(injectedScriptObject(), "resourceState");
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    function.appendArgument(traceLogId);
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    function.appendArgument(resourceId);
181591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONValue> resultValue;
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    makeCall(function, &resultValue);
183591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!resultValue || resultValue->type() != JSONValue::TypeObject) {
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!resultValue->asString(errorString))
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            *errorString = "Internal error: resourceState";
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    *result = ResourceState::runtimeCast(resultValue);
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
191591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InjectedScriptCanvasModule::evaluateTraceLogCallArgument(ErrorString* errorString, const TraceLogId& traceLogId, int callIndex, int argumentIndex, const String& objectGroup, RefPtr<RemoteObject>* result, RefPtr<ResourceState>* resourceState)
192591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
193591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ScriptFunctionCall function(injectedScriptObject(), "evaluateTraceLogCallArgument");
194591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    function.appendArgument(traceLogId);
195591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    function.appendArgument(callIndex);
196591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    function.appendArgument(argumentIndex);
197591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    function.appendArgument(objectGroup);
198591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONValue> resultValue;
199591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    makeCall(function, &resultValue);
200591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!resultValue || resultValue->type() != JSONValue::TypeObject) {
201591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!resultValue->asString(errorString))
202591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            *errorString = "Internal error: evaluateTraceLogCallArgument";
203591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return;
204591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
205591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONObject> resultObject = resultValue->asObject();
206591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONObject> remoteObject = resultObject->getObject("result");
207591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (remoteObject)
208591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        *result = RemoteObject::runtimeCast(remoteObject);
209591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONObject> resourceStateObject = resultObject->getObject("resourceState");
210591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (resourceStateObject)
211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        *resourceState = ResourceState::runtimeCast(resourceStateObject);
212591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!remoteObject && !resourceStateObject)
213591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        *errorString = "Internal error: no result and no resource state";
214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
216591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} // namespace WebCore
217