OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Apple Inc. All rights reserved. | 2 * Copyright (C) 2013 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 11 matching lines...) Expand all Loading... |
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 */ | 27 */ |
28 | 28 |
29 #include "sky/engine/config.h" | 29 #include "sky/engine/config.h" |
30 #include "sky/engine/core/frame/FrameConsole.h" | 30 #include "sky/engine/core/frame/FrameConsole.h" |
31 | 31 |
32 #include "sky/engine/bindings/core/v8/ScriptCallStackFactory.h" | |
33 #include "sky/engine/core/dom/Document.h" | 32 #include "sky/engine/core/dom/Document.h" |
34 #include "sky/engine/core/frame/FrameHost.h" | 33 #include "sky/engine/core/frame/FrameHost.h" |
35 #include "sky/engine/core/inspector/ConsoleAPITypes.h" | 34 #include "sky/engine/core/inspector/ConsoleAPITypes.h" |
36 #include "sky/engine/core/inspector/ConsoleMessage.h" | 35 #include "sky/engine/core/inspector/ConsoleMessage.h" |
37 #include "sky/engine/core/inspector/ConsoleMessageStorage.h" | |
38 #include "sky/engine/core/inspector/ScriptArguments.h" | |
39 #include "sky/engine/core/inspector/ScriptCallStack.h" | |
40 #include "sky/engine/core/page/ChromeClient.h" | 36 #include "sky/engine/core/page/ChromeClient.h" |
41 #include "sky/engine/core/page/Page.h" | 37 #include "sky/engine/core/page/Page.h" |
42 #include "sky/engine/platform/network/ResourceResponse.h" | 38 #include "sky/engine/platform/network/ResourceResponse.h" |
43 #include "sky/engine/wtf/text/StringBuilder.h" | 39 #include "sky/engine/wtf/text/StringBuilder.h" |
44 | 40 |
45 namespace blink { | 41 namespace blink { |
46 | 42 |
47 static const HashSet<int>& allClientReportingMessageTypes() | |
48 { | |
49 DEFINE_STATIC_LOCAL(HashSet<int>, types, ()); | |
50 if (types.isEmpty()) { | |
51 types.add(LogMessageType); | |
52 types.add(DirMessageType); | |
53 types.add(DirXMLMessageType); | |
54 types.add(TableMessageType); | |
55 types.add(TraceMessageType); | |
56 types.add(ClearMessageType); | |
57 types.add(AssertMessageType); | |
58 } | |
59 return types; | |
60 } | |
61 | |
62 namespace { | |
63 | |
64 int muteCount = 0; | |
65 | |
66 } | |
67 | |
68 FrameConsole::FrameConsole(LocalFrame& frame) | 43 FrameConsole::FrameConsole(LocalFrame& frame) |
69 : m_frame(frame) | 44 : m_frame(frame) |
70 { | 45 { |
71 } | 46 } |
72 | 47 |
73 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(FrameConsole); | 48 DEFINE_EMPTY_DESTRUCTOR_WILL_BE_REMOVED(FrameConsole); |
74 | 49 |
75 void FrameConsole::addMessage(PassRefPtr<ConsoleMessage> prpConsoleMessage) | 50 void FrameConsole::addMessage(PassRefPtr<ConsoleMessage> prpConsoleMessage) |
76 { | 51 { |
77 RefPtr<ConsoleMessage> consoleMessage = prpConsoleMessage; | 52 RefPtr<ConsoleMessage> consoleMessage = prpConsoleMessage; |
78 if (muteCount && consoleMessage->source() != ConsoleAPIMessageSource) | |
79 return; | |
80 | 53 |
81 // FIXME: This should not need to reach for the main-frame. | 54 // FIXME: This should not need to reach for the main-frame. |
82 // Inspector code should just take the current frame and know how to walk it
self. | 55 // Inspector code should just take the current frame and know how to walk it
self. |
83 ExecutionContext* context = m_frame.document(); | 56 ExecutionContext* context = m_frame.document(); |
84 if (!context) | 57 if (!context) |
85 return; | 58 return; |
86 | 59 |
87 String messageURL; | 60 String messageURL = consoleMessage->url(); |
88 unsigned lineNumber = 0; | 61 unsigned lineNumber = consoleMessage->lineNumber(); |
89 if (consoleMessage->callStack() && consoleMessage->callStack()->size()) { | 62 m_frame.page()->addMessageToConsole(&m_frame, consoleMessage->source(), cons
oleMessage->level(), consoleMessage->message(), lineNumber, messageURL, String()
); |
90 lineNumber = consoleMessage->callStack()->at(0).lineNumber(); | |
91 messageURL = consoleMessage->callStack()->at(0).sourceURL(); | |
92 } else { | |
93 lineNumber = consoleMessage->lineNumber(); | |
94 messageURL = consoleMessage->url(); | |
95 } | |
96 | |
97 messageStorage()->reportMessage(consoleMessage); | |
98 | |
99 RefPtr<ScriptCallStack> reportedCallStack = nullptr; | |
100 if (consoleMessage->source() != ConsoleAPIMessageSource) { | |
101 if (consoleMessage->callStack() && m_frame.page()->shouldReportDetailedM
essageForSource(messageURL)) | |
102 reportedCallStack = consoleMessage->callStack(); | |
103 } else { | |
104 if (!m_frame.host() || (consoleMessage->scriptArguments() && consoleMess
age->scriptArguments()->argumentCount() == 0)) | |
105 return; | |
106 | |
107 if (!allClientReportingMessageTypes().contains(consoleMessage->type())) | |
108 return; | |
109 | |
110 if (m_frame.page()->shouldReportDetailedMessageForSource(messageURL)) | |
111 reportedCallStack = createScriptCallStack(ScriptCallStack::maxCallSt
ackSizeToCapture); | |
112 } | |
113 | |
114 String stackTrace; | |
115 if (reportedCallStack) | |
116 stackTrace = FrameConsole::formatStackTraceString(consoleMessage->messag
e(), reportedCallStack); | |
117 m_frame.page()->addMessageToConsole(&m_frame, consoleMessage->source(), cons
oleMessage->level(), consoleMessage->message(), lineNumber, messageURL, stackTra
ce); | |
118 } | 63 } |
119 | 64 |
120 void FrameConsole::reportResourceResponseReceived(Document* document, unsigned l
ong requestIdentifier, const ResourceResponse& response) | 65 void FrameConsole::reportResourceResponseReceived(Document* document, unsigned l
ong requestIdentifier, const ResourceResponse& response) |
121 { | 66 { |
122 if (!document) | 67 if (!document) |
123 return; | 68 return; |
124 if (response.httpStatusCode() < 400) | 69 if (response.httpStatusCode() < 400) |
125 return; | 70 return; |
126 String message = "Failed to load resource: the server responded with a statu
s of " + String::number(response.httpStatusCode()) + " (" + response.httpStatusT
ext() + ')'; | 71 String message = "Failed to load resource: the server responded with a statu
s of " + String::number(response.httpStatusCode()) + " (" + response.httpStatusT
ext() + ')'; |
127 RefPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(NetworkMessag
eSource, ErrorMessageLevel, message, response.url().string()); | 72 RefPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(NetworkMessag
eSource, ErrorMessageLevel, message, response.url().string()); |
128 consoleMessage->setRequestIdentifier(requestIdentifier); | 73 consoleMessage->setRequestIdentifier(requestIdentifier); |
129 addMessage(consoleMessage.release()); | 74 addMessage(consoleMessage.release()); |
130 } | 75 } |
131 | 76 |
132 String FrameConsole::formatStackTraceString(const String& originalMessage, PassR
efPtr<ScriptCallStack> callStack) | |
133 { | |
134 StringBuilder stackTrace; | |
135 for (size_t i = 0; i < callStack->size(); ++i) { | |
136 const ScriptCallFrame& frame = callStack->at(i); | |
137 stackTrace.append("\n at " + (frame.functionName().length() ? frame.f
unctionName() : "(anonymous function)")); | |
138 stackTrace.appendLiteral(" ("); | |
139 stackTrace.append(frame.sourceURL()); | |
140 stackTrace.append(':'); | |
141 stackTrace.append(String::number(frame.lineNumber())); | |
142 stackTrace.append(':'); | |
143 stackTrace.append(String::number(frame.columnNumber())); | |
144 stackTrace.append(')'); | |
145 } | |
146 | |
147 return stackTrace.toString(); | |
148 } | |
149 | |
150 void FrameConsole::mute() | |
151 { | |
152 muteCount++; | |
153 } | |
154 | |
155 void FrameConsole::unmute() | |
156 { | |
157 ASSERT(muteCount > 0); | |
158 muteCount--; | |
159 } | |
160 | |
161 ConsoleMessageStorage* FrameConsole::messageStorage() | |
162 { | |
163 if (!m_consoleMessageStorage) | |
164 m_consoleMessageStorage = ConsoleMessageStorage::createForFrame(&m_frame
); | |
165 return m_consoleMessageStorage.get(); | |
166 } | |
167 | |
168 void FrameConsole::clearMessages() | |
169 { | |
170 messageStorage()->clear(); | |
171 } | |
172 | |
173 } // namespace blink | 77 } // namespace blink |
OLD | NEW |