1 | /* |
2 | * Copyright (C) 2015 Igalia S.L. |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Lesser General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2,1 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Library General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Library General Public License |
15 | * along with this library; see the file COPYING.LIB. If not, write to |
16 | * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
17 | * Boston, MA 02110-1301, USA. |
18 | */ |
19 | |
20 | #include "config.h" |
21 | |
22 | #include "WebViewTest.h" |
23 | |
24 | class ConsoleMessageTest : public WebViewTest { |
25 | public: |
26 | MAKE_GLIB_TEST_FIXTURE(ConsoleMessageTest); |
27 | |
28 | // This should be keep in sync with the public enums in WebKitConsoleMessage.h. |
29 | enum class MessageSource { JavaScript, Network, ConsoleAPI, Security, Other }; |
30 | enum class MessageLevel { Info, Log, Warning, Error, Debug }; |
31 | struct ConsoleMessage { |
32 | bool operator==(const ConsoleMessage& other) |
33 | { |
34 | return source == other.source |
35 | && level == other.level |
36 | && message == other.message |
37 | && lineNumber == other.lineNumber |
38 | && sourceID == other.sourceID; |
39 | } |
40 | |
41 | MessageSource source; |
42 | MessageLevel level; |
43 | CString message; |
44 | unsigned lineNumber; |
45 | CString sourceID; |
46 | }; |
47 | |
48 | static void consoleMessageReceivedCallback(WebKitUserContentManager*, WebKitJavascriptResult* message, ConsoleMessageTest* test) |
49 | { |
50 | g_assert_nonnull(message); |
51 | GUniquePtr<char> messageString(WebViewTest::javascriptResultToCString(message)); |
52 | GRefPtr<GVariant> variant = g_variant_parse(G_VARIANT_TYPE("(uusus)" ), messageString.get(), nullptr, nullptr, nullptr); |
53 | g_assert_nonnull(variant.get()); |
54 | |
55 | unsigned source, level, lineNumber; |
56 | const char* messageText; |
57 | const char* sourceID; |
58 | g_variant_get(variant.get(), "(uu&su&s)" , &source, &level, &messageText, &lineNumber, &sourceID); |
59 | test->m_consoleMessage = { static_cast<ConsoleMessageTest::MessageSource>(source), static_cast<ConsoleMessageTest::MessageLevel>(level), messageText, lineNumber, sourceID }; |
60 | |
61 | g_main_loop_quit(test->m_mainLoop); |
62 | } |
63 | |
64 | ConsoleMessageTest() |
65 | { |
66 | webkit_user_content_manager_register_script_message_handler(m_userContentManager.get(), "console" ); |
67 | g_signal_connect(m_userContentManager.get(), "script-message-received::console" , G_CALLBACK(consoleMessageReceivedCallback), this); |
68 | } |
69 | |
70 | ~ConsoleMessageTest() |
71 | { |
72 | g_signal_handlers_disconnect_matched(m_userContentManager.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this); |
73 | webkit_user_content_manager_unregister_script_message_handler(m_userContentManager.get(), "console" ); |
74 | } |
75 | |
76 | void waitUntilConsoleMessageReceived() |
77 | { |
78 | g_main_loop_run(m_mainLoop); |
79 | } |
80 | |
81 | ConsoleMessage m_consoleMessage; |
82 | }; |
83 | |
84 | static void testWebKitConsoleMessageConsoleAPI(ConsoleMessageTest* test, gconstpointer) |
85 | { |
86 | ConsoleMessageTest::ConsoleMessage referenceMessage = { ConsoleMessageTest::MessageSource::ConsoleAPI, ConsoleMessageTest::MessageLevel::Log, "Log Console Message" , 1, "http://foo.com/bar" }; |
87 | test->loadHtml("<html><body onload='console.log(\"Log Console Message\");'></body></html>" , "http://foo.com/bar" ); |
88 | test->waitUntilConsoleMessageReceived(); |
89 | g_assert_true(test->m_consoleMessage == referenceMessage); |
90 | |
91 | referenceMessage.level = ConsoleMessageTest::MessageLevel::Info; |
92 | referenceMessage.message = "Info Console Message" ; |
93 | test->loadHtml("<html><body onload='console.info(\"Info Console Message\");'></body></html>" , "http://foo.com/bar" ); |
94 | test->waitUntilConsoleMessageReceived(); |
95 | g_assert_true(test->m_consoleMessage == referenceMessage); |
96 | |
97 | referenceMessage.level = ConsoleMessageTest::MessageLevel::Warning; |
98 | referenceMessage.message = "Warning Console Message" ; |
99 | test->loadHtml("<html><body onload='console.warn(\"Warning Console Message\");'></body></html>" , "http://foo.com/bar" ); |
100 | test->waitUntilConsoleMessageReceived(); |
101 | g_assert_true(test->m_consoleMessage == referenceMessage); |
102 | |
103 | referenceMessage.level = ConsoleMessageTest::MessageLevel::Error; |
104 | referenceMessage.message = "Error Console Message" ; |
105 | test->loadHtml("<html><body onload='console.error(\"Error Console Message\");'></body></html>" , "http://foo.com/bar" ); |
106 | test->waitUntilConsoleMessageReceived(); |
107 | g_assert_true(test->m_consoleMessage == referenceMessage); |
108 | |
109 | referenceMessage.level = ConsoleMessageTest::MessageLevel::Debug; |
110 | referenceMessage.message = "Debug Console Message" ; |
111 | test->loadHtml("<html><body onload='console.debug(\"Debug Console Message\");'></body></html>" , "http://foo.com/bar" ); |
112 | test->waitUntilConsoleMessageReceived(); |
113 | g_assert_true(test->m_consoleMessage == referenceMessage); |
114 | } |
115 | |
116 | static void testWebKitConsoleMessageJavaScriptException(ConsoleMessageTest* test, gconstpointer) |
117 | { |
118 | ConsoleMessageTest::ConsoleMessage referenceMessage = { ConsoleMessageTest::MessageSource::JavaScript, ConsoleMessageTest::MessageLevel::Error, |
119 | "ReferenceError: Can't find variable: foo" , 1, "http://foo.com/bar" }; |
120 | test->loadHtml("<html><body onload='foo()'></body></html>" , "http://foo.com/bar" ); |
121 | test->waitUntilConsoleMessageReceived(); |
122 | g_assert_true(test->m_consoleMessage == referenceMessage); |
123 | } |
124 | |
125 | static void testWebKitConsoleMessageNetworkError(ConsoleMessageTest* test, gconstpointer) |
126 | { |
127 | ConsoleMessageTest::ConsoleMessage referenceMessage = { ConsoleMessageTest::MessageSource::Network, ConsoleMessageTest::MessageLevel::Error, |
128 | "Failed to load resource: The resource at “/org/webkit/glib/tests/not-found.css” does not exist" , 0, "resource:///org/webkit/glib/tests/not-found.css" }; |
129 | test->loadHtml("<html><head><link rel='stylesheet' href='not-found.css' type='text/css'></head><body></body></html>" , "resource:///org/webkit/glib/tests/" ); |
130 | test->waitUntilConsoleMessageReceived(); |
131 | g_assert_true(test->m_consoleMessage == referenceMessage); |
132 | } |
133 | |
134 | static void testWebKitConsoleMessageSecurityError(ConsoleMessageTest* test, gconstpointer) |
135 | { |
136 | ConsoleMessageTest::ConsoleMessage referenceMessage = { ConsoleMessageTest::MessageSource::Security, ConsoleMessageTest::MessageLevel::Error, |
137 | "Not allowed to load local resource: file:///foo/bar/source.png" , 1, "http://foo.com/bar" }; |
138 | test->loadHtml("<html><body><img src=\"file:///foo/bar/source.png\"/></body></html>" , "http://foo.com/bar" ); |
139 | test->waitUntilConsoleMessageReceived(); |
140 | g_assert_true(test->m_consoleMessage == referenceMessage); |
141 | } |
142 | |
143 | void beforeAll() |
144 | { |
145 | ConsoleMessageTest::add("WebKitConsoleMessage" , "console-api" , testWebKitConsoleMessageConsoleAPI); |
146 | ConsoleMessageTest::add("WebKitConsoleMessage" , "js-exception" , testWebKitConsoleMessageJavaScriptException); |
147 | ConsoleMessageTest::add("WebKitConsoleMessage" , "network-error" , testWebKitConsoleMessageNetworkError); |
148 | ConsoleMessageTest::add("WebKitConsoleMessage" , "security-error" , testWebKitConsoleMessageSecurityError); |
149 | } |
150 | |
151 | void afterAll() |
152 | { |
153 | } |
154 | |