165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2011 Google Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1.  Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *     notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2.  Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *     notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *     documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorConsoleAgent.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(INSPECTOR)
3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "InstrumentingAgents.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Console.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ConsoleMessage.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InjectedScriptHost.h"
342bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "InjectedScriptManager.h"
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "InspectorAgent.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorDOMAgent.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorFrontend.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "InspectorState.h"
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ResourceError.h"
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ResourceResponse.h"
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ScriptArguments.h"
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ScriptCallFrame.h"
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ScriptCallStack.h"
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/CurrentTime.h>
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/OwnPtr.h>
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassOwnPtr.h>
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/StringConcatenate.h>
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebCore {
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const unsigned maximumConsoleMessages = 1000;
522bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic const int expireConsoleMessagesStep = 100;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
542fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace ConsoleAgentState {
552fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char monitoringXHR[] = "monitoringXHR";
562fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const char consoleMessagesEnabled[] = "consoleMessagesEnabled";
572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
592bde8e466a4451c7319e3a072d118917957d6554Steve BlockInspectorConsoleAgent::InspectorConsoleAgent(InstrumentingAgents* instrumentingAgents, InspectorAgent* inspectorAgent, InspectorState* state, InjectedScriptManager* injectedScriptManager, InspectorDOMAgent* domAgent)
6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    : m_instrumentingAgents(instrumentingAgents)
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_inspectorAgent(inspectorAgent)
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_inspectorState(state)
632bde8e466a4451c7319e3a072d118917957d6554Steve Block    , m_injectedScriptManager(injectedScriptManager)
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_inspectorDOMAgent(domAgent)
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_frontend(0)
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_previousMessage(0)
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    , m_expiredConsoleMessageCount(0)
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_instrumentingAgents->setInspectorConsoleAgent(this);
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochInspectorConsoleAgent::~InspectorConsoleAgent()
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_instrumentingAgents->setInspectorConsoleAgent(0);
7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_instrumentingAgents = 0;
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_inspectorAgent = 0;
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_inspectorState = 0;
782bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_injectedScriptManager = 0;
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_inspectorDOMAgent = 0;
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
822bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid InspectorConsoleAgent::enable(ErrorString*, int* consoleMessageExpireCount)
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
842bde8e466a4451c7319e3a072d118917957d6554Steve Block    *consoleMessageExpireCount = m_expiredConsoleMessageCount;
852bde8e466a4451c7319e3a072d118917957d6554Steve Block
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_inspectorState->setBoolean(ConsoleAgentState::consoleMessagesEnabled, true);
872bde8e466a4451c7319e3a072d118917957d6554Steve Block
882bde8e466a4451c7319e3a072d118917957d6554Steve Block    size_t messageCount = m_consoleMessages.size();
892bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (size_t i = 0; i < messageCount; ++i)
902bde8e466a4451c7319e3a072d118917957d6554Steve Block        m_consoleMessages[i]->addToFrontend(m_frontend, m_injectedScriptManager);
912bde8e466a4451c7319e3a072d118917957d6554Steve Block}
922bde8e466a4451c7319e3a072d118917957d6554Steve Block
932bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid InspectorConsoleAgent::disable(ErrorString*)
942bde8e466a4451c7319e3a072d118917957d6554Steve Block{
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_inspectorState->setBoolean(ConsoleAgentState::consoleMessagesEnabled, false);
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid InspectorConsoleAgent::clearConsoleMessages(ErrorString*)
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_consoleMessages.clear();
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_expiredConsoleMessageCount = 0;
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_previousMessage = 0;
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_injectedScriptManager->releaseObjectGroup("console");
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_inspectorDOMAgent->releaseDanglingNodes();
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_frontend)
1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_frontend->messagesCleared();
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::reset()
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ErrorString error;
11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    clearConsoleMessages(&error);
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_times.clear();
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_counts.clear();
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::setFrontend(InspectorFrontend* frontend)
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_frontend = frontend->console();
12081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
12181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
12281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid InspectorConsoleAgent::clearFrontend()
12381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_frontend = 0;
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::addMessageToConsole(MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptArguments> arguments, PassRefPtr<ScriptCallStack> callStack)
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectorAgent->enabled())
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    addConsoleMessage(new ConsoleMessage(source, type, level, message, arguments, callStack));
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::addMessageToConsole(MessageSource source, MessageType type, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceID)
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectorAgent->enabled())
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    addConsoleMessage(new ConsoleMessage(source, type, level, message, lineNumber, sourceID));
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::startTiming(const String& title)
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Follow Firebug's behavior of requiring a title that is not null or
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // undefined for timing functions
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (title.isNull())
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_times.add(title, currentTime() * 1000);
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::stopTiming(const String& title, PassRefPtr<ScriptCallStack> callStack)
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Follow Firebug's behavior of requiring a title that is not null or
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // undefined for timing functions
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (title.isNull())
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HashMap<String, double>::iterator it = m_times.find(title);
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (it == m_times.end())
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    double startTime = it->second;
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_times.remove(it);
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    double elapsed = currentTime() * 1000 - startTime;
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String message = title + String::format(": %.0fms", elapsed);
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    const ScriptCallFrame& lastCaller = callStack->at(0);
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lastCaller.lineNumber(), lastCaller.sourceURL());
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::count(PassRefPtr<ScriptArguments> arguments, PassRefPtr<ScriptCallStack> callStack)
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    const ScriptCallFrame& lastCaller = callStack->at(0);
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Follow Firebug's behavior of counting with null and undefined title in
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // the same bucket as no argument
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String title;
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    arguments->getFirstArgumentAsString(title);
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String identifier = makeString(title, '@', lastCaller.sourceURL(), ':', String::number(lastCaller.lineNumber()));
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HashMap<String, unsigned>::iterator it = m_counts.find(identifier);
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int count;
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (it == m_counts.end())
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        count = 1;
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    else {
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        count = it->second + 1;
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_counts.remove(it);
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_counts.add(identifier, count);
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String message = makeString(title, ": ", String::number(count));
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lastCaller.lineNumber(), lastCaller.sourceURL());
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::resourceRetrievedByXMLHttpRequest(const String& url, const String& sendURL, unsigned sendLineNumber)
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectorAgent->enabled())
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (m_inspectorState->getBoolean(ConsoleAgentState::monitoringXHR))
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, "XHR finished loading: \"" + url + "\".", sendLineNumber, sendURL);
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::didReceiveResponse(unsigned long identifier, const ResourceResponse& response)
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectorAgent->enabled())
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (response.httpStatusCode() >= 400) {
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        String message = makeString("Failed to load resource: the server responded with a status of ", String::number(response.httpStatusCode()), " (", response.httpStatusText(), ')');
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        addConsoleMessage(new ConsoleMessage(OtherMessageSource, NetworkErrorMessageType, ErrorMessageLevel, message, response.url().string(), identifier));
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::didFailLoading(unsigned long identifier, const ResourceError& error)
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!m_inspectorAgent->enabled())
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (error.isCancellation()) // Report failures only.
2192bde8e466a4451c7319e3a072d118917957d6554Steve Block        return;
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String message = "Failed to load resource";
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!error.localizedDescription().isEmpty())
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        message += ": " + error.localizedDescription();
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    addConsoleMessage(new ConsoleMessage(OtherMessageSource, NetworkErrorMessageType, ErrorMessageLevel, message, error.failingURL(), identifier));
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid InspectorConsoleAgent::setMonitoringXHREnabled(ErrorString*, bool enabled)
227ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
22881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_inspectorState->setBoolean(ConsoleAgentState::monitoringXHR, enabled);
229ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
230ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2312bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid InspectorConsoleAgent::addInspectedNode(ErrorString*, int nodeId)
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2332bde8e466a4451c7319e3a072d118917957d6554Steve Block    Node* node = m_inspectorDOMAgent->nodeForId(nodeId);
2342bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!node)
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
2362bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_injectedScriptManager->injectedScriptHost()->addInspectedNode(node);
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid InspectorConsoleAgent::addConsoleMessage(PassOwnPtr<ConsoleMessage> consoleMessage)
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_inspectorAgent->enabled());
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_ARG(consoleMessage, consoleMessage);
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (m_previousMessage && m_previousMessage->type() != EndGroupMessageType && m_previousMessage->isEqual(consoleMessage.get())) {
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_previousMessage->incrementCount();
24681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (m_inspectorState->getBoolean(ConsoleAgentState::consoleMessagesEnabled) && m_frontend)
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_previousMessage->updateRepeatCountInConsole(m_frontend);
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else {
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_previousMessage = consoleMessage.get();
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_consoleMessages.append(consoleMessage);
25181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (m_inspectorState->getBoolean(ConsoleAgentState::consoleMessagesEnabled) && m_frontend)
2522bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_previousMessage->addToFrontend(m_frontend, m_injectedScriptManager);
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_frontend && m_consoleMessages.size() >= maximumConsoleMessages) {
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_expiredConsoleMessageCount += expireConsoleMessagesStep;
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_consoleMessages.remove(0, expireConsoleMessagesStep);
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebCore
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(INSPECTOR)
264