diff --git a/include/capi/cef_display_handler_capi.h b/include/capi/cef_display_handler_capi.h index 412b1abf6..6c7650a29 100644 --- a/include/capi/cef_display_handler_capi.h +++ b/include/capi/cef_display_handler_capi.h @@ -33,7 +33,7 @@ // by hand. See the translator.README.txt file in the tools directory for // more information. // -// $hash=979968e494e9d7c4d5117a1753acade5d0e79215$ +// $hash=57ae11d3194ee046ea357503b9349f819ac9c3da$ // #ifndef CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_ @@ -118,6 +118,7 @@ typedef struct _cef_display_handler_t { /// int(CEF_CALLBACK* on_console_message)(struct _cef_display_handler_t* self, struct _cef_browser_t* browser, + cef_log_severity_t level, const cef_string_t* message, const cef_string_t* source, int line); diff --git a/include/cef_display_handler.h b/include/cef_display_handler.h index cbcb85be4..b180d70c8 100644 --- a/include/cef_display_handler.h +++ b/include/cef_display_handler.h @@ -109,6 +109,7 @@ class CefDisplayHandler : public virtual CefBaseRefCounted { /// /*--cef(optional_param=message,optional_param=source)--*/ virtual bool OnConsoleMessage(CefRefPtr browser, + cef_log_severity_t level, const CefString& message, const CefString& source, int line) { diff --git a/include/internal/cef_types.h b/include/internal/cef_types.h index 6efd3c02e..54df8f540 100644 --- a/include/internal/cef_types.h +++ b/include/internal/cef_types.h @@ -94,6 +94,11 @@ typedef enum { /// LOGSEVERITY_VERBOSE, + /// + // DEBUG logging. + /// + LOGSEVERITY_DEBUG = LOGSEVERITY_VERBOSE, + /// // INFO logging. /// diff --git a/libcef/browser/browser_host_impl.cc b/libcef/browser/browser_host_impl.cc index 8c0919b41..7d1789dc6 100644 --- a/libcef/browser/browser_host_impl.cc +++ b/libcef/browser/browser_host_impl.cc @@ -2290,8 +2290,24 @@ bool CefBrowserHostImpl::DidAddMessageToConsole( const base::string16& source_id) { if (client_.get()) { CefRefPtr handler = client_->GetDisplayHandler(); - if (handler.get()) - return handler->OnConsoleMessage(this, message, source_id, line_no); + if (handler.get()) { + // Use LOGSEVERITY_DEBUG for unrecognized |level| values. + cef_log_severity_t log_level = LOGSEVERITY_DEBUG; + switch (level) { + case 0: + log_level = LOGSEVERITY_INFO; + break; + case 1: + log_level = LOGSEVERITY_WARNING; + break; + case 2: + log_level = LOGSEVERITY_ERROR; + break; + } + + return handler->OnConsoleMessage(this, log_level, message, source_id, + line_no); + } } return false; diff --git a/libcef_dll/cpptoc/display_handler_cpptoc.cc b/libcef_dll/cpptoc/display_handler_cpptoc.cc index 7e034dec1..4a63614ef 100644 --- a/libcef_dll/cpptoc/display_handler_cpptoc.cc +++ b/libcef_dll/cpptoc/display_handler_cpptoc.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=b52f437f558356645aaf45ee20cf4f3983e03891$ +// $hash=5fc57065576d03784d294cefc9bdddb06d007798$ // #include "libcef_dll/cpptoc/display_handler_cpptoc.h" @@ -161,6 +161,7 @@ display_handler_on_status_message(struct _cef_display_handler_t* self, int CEF_CALLBACK display_handler_on_console_message(struct _cef_display_handler_t* self, cef_browser_t* browser, + cef_log_severity_t level, const cef_string_t* message, const cef_string_t* source, int line) { @@ -177,8 +178,8 @@ display_handler_on_console_message(struct _cef_display_handler_t* self, // Execute bool _retval = CefDisplayHandlerCppToC::Get(self)->OnConsoleMessage( - CefBrowserCToCpp::Wrap(browser), CefString(message), CefString(source), - line); + CefBrowserCToCpp::Wrap(browser), level, CefString(message), + CefString(source), line); // Return type: bool return _retval; diff --git a/libcef_dll/ctocpp/display_handler_ctocpp.cc b/libcef_dll/ctocpp/display_handler_ctocpp.cc index a636e2117..9db9f4104 100644 --- a/libcef_dll/ctocpp/display_handler_ctocpp.cc +++ b/libcef_dll/ctocpp/display_handler_ctocpp.cc @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=1948d2651fc5f7fd6aab7878da869b5d231b9cde$ +// $hash=cbda5350da86e9859384cfa2c06f09b02a5431aa$ // #include "libcef_dll/ctocpp/display_handler_ctocpp.h" @@ -156,6 +156,7 @@ void CefDisplayHandlerCToCpp::OnStatusMessage(CefRefPtr browser, } bool CefDisplayHandlerCToCpp::OnConsoleMessage(CefRefPtr browser, + cef_log_severity_t level, const CefString& message, const CefString& source, int line) { @@ -173,7 +174,7 @@ bool CefDisplayHandlerCToCpp::OnConsoleMessage(CefRefPtr browser, // Execute int _retval = _struct->on_console_message( - _struct, CefBrowserCppToC::Wrap(browser), message.GetStruct(), + _struct, CefBrowserCppToC::Wrap(browser), level, message.GetStruct(), source.GetStruct(), line); // Return type: bool diff --git a/libcef_dll/ctocpp/display_handler_ctocpp.h b/libcef_dll/ctocpp/display_handler_ctocpp.h index f27eec7ed..b39ca0643 100644 --- a/libcef_dll/ctocpp/display_handler_ctocpp.h +++ b/libcef_dll/ctocpp/display_handler_ctocpp.h @@ -9,7 +9,7 @@ // implementations. See the translator.README.txt file in the tools directory // for more information. // -// $hash=6d8ab7f2086373de52eb178cc640d2d553d43c58$ +// $hash=834d40adeea090f273d3b4a1c47b5e5ab546f542$ // #ifndef CEF_LIBCEF_DLL_CTOCPP_DISPLAY_HANDLER_CTOCPP_H_ @@ -48,6 +48,7 @@ class CefDisplayHandlerCToCpp void OnStatusMessage(CefRefPtr browser, const CefString& value) override; bool OnConsoleMessage(CefRefPtr browser, + cef_log_severity_t level, const CefString& message, const CefString& source, int line) override; diff --git a/tests/cefclient/browser/client_handler.cc b/tests/cefclient/browser/client_handler.cc index a64f875cf..3cd480869 100644 --- a/tests/cefclient/browser/client_handler.cc +++ b/tests/cefclient/browser/client_handler.cc @@ -394,6 +394,7 @@ void ClientHandler::OnFullscreenModeChange(CefRefPtr browser, } bool ClientHandler::OnConsoleMessage(CefRefPtr browser, + cef_log_severity_t level, const CefString& message, const CefString& source, int line) { @@ -402,6 +403,24 @@ bool ClientHandler::OnConsoleMessage(CefRefPtr browser, FILE* file = fopen(console_log_file_.c_str(), "a"); if (file) { std::stringstream ss; + ss << "Level: "; + switch (level) { + case LOGSEVERITY_DEBUG: + ss << "Debug" << NEWLINE; + break; + case LOGSEVERITY_INFO: + ss << "Info" << NEWLINE; + break; + case LOGSEVERITY_WARNING: + ss << "Warn" << NEWLINE; + break; + case LOGSEVERITY_ERROR: + ss << "Error" << NEWLINE; + break; + default: + NOTREACHED(); + break; + } ss << "Message: " << message.ToString() << NEWLINE << "Source: " << source.ToString() << NEWLINE << "Line: " << line << NEWLINE << "-----------------------" << NEWLINE; diff --git a/tests/cefclient/browser/client_handler.h b/tests/cefclient/browser/client_handler.h index 79bffb40c..3660bffb9 100644 --- a/tests/cefclient/browser/client_handler.h +++ b/tests/cefclient/browser/client_handler.h @@ -147,6 +147,7 @@ class ClientHandler : public CefClient, void OnFullscreenModeChange(CefRefPtr browser, bool fullscreen) OVERRIDE; bool OnConsoleMessage(CefRefPtr browser, + cef_log_severity_t level, const CefString& message, const CefString& source, int line) OVERRIDE; diff --git a/tests/ceftests/display_unittest.cc b/tests/ceftests/display_unittest.cc index 0f72553a9..1436bffa1 100644 --- a/tests/ceftests/display_unittest.cc +++ b/tests/ceftests/display_unittest.cc @@ -242,3 +242,215 @@ TEST(DisplayTest, AutoResize) { handler->ExecuteTest(); ReleaseAndWaitForDestructor(handler); } + +namespace { + +// Browser side. +class ConsoleTestHandler : public TestHandler { + public: + struct TestConfig { + // Use something other than 1 as |line| for testing. + explicit TestConfig(cef_log_severity_t message_level) + : level(message_level), + message("'Test Message'"), + expected_message("Test Message"), + source("http://tests-console-message/level.html"), + line(42) {} + + cef_log_severity_t level; + std::string message; + std::string expected_message; + std::string source; + int line; + std::string function; + }; + + ConsoleTestHandler(const TestConfig& config) : config_(config) {} + + void RunTest() override { + // Add the resources that will be used to print to console. + AddResource( + config_.source, + CreateResourceContent(config_.message, config_.function, config_.line), + "text/html"); + + // Create the browser. + CreateBrowser(config_.source); + + // Time out the test after a reasonable period of time. + SetTestTimeout(); + } + + void OnLoadingStateChange(CefRefPtr browser, + bool isLoading, + bool canGoBack, + bool canGoForward) override { + if (isLoading) + return; + + // Print console message after loading. + browser->GetMainFrame()->ExecuteJavaScript("printMessage()", config_.source, + 0); + } + + bool OnConsoleMessage(CefRefPtr browser, + cef_log_severity_t level, + const CefString& message, + const CefString& source, + int line) override { + EXPECT_EQ(config_.level, level); + EXPECT_EQ(config_.expected_message, message.ToString()); + EXPECT_EQ(config_.source, source.ToString()); + EXPECT_EQ(config_.line, line); + + TestHandler::DestroyTest(); + + return false; + } + + private: + std::string CreateResourceContent(const CefString& message, + const CefString& function, + int line) { + std::string content = ""; + + return content; + } + + TestConfig config_; + + IMPLEMENT_REFCOUNTING(ConsoleTestHandler); +}; + +} // namespace + +TEST(DisplayTest, OnConsoleMessageDebug) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_DEBUG); + config.function = "debug"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageCount) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_DEBUG); + config.function = "count"; + config.expected_message = "Test Message: 1"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageTimeEnd) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_DEBUG); + config.function = "timeEnd"; + config.expected_message = "Test Message: 0ms"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageInfo) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_INFO); + config.function = "info"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageLog) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_INFO); + config.function = "log"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageGroup) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_INFO); + config.function = "group"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageGroupCollapsed) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_INFO); + config.function = "groupCollapsed"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageGroupEnd) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_INFO); + config.function = "groupEnd"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageTable) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_INFO); + config.function = "table"; + config.message = "[1, 2, 3]"; + config.expected_message = "1,2,3"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageTrace) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_INFO); + config.function = "trace"; + config.message = ""; + config.expected_message = "console.trace"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageWarn) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_WARNING); + config.function = "warn"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageError) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_ERROR); + config.function = "error"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} + +TEST(DisplayTest, OnConsoleMessageAssert) { + ConsoleTestHandler::TestConfig config(LOGSEVERITY_ERROR); + config.function = "assert"; + config.message = "false"; + config.expected_message = "console.assert"; + + CefRefPtr handler = new ConsoleTestHandler(config); + handler->ExecuteTest(); + ReleaseAndWaitForDestructor(handler); +} \ No newline at end of file