1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "config.h" 6#include "core/inspector/ConsoleMessageStorage.h" 7 8#include "core/frame/LocalDOMWindow.h" 9#include "core/inspector/ConsoleMessage.h" 10#include "core/inspector/InspectorConsoleInstrumentation.h" 11 12namespace blink { 13 14static const unsigned maxConsoleMessageCount = 1000; 15 16ConsoleMessageStorage::ConsoleMessageStorage(ExecutionContext* context) 17 : m_expiredCount(0) 18 , m_context(context) 19 , m_frame(nullptr) 20{ 21} 22 23ConsoleMessageStorage::ConsoleMessageStorage(LocalFrame* frame) 24 : m_expiredCount(0) 25 , m_context(nullptr) 26 , m_frame(frame) 27{ 28} 29 30void ConsoleMessageStorage::reportMessage(PassRefPtrWillBeRawPtr<ConsoleMessage> prpMessage) 31{ 32 RefPtrWillBeRawPtr<ConsoleMessage> message = prpMessage; 33 message->collectCallStack(); 34 35 if (message->type() == ClearMessageType) 36 clear(); 37 38 InspectorInstrumentation::addMessageToConsole(executionContext(), message.get()); 39 40 ASSERT(m_messages.size() <= maxConsoleMessageCount); 41 if (m_messages.size() == maxConsoleMessageCount) { 42 ++m_expiredCount; 43 m_messages.removeFirst(); 44 } 45 m_messages.append(message); 46} 47 48void ConsoleMessageStorage::clear() 49{ 50 InspectorInstrumentation::consoleMessagesCleared(executionContext()); 51 m_messages.clear(); 52 m_expiredCount = 0; 53} 54 55Vector<unsigned> ConsoleMessageStorage::argumentCounts() const 56{ 57 Vector<unsigned> result(m_messages.size()); 58 for (size_t i = 0; i < m_messages.size(); ++i) 59 result[i] = m_messages[i]->argumentCount(); 60 return result; 61} 62 63void ConsoleMessageStorage::adoptWorkerMessagesAfterTermination(WorkerGlobalScopeProxy* workerGlobalScopeProxy) 64{ 65 for (size_t i = 0; i < m_messages.size(); ++i) { 66 if (m_messages[i]->workerGlobalScopeProxy() == workerGlobalScopeProxy) 67 m_messages[i]->setWorkerGlobalScopeProxy(nullptr); 68 } 69} 70 71void ConsoleMessageStorage::frameWindowDiscarded(LocalDOMWindow* window) 72{ 73 for (size_t i = 0; i < m_messages.size(); ++i) 74 m_messages[i]->frameWindowDiscarded(window); 75} 76 77size_t ConsoleMessageStorage::size() const 78{ 79 return m_messages.size(); 80} 81 82ConsoleMessage* ConsoleMessageStorage::at(size_t index) const 83{ 84 return m_messages[index].get(); 85} 86 87int ConsoleMessageStorage::expiredCount() const 88{ 89 return m_expiredCount; 90} 91 92ExecutionContext* ConsoleMessageStorage::executionContext() const 93{ 94 return m_frame ? m_frame->document() : m_context; 95} 96 97void ConsoleMessageStorage::trace(Visitor* visitor) 98{ 99 visitor->trace(m_messages); 100 visitor->trace(m_context); 101 visitor->trace(m_frame); 102} 103 104} // namespace blink 105