1f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch/* 2f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Copyright (C) 2009 Google Inc. All rights reserved. 3f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 4f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * Redistribution and use in source and binary forms, with or without 5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * modification, are permitted provided that the following conditions are 6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * met: 7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * * Redistributions of source code must retain the above copyright 9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * notice, this list of conditions and the following disclaimer. 10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * * Redistributions in binary form must reproduce the above 11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 12f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * in the documentation and/or other materials provided with the 13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * distribution. 14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * * Neither the name of Google Inc. nor the names of its 15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * contributors may be used to endorse or promote products derived from 16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * this software without specific prior written permission. 17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * 18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch */ 30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/v8-function-call.h" 32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/inspector/inspected-context.h" 34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/string-util.h" 35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/v8-debugger.h" 36f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/v8-inspector-impl.h" 37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "include/v8-inspector.h" 39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace v8_inspector { 41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochV8FunctionCall::V8FunctionCall(V8InspectorImpl* inspector, 43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Context> context, 44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Value> value, const String16& name) 45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : m_inspector(inspector), 46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_context(context), 47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_name(toV8String(context->GetIsolate(), name)), 48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_value(value) {} 49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid V8FunctionCall::appendArgument(v8::Local<v8::Value> value) { 51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_arguments.push_back(value); 52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 54f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid V8FunctionCall::appendArgument(const String16& argument) { 55f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_arguments.push_back(toV8String(m_context->GetIsolate(), argument)); 56f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 58f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid V8FunctionCall::appendArgument(int argument) { 59f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_arguments.push_back(v8::Number::New(m_context->GetIsolate(), argument)); 60f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 61f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 62f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid V8FunctionCall::appendArgument(bool argument) { 63f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_arguments.push_back(argument ? v8::True(m_context->GetIsolate()) 64f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : v8::False(m_context->GetIsolate())); 65f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 66f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 67f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochv8::Local<v8::Value> V8FunctionCall::call(bool& hadException, 68f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool reportExceptions) { 69f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::TryCatch tryCatch(m_context->GetIsolate()); 70f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch tryCatch.SetVerbose(reportExceptions); 71f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Value> result = callWithoutExceptionHandling(); 73f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch hadException = tryCatch.HasCaught(); 74f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return result; 75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 77f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochv8::Local<v8::Value> V8FunctionCall::callWithoutExceptionHandling() { 78f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Object> thisObject = v8::Local<v8::Object>::Cast(m_value); 79f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Value> value; 80f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!thisObject->Get(m_context, m_name).ToLocal(&value)) 81f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return v8::Local<v8::Value>(); 82f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 83f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(value->IsFunction()); 84f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 85f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Function> function = v8::Local<v8::Function>::Cast(value); 86f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch std::unique_ptr<v8::Local<v8::Value>[]> info( 87f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch new v8::Local<v8::Value>[m_arguments.size()]); 88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (size_t i = 0; i < m_arguments.size(); ++i) { 89f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch info[i] = m_arguments[i]; 90f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(!info[i].IsEmpty()); 91f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 92f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 9362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int contextGroupId = m_inspector->contextGroupId(m_context); 94f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (contextGroupId) { 95f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_inspector->client()->muteMetrics(contextGroupId); 96f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_inspector->muteExceptions(contextGroupId); 97f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 98f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::MicrotasksScope microtasksScope(m_context->GetIsolate(), 99f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::MicrotasksScope::kDoNotRunMicrotasks); 100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::MaybeLocal<v8::Value> maybeResult = function->Call( 101f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_context, thisObject, static_cast<int>(m_arguments.size()), info.get()); 102f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (contextGroupId) { 103f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_inspector->client()->unmuteMetrics(contextGroupId); 104f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch m_inspector->unmuteExceptions(contextGroupId); 105f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 106f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 107f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Value> result; 108f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!maybeResult.ToLocal(&result)) return v8::Local<v8::Value>(); 109f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return result; 110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 111f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 112f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} // namespace v8_inspector 113