Commit 52c9f713 authored by Ryan Daum's avatar Ryan Daum Committed by Commit Bot

[chromecast] Allow webviews to request remote devtool debugging

Gives hosted webviews the same facility that normal cast applications
have to enable devtools debugging for themselves and their inner
contents.

Bug: internal b/152230325
Test: manual
Change-Id: I80b60c0d26d5de6183325c7dfb36ced3b459de35
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2136140
Commit-Queue: Ryan Daum <rdaum@chromium.org>
Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Reviewed-by: default avatarSean Topping <seantopping@chromium.org>
Cr-Commit-Position: refs/heads/master@{#756823}
parent 9ce08f18
......@@ -391,6 +391,10 @@ class CastWebContents {
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
// Enable or disable devtools remote debugging for this WebContents and any
// inner WebContents that are spawned from it.
virtual void SetEnabledForRemoteDebugging(bool enabled) = 0;
// Used to expose CastWebContents's |binder_registry_| to Delegate.
// Delegate should register its mojo interface binders via this function
// when it is ready.
......
......@@ -454,6 +454,24 @@ void CastWebContentsImpl::RemoveObserver(CastWebContents::Observer* observer) {
observer_list_.RemoveObserver(observer);
}
void CastWebContentsImpl::SetEnabledForRemoteDebugging(bool enabled) {
DCHECK(remote_debugging_server_);
if (enabled && !enabled_for_dev_) {
LOG(INFO) << "Enabling dev console for CastWebContentsImpl";
remote_debugging_server_->EnableWebContentsForDebugging(web_contents_);
} else if (!enabled && enabled_for_dev_) {
LOG(INFO) << "Disabling dev console for CastWebContentsImpl";
remote_debugging_server_->DisableWebContentsForDebugging(web_contents_);
}
enabled_for_dev_ = enabled;
// Propagate setting change to inner contents.
for (auto& inner : inner_contents_) {
inner->SetEnabledForRemoteDebugging(enabled);
}
}
service_manager::BinderRegistry* CastWebContentsImpl::binder_registry() {
return &binder_registry_;
}
......
......@@ -87,6 +87,7 @@ class CastWebContentsImpl : public CastWebContents,
base::OnceCallback<void(base::Value)> callback) override;
void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override;
void SetEnabledForRemoteDebugging(bool enabled) override;
bool is_websql_enabled() override;
bool is_mixer_audio_enabled() override;
bool can_bind_interfaces() override;
......@@ -170,7 +171,7 @@ class CastWebContentsImpl : public CastWebContents,
base::WeakPtr<Delegate> delegate_;
PageState page_state_;
PageState last_state_;
const bool enabled_for_dev_;
bool enabled_for_dev_;
content::mojom::RendererType renderer_type_;
const bool handle_inner_contents_;
BackgroundColor view_background_color_;
......
......@@ -9,6 +9,7 @@
#include "base/json/json_writer.h"
#include "base/strings/utf_string_conversions.h"
#include "chromecast/base/version.h"
#include "chromecast/browser/cast_web_contents.h"
#include "chromecast/browser/webview/proto/webview.pb.h"
#include "chromecast/browser/webview/webview_navigation_throttle.h"
#include "content/public/browser/browser_context.h"
......@@ -122,14 +123,6 @@ void WebContentController::ProcessRequest(
HandleClearCache();
break;
case webview::WebviewRequest::kUpdateSettings:
if (request.has_update_settings()) {
HandleUpdateSettings(request.update_settings());
} else {
client_->OnError("update_settings() not supplied");
}
break;
case webview::WebviewRequest::kGetTitle:
HandleGetTitle(request.id());
break;
......@@ -398,28 +391,6 @@ void WebContentController::HandleGetTitle(int64_t id) {
client_->EnqueueSend(std::move(response));
}
void WebContentController::HandleUpdateSettings(
const webview::UpdateSettingsRequest& request) {
content::WebContents* contents = GetWebContents();
content::WebPreferences prefs =
contents->GetRenderViewHost()->GetWebkitPreferences();
prefs.javascript_enabled = request.javascript_enabled();
contents->GetRenderViewHost()->UpdateWebkitPreferences(prefs);
has_navigation_delegate_ = request.has_navigation_delegate();
// Given that cast_shell enables devtools unconditionally there isn't
// anything that needs to be done for |request.debugging_enabled()|. Though,
// as a note, remote debugging is always on.
if (request.has_user_agent() &&
request.user_agent().type_case() == webview::UserAgent::kValue) {
contents->SetUserAgentOverride(
blink::UserAgentOverride::UserAgentOnly(request.user_agent().value()),
true);
}
}
void WebContentController::HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request) {
content::WebContents* contents = GetWebContents();
......
......@@ -97,7 +97,6 @@ class WebContentController
void HandleCanGoForward(int64_t id);
void HandleClearCache();
void HandleGetTitle(int64_t id);
void HandleUpdateSettings(const webview::UpdateSettingsRequest& request);
void HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request);
void HandleResize(const gfx::Size& size);
......
......@@ -47,7 +47,7 @@ class WebviewUserData : public base::SupportsUserData::Data {
WebviewController::WebviewController(content::BrowserContext* browser_context,
Client* client,
bool enabled_for_dev)
: WebContentController(client) {
: WebContentController(client), enabled_for_dev_(enabled_for_dev) {
content::WebContents::CreateParams create_params(browser_context, nullptr);
contents_ = content::WebContents::Create(create_params);
contents_->SetUserData(kWebviewResponseUserDataKey,
......@@ -118,12 +118,41 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) {
}
break;
case webview::WebviewRequest::kUpdateSettings:
if (request.has_update_settings()) {
HandleUpdateSettings(request.update_settings());
} else {
client_->OnError("update_settings() not supplied");
}
break;
default:
WebContentController::ProcessRequest(request);
break;
}
}
void WebviewController::HandleUpdateSettings(
const webview::UpdateSettingsRequest& request) {
content::WebContents* contents = GetWebContents();
content::WebPreferences prefs =
contents->GetRenderViewHost()->GetWebkitPreferences();
prefs.javascript_enabled = request.javascript_enabled();
contents->GetRenderViewHost()->UpdateWebkitPreferences(prefs);
has_navigation_delegate_ = request.has_navigation_delegate();
CastWebContents::FromWebContents(contents)->SetEnabledForRemoteDebugging(
request.debugging_enabled() || enabled_for_dev_);
if (request.has_user_agent() &&
request.user_agent().type_case() == webview::UserAgent::kValue) {
contents->SetUserAgentOverride(
blink::UserAgentOverride::UserAgentOnly(request.user_agent().value()),
true);
}
}
void WebviewController::DidFirstVisuallyNonEmptyPaint() {
if (client_) {
std::unique_ptr<webview::WebviewResponse> response =
......
......@@ -65,6 +65,8 @@ class WebviewController : public CastWebContents::Delegate,
content::WebContents* GetWebContents() override;
private:
void HandleUpdateSettings(const webview::UpdateSettingsRequest& request);
webview::AsyncPageEvent_State current_state();
// CastWebContents::Delegate
......@@ -78,6 +80,7 @@ class WebviewController : public CastWebContents::Delegate,
// content::WebContentsObserver
void DidFirstVisuallyNonEmptyPaint() override;
const bool enabled_for_dev_;
std::unique_ptr<content::WebContents> contents_;
std::unique_ptr<CastWebContents> cast_web_contents_;
bool stopped_ = false;
......
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