1e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// found in the LICENSE file.
4e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
5e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "config.h"
6e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h"
7e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/ScriptCallStackFactory.h"
99e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "bindings/core/v8/ScriptValue.h"
109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/inspector/ScriptArguments.h"
117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "wtf/CurrentTime.h"
127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "wtf/PassOwnPtr.h"
13e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
14e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)namespace blink {
15e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
16e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ConsoleMessage::ConsoleMessage(MessageSource source,
17e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    MessageLevel level,
18e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    const String& message,
19e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    const String& url,
20e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    unsigned lineNumber,
21e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    unsigned columnNumber)
22e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    : m_source(source)
23e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_level(level)
249e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    , m_type(LogMessageType)
25e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_message(message)
267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_scriptId(0)
27e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_url(url)
28e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_lineNumber(lineNumber)
29e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_columnNumber(columnNumber)
30e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_requestIdentifier(0)
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_timestamp(WTF::currentTime())
32e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_workerProxy(nullptr)
33e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
34e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
35e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
36e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ConsoleMessage::~ConsoleMessage()
37e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
38e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
39e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
409e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)MessageType ConsoleMessage::type() const
41e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
429e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return m_type;
43e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
44e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void ConsoleMessage::setType(MessageType type)
46e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_type = type;
48e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
49e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint ConsoleMessage::scriptId() const
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_scriptId;
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ConsoleMessage::setScriptId(int scriptId)
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_scriptId = scriptId;
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
609e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)const String& ConsoleMessage::url() const
61e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
629e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return m_url;
63e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
64e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void ConsoleMessage::setURL(const String& url)
66e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_url = url;
68e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
69e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
709e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)unsigned ConsoleMessage::lineNumber() const
71e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
729e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return m_lineNumber;
73e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
74e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
759e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void ConsoleMessage::setLineNumber(unsigned lineNumber)
76e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
779e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_lineNumber = lineNumber;
78e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
79e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)PassRefPtrWillBeRawPtr<ScriptCallStack> ConsoleMessage::callStack() const
81e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return m_callStack;
83e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
84e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
859e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void ConsoleMessage::setCallStack(PassRefPtrWillBeRawPtr<ScriptCallStack> callStack)
86e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_callStack = callStack;
88e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
89e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
909e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)ScriptState* ConsoleMessage::scriptState() const
91e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
929e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (m_scriptState)
939e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return m_scriptState->get();
949e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return nullptr;
95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
96e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
979e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void ConsoleMessage::setScriptState(ScriptState* scriptState)
98e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_scriptState)
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_scriptState->clear();
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1029e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (scriptState)
1039e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_scriptState = adoptPtr(new ScriptStateProtectingContext(scriptState));
1049e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    else
1059e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        m_scriptState.clear();
1069e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
1079e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)PassRefPtrWillBeRawPtr<ScriptArguments> ConsoleMessage::scriptArguments() const
1099e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
1109e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return m_scriptArguments;
1119e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
1129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1139e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void ConsoleMessage::setScriptArguments(PassRefPtrWillBeRawPtr<ScriptArguments> scriptArguments)
1149e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
1159e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_scriptArguments = scriptArguments;
1169e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
1179e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)unsigned long ConsoleMessage::requestIdentifier() const
1199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
1209e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    return m_requestIdentifier;
1219e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
1229e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
1239e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void ConsoleMessage::setRequestIdentifier(unsigned long requestIdentifier)
1249e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
1259e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_requestIdentifier = requestIdentifier;
126e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
127e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccidouble ConsoleMessage::timestamp() const
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_timestamp;
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ConsoleMessage::setTimestamp(double timestamp)
1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_timestamp = timestamp;
1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
138e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)MessageSource ConsoleMessage::source() const
139e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
140e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return m_source;
141e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
142e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
143e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)MessageLevel ConsoleMessage::level() const
144e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
145e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return m_level;
146e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
147e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
148e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)const String& ConsoleMessage::message() const
149e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
150e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return m_message;
151e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
152e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
153e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned ConsoleMessage::columnNumber() const
154e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
155e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return m_columnNumber;
156e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
157e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ConsoleMessage::frameWindowDiscarded(LocalDOMWindow* window)
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (scriptState() && scriptState()->domWindow() == window)
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        setScriptState(nullptr);
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_scriptArguments)
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_scriptArguments->scriptState()->domWindow() != window)
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_message)
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_message = "<message collected>";
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_scriptArguments.clear();
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciunsigned ConsoleMessage::argumentCount()
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_scriptArguments)
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return m_scriptArguments->argumentCount();
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return 0;
1777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ConsoleMessage::collectCallStack()
1807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_type == EndGroupMessageType)
1827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!m_callStack || m_source == ConsoleAPIMessageSource)
1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_callStack = createScriptCallStackForConsole(ScriptCallStack::maxCallStackSizeToCapture, true);
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (m_callStack && m_callStack->size() && !m_scriptId) {
1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const ScriptCallFrame& frame = m_callStack->at(0);
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_url = frame.sourceURL();
1907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_lineNumber = frame.lineNumber();
1917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_columnNumber = frame.columnNumber();
1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_callStack.clear();
1967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
198e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void ConsoleMessage::trace(Visitor* visitor)
199e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
200e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    visitor->trace(m_callStack);
2019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    visitor->trace(m_scriptArguments);
202e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
203e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
204e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} // namespace blink
205