Skip to content

Commit

Permalink
Fuchsia: Add Javascript logging support to Frame FIDL interface.
Browse files Browse the repository at this point in the history
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: Dirk Pranke <dpranke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606706}
  • Loading branch information
Kevin Marshall authored and Commit Bot committed Nov 9, 2018
1 parent f2d5503 commit a139bcc
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 0 deletions.
1 change: 1 addition & 0 deletions PRESUBMIT.py
Original file line number Diff line number Diff line change
Expand Up @@ -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$"))
Expand Down
42 changes: 42 additions & 0 deletions webrunner/browser/frame_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
7 changes: 7 additions & 0 deletions webrunner/browser/frame_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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;
Expand Down
13 changes: 13 additions & 0 deletions webrunner/fidl/web/frame.fidl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
};
2 changes: 2 additions & 0 deletions webrunner/service/context_provider_impl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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_;
Expand Down

0 comments on commit a139bcc

Please sign in to comment.