Commit a139bcca authored by Kevin Marshall's avatar Kevin Marshall Committed by Commit Bot

Fuchsia: Add Javascript logging support to Frame FIDL interface.

This change allows Frame owners to opt-in to system console
logging for JS logs generated via console.log(), console.error(), etc.

Change-Id: I3a17fd6535d9b49ed676d15ab45104fa93a5a15c
Reviewed-on: https://chromium-review.googlesource.com/c/1327551
Commit-Queue: Kevin Marshall <kmarshall@chromium.org>
Reviewed-by: default avatarDirk Pranke <dpranke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606706}
parent f2d5503d
...@@ -1659,6 +1659,7 @@ def _CheckSpamLogging(input_api, output_api): ...@@ -1659,6 +1659,7 @@ def _CheckSpamLogging(input_api, output_api):
r"^ui[\\/]base[\\/]resource[\\/]data_pack.cc$", r"^ui[\\/]base[\\/]resource[\\/]data_pack.cc$",
r"^ui[\\/]aura[\\/]bench[\\/]bench_main\.cc$", r"^ui[\\/]aura[\\/]bench[\\/]bench_main\.cc$",
r"^ui[\\/]ozone[\\/]platform[\\/]cast[\\/]", r"^ui[\\/]ozone[\\/]platform[\\/]cast[\\/]",
r"^webrunner[\\/]browser[\\/]frame_impl.cc$",
r"^storage[\\/]browser[\\/]fileapi[\\/]" + r"^storage[\\/]browser[\\/]fileapi[\\/]" +
r"dump_file_system.cc$", r"dump_file_system.cc$",
r"^headless[\\/]app[\\/]headless_shell\.cc$")) r"^headless[\\/]app[\\/]headless_shell\.cc$"))
......
...@@ -245,6 +245,10 @@ void FrameImpl::GetNavigationController( ...@@ -245,6 +245,10 @@ void FrameImpl::GetNavigationController(
controller_bindings_.AddBinding(this, std::move(controller)); controller_bindings_.AddBinding(this, std::move(controller));
} }
void FrameImpl::SetJavaScriptLogLevel(chromium::web::LogLevel level) {
log_level_ = level;
}
void FrameImpl::LoadUrl(fidl::StringPtr url, void FrameImpl::LoadUrl(fidl::StringPtr url,
std::unique_ptr<chromium::web::LoadUrlParams> params) { std::unique_ptr<chromium::web::LoadUrlParams> params) {
GURL validated_url(*url); GURL validated_url(*url);
...@@ -426,6 +430,44 @@ void FrameImpl::ReadyToCommitNavigation( ...@@ -426,6 +430,44 @@ void FrameImpl::ReadyToCommitNavigation(
} }
} }
bool FrameImpl::DidAddMessageToConsole(content::WebContents* source,
int32_t level,
const base::string16& message,
int32_t line_no,
const base::string16& source_id) {
if (static_cast<std::underlying_type<chromium::web::LogLevel>::type>(
log_level_) > static_cast<uint32_t>(level)) {
return false;
}
std::string message_formatted =
base::StringPrintf("%s:%d : %s", base::UTF16ToUTF8(source_id).data(),
line_no, base::UTF16ToUTF8(message).data());
switch (level) {
case static_cast<std::underlying_type<chromium::web::LogLevel>::type>(
chromium::web::LogLevel::DEBUG):
LOG(INFO) << "debug:" << message;
break;
case static_cast<std::underlying_type<chromium::web::LogLevel>::type>(
chromium::web::LogLevel::INFO):
LOG(INFO) << "info:" << message;
break;
case static_cast<std::underlying_type<chromium::web::LogLevel>::type>(
chromium::web::LogLevel::WARN):
LOG(WARNING) << "warn:" << message;
break;
case static_cast<std::underlying_type<chromium::web::LogLevel>::type>(
chromium::web::LogLevel::ERROR):
LOG(ERROR) << "error:" << message;
break;
default:
DLOG(WARNING) << "Unknown log level: " << level;
return false;
}
return true;
}
FrameImpl::OriginScopedScript::OriginScopedScript( FrameImpl::OriginScopedScript::OriginScopedScript(
std::vector<std::string> origins, std::vector<std::string> origins,
base::string16 script) base::string16 script)
......
...@@ -62,6 +62,7 @@ class FrameImpl : public chromium::web::Frame, ...@@ -62,6 +62,7 @@ class FrameImpl : public chromium::web::Frame,
void GetNavigationController( void GetNavigationController(
fidl::InterfaceRequest<chromium::web::NavigationController> controller) fidl::InterfaceRequest<chromium::web::NavigationController> controller)
override; override;
void SetJavaScriptLogLevel(chromium::web::LogLevel level) override;
// chromium::web::NavigationController implementation. // chromium::web::NavigationController implementation.
void LoadUrl(fidl::StringPtr url, void LoadUrl(fidl::StringPtr url,
...@@ -119,6 +120,11 @@ class FrameImpl : public chromium::web::Frame, ...@@ -119,6 +120,11 @@ class FrameImpl : public chromium::web::Frame,
content::SessionStorageNamespace* session_storage_namespace) override; content::SessionStorageNamespace* session_storage_namespace) override;
void ReadyToCommitNavigation( void ReadyToCommitNavigation(
content::NavigationHandle* navigation_handle) override; content::NavigationHandle* navigation_handle) override;
bool DidAddMessageToConsole(content::WebContents* source,
int32_t level,
const base::string16& message,
int32_t line_no,
const base::string16& source_id) override;
// content::WebContentsObserver implementation. // content::WebContentsObserver implementation.
void DidFinishLoad(content::RenderFrameHost* render_frame_host, void DidFinishLoad(content::RenderFrameHost* render_frame_host,
...@@ -133,6 +139,7 @@ class FrameImpl : public chromium::web::Frame, ...@@ -133,6 +139,7 @@ class FrameImpl : public chromium::web::Frame,
chromium::web::NavigationEvent pending_navigation_event_; chromium::web::NavigationEvent pending_navigation_event_;
bool waiting_for_navigation_event_ack_; bool waiting_for_navigation_event_ack_;
bool pending_navigation_event_is_dirty_; bool pending_navigation_event_is_dirty_;
chromium::web::LogLevel log_level_ = chromium::web::LogLevel::NONE;
std::list<OriginScopedScript> before_load_scripts_; std::list<OriginScopedScript> before_load_scripts_;
ContextImpl* context_ = nullptr; ContextImpl* context_ = nullptr;
......
...@@ -13,6 +13,14 @@ enum ExecuteMode { ...@@ -13,6 +13,14 @@ enum ExecuteMode {
ON_PAGE_LOAD = 2; // Will evaluate the script on all subsequent page loads. ON_PAGE_LOAD = 2; // Will evaluate the script on all subsequent page loads.
}; };
enum LogLevel {
NONE = 100; // No logging.
DEBUG = -1; // Outputs messages from console.debug().
INFO = 0; // Outputs messages from console.log().
WARN = 1; // Outputs messages from console.warn().
ERROR = 2; // Outputs messages from console.error().
};
interface Frame { interface Frame {
// Creates a new view using the specified |view_token|. Caller should pass the // Creates a new view using the specified |view_token|. Caller should pass the
// other end of the token to CreateViewHolderCmd() to attach the new view to a // other end of the token to CreateViewHolderCmd() to attach the new view to a
...@@ -66,4 +74,9 @@ interface Frame { ...@@ -66,4 +74,9 @@ interface Frame {
// |observer|: The observer to use. Unregisters any existing observers // |observer|: The observer to use. Unregisters any existing observers
// if null. // if null.
100: SetNavigationEventObserver(NavigationEventObserver? observer); 100: SetNavigationEventObserver(NavigationEventObserver? observer);
// If set to a value other than NONE, allows web content to log messages
// to the system logger using console.log(), console.info(), console.warn(),
// and console.error().
101: SetJavaScriptLogLevel(LogLevel level);
}; };
...@@ -83,6 +83,8 @@ class FakeFrame : public chromium::web::Frame { ...@@ -83,6 +83,8 @@ class FakeFrame : public chromium::web::Frame {
chromium::web::ExecuteMode mode, chromium::web::ExecuteMode mode,
ExecuteJavaScriptCallback callback) override {} ExecuteJavaScriptCallback callback) override {}
void SetJavaScriptLogLevel(chromium::web::LogLevel) override {}
private: private:
fidl::Binding<chromium::web::Frame> binding_; fidl::Binding<chromium::web::Frame> binding_;
chromium::web::NavigationEventObserverPtr observer_; chromium::web::NavigationEventObserverPtr observer_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment