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