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 { ...@@ -391,6 +391,10 @@ class CastWebContents {
virtual void AddObserver(Observer* observer) = 0; virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(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. // Used to expose CastWebContents's |binder_registry_| to Delegate.
// Delegate should register its mojo interface binders via this function // Delegate should register its mojo interface binders via this function
// when it is ready. // when it is ready.
......
...@@ -454,6 +454,24 @@ void CastWebContentsImpl::RemoveObserver(CastWebContents::Observer* observer) { ...@@ -454,6 +454,24 @@ void CastWebContentsImpl::RemoveObserver(CastWebContents::Observer* observer) {
observer_list_.RemoveObserver(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() { service_manager::BinderRegistry* CastWebContentsImpl::binder_registry() {
return &binder_registry_; return &binder_registry_;
} }
......
...@@ -87,6 +87,7 @@ class CastWebContentsImpl : public CastWebContents, ...@@ -87,6 +87,7 @@ class CastWebContentsImpl : public CastWebContents,
base::OnceCallback<void(base::Value)> callback) override; base::OnceCallback<void(base::Value)> callback) override;
void AddObserver(Observer* observer) override; void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override;
void SetEnabledForRemoteDebugging(bool enabled) override;
bool is_websql_enabled() override; bool is_websql_enabled() override;
bool is_mixer_audio_enabled() override; bool is_mixer_audio_enabled() override;
bool can_bind_interfaces() override; bool can_bind_interfaces() override;
...@@ -170,7 +171,7 @@ class CastWebContentsImpl : public CastWebContents, ...@@ -170,7 +171,7 @@ class CastWebContentsImpl : public CastWebContents,
base::WeakPtr<Delegate> delegate_; base::WeakPtr<Delegate> delegate_;
PageState page_state_; PageState page_state_;
PageState last_state_; PageState last_state_;
const bool enabled_for_dev_; bool enabled_for_dev_;
content::mojom::RendererType renderer_type_; content::mojom::RendererType renderer_type_;
const bool handle_inner_contents_; const bool handle_inner_contents_;
BackgroundColor view_background_color_; BackgroundColor view_background_color_;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/json/json_writer.h" #include "base/json/json_writer.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chromecast/base/version.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/proto/webview.pb.h"
#include "chromecast/browser/webview/webview_navigation_throttle.h" #include "chromecast/browser/webview/webview_navigation_throttle.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
...@@ -122,14 +123,6 @@ void WebContentController::ProcessRequest( ...@@ -122,14 +123,6 @@ void WebContentController::ProcessRequest(
HandleClearCache(); HandleClearCache();
break; 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: case webview::WebviewRequest::kGetTitle:
HandleGetTitle(request.id()); HandleGetTitle(request.id());
break; break;
...@@ -398,28 +391,6 @@ void WebContentController::HandleGetTitle(int64_t id) { ...@@ -398,28 +391,6 @@ void WebContentController::HandleGetTitle(int64_t id) {
client_->EnqueueSend(std::move(response)); 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( void WebContentController::HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request) { const webview::SetAutoMediaPlaybackPolicyRequest& request) {
content::WebContents* contents = GetWebContents(); content::WebContents* contents = GetWebContents();
......
...@@ -97,7 +97,6 @@ class WebContentController ...@@ -97,7 +97,6 @@ class WebContentController
void HandleCanGoForward(int64_t id); void HandleCanGoForward(int64_t id);
void HandleClearCache(); void HandleClearCache();
void HandleGetTitle(int64_t id); void HandleGetTitle(int64_t id);
void HandleUpdateSettings(const webview::UpdateSettingsRequest& request);
void HandleSetAutoMediaPlaybackPolicy( void HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request); const webview::SetAutoMediaPlaybackPolicyRequest& request);
void HandleResize(const gfx::Size& size); void HandleResize(const gfx::Size& size);
......
...@@ -47,7 +47,7 @@ class WebviewUserData : public base::SupportsUserData::Data { ...@@ -47,7 +47,7 @@ class WebviewUserData : public base::SupportsUserData::Data {
WebviewController::WebviewController(content::BrowserContext* browser_context, WebviewController::WebviewController(content::BrowserContext* browser_context,
Client* client, Client* client,
bool enabled_for_dev) bool enabled_for_dev)
: WebContentController(client) { : WebContentController(client), enabled_for_dev_(enabled_for_dev) {
content::WebContents::CreateParams create_params(browser_context, nullptr); content::WebContents::CreateParams create_params(browser_context, nullptr);
contents_ = content::WebContents::Create(create_params); contents_ = content::WebContents::Create(create_params);
contents_->SetUserData(kWebviewResponseUserDataKey, contents_->SetUserData(kWebviewResponseUserDataKey,
...@@ -118,12 +118,41 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) { ...@@ -118,12 +118,41 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) {
} }
break; break;
case webview::WebviewRequest::kUpdateSettings:
if (request.has_update_settings()) {
HandleUpdateSettings(request.update_settings());
} else {
client_->OnError("update_settings() not supplied");
}
break;
default: default:
WebContentController::ProcessRequest(request); WebContentController::ProcessRequest(request);
break; 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() { void WebviewController::DidFirstVisuallyNonEmptyPaint() {
if (client_) { if (client_) {
std::unique_ptr<webview::WebviewResponse> response = std::unique_ptr<webview::WebviewResponse> response =
......
...@@ -65,6 +65,8 @@ class WebviewController : public CastWebContents::Delegate, ...@@ -65,6 +65,8 @@ class WebviewController : public CastWebContents::Delegate,
content::WebContents* GetWebContents() override; content::WebContents* GetWebContents() override;
private: private:
void HandleUpdateSettings(const webview::UpdateSettingsRequest& request);
webview::AsyncPageEvent_State current_state(); webview::AsyncPageEvent_State current_state();
// CastWebContents::Delegate // CastWebContents::Delegate
...@@ -78,6 +80,7 @@ class WebviewController : public CastWebContents::Delegate, ...@@ -78,6 +80,7 @@ class WebviewController : public CastWebContents::Delegate,
// content::WebContentsObserver // content::WebContentsObserver
void DidFirstVisuallyNonEmptyPaint() override; void DidFirstVisuallyNonEmptyPaint() override;
const bool enabled_for_dev_;
std::unique_ptr<content::WebContents> contents_; std::unique_ptr<content::WebContents> contents_;
std::unique_ptr<CastWebContents> cast_web_contents_; std::unique_ptr<CastWebContents> cast_web_contents_;
bool stopped_ = false; 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