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