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):
r"^ui[\\/]base[\\/]resource[\\/]data_pack.cc$",
r"^ui[\\/]aura[\\/]bench[\\/]bench_main\.cc$",
r"^ui[\\/]ozone[\\/]platform[\\/]cast[\\/]",
r"^webrunner[\\/]browser[\\/]frame_impl.cc$",
r"^storage[\\/]browser[\\/]fileapi[\\/]" +
r"dump_file_system.cc$",
r"^headless[\\/]app[\\/]headless_shell\.cc$"))
......
......@@ -245,6 +245,10 @@ void FrameImpl::GetNavigationController(
controller_bindings_.AddBinding(this, std::move(controller));
}
void FrameImpl::SetJavaScriptLogLevel(chromium::web::LogLevel level) {
log_level_ = level;
}
void FrameImpl::LoadUrl(fidl::StringPtr url,
std::unique_ptr<chromium::web::LoadUrlParams> params) {
GURL validated_url(*url);
......@@ -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(
std::vector<std::string> origins,
base::string16 script)
......
......@@ -62,6 +62,7 @@ class FrameImpl : public chromium::web::Frame,
void GetNavigationController(
fidl::InterfaceRequest<chromium::web::NavigationController> controller)
override;
void SetJavaScriptLogLevel(chromium::web::LogLevel level) override;
// chromium::web::NavigationController implementation.
void LoadUrl(fidl::StringPtr url,
......@@ -119,6 +120,11 @@ class FrameImpl : public chromium::web::Frame,
content::SessionStorageNamespace* session_storage_namespace) override;
void ReadyToCommitNavigation(
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.
void DidFinishLoad(content::RenderFrameHost* render_frame_host,
......@@ -133,6 +139,7 @@ class FrameImpl : public chromium::web::Frame,
chromium::web::NavigationEvent pending_navigation_event_;
bool waiting_for_navigation_event_ack_;
bool pending_navigation_event_is_dirty_;
chromium::web::LogLevel log_level_ = chromium::web::LogLevel::NONE;
std::list<OriginScopedScript> before_load_scripts_;
ContextImpl* context_ = nullptr;
......
......@@ -13,6 +13,14 @@ enum ExecuteMode {
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 {
// 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
......@@ -66,4 +74,9 @@ interface Frame {
// |observer|: The observer to use. Unregisters any existing observers
// if null.
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 {
chromium::web::ExecuteMode mode,
ExecuteJavaScriptCallback callback) override {}
void SetJavaScriptLogLevel(chromium::web::LogLevel) override {}
private:
fidl::Binding<chromium::web::Frame> binding_;
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