Commit 2e428d03 authored by Daniel Nicoara's avatar Daniel Nicoara Committed by Chromium LUCI CQ

cast: webview: Fix UserAgent override on page navigation

As per WebContents::SetUserAgentOverride documentation navigation
entries need to be updated to allow user agent override.

Bug: b:175857659
Test: cast_shell_browsertests
Change-Id: Ic829c5130451d2afa4eda598b535c65997a458f0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2627883Reviewed-by: default avatarRyan Daum <rdaum@chromium.org>
Commit-Queue: Daniel Nicoara <dnicoara@chromium.org>
Cr-Commit-Position: refs/heads/master@{#843633}
parent 2e254bfb
...@@ -15,10 +15,12 @@ ...@@ -15,10 +15,12 @@
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h" #include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_base.h" #include "content/public/test/browser_test_base.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_context.h"
#include "content/public/test/web_contents_tester.h" #include "content/public/test/web_contents_tester.h"
#include "net/dns/mock_host_resolver.h" #include "net/dns/mock_host_resolver.h"
#include "net/http/http_status_code.h" #include "net/http/http_status_code.h"
#include "net/test/embedded_test_server/default_handlers.h"
#include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h" #include "net/test/embedded_test_server/http_response.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
...@@ -55,6 +57,7 @@ class WebviewTest : public content::BrowserTestBase { ...@@ -55,6 +57,7 @@ class WebviewTest : public content::BrowserTestBase {
} }
void SetUp() final { void SetUp() final {
SetUpCommandLine(base::CommandLine::ForCurrentProcess()); SetUpCommandLine(base::CommandLine::ForCurrentProcess());
net::test_server::RegisterDefaultHandlers(embedded_test_server());
embedded_test_server()->RegisterRequestHandler(base::BindRepeating( embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
&WebviewTest::HandleRequest, base::Unretained(this))); &WebviewTest::HandleRequest, base::Unretained(this)));
ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
...@@ -176,4 +179,64 @@ IN_PROC_BROWSER_TEST_F(WebviewTest, SetInsets) { ...@@ -176,4 +179,64 @@ IN_PROC_BROWSER_TEST_F(WebviewTest, SetInsets) {
RunMessageLoop(); RunMessageLoop();
} }
IN_PROC_BROWSER_TEST_F(WebviewTest, UserDataOverride) {
// Webview creation sends messages to the client (eg: accessibility ID).
EXPECT_CALL(client_, EnqueueSend(_)).Times(testing::AnyNumber());
WebviewController webview(context_.get(), &client_, true);
const std::string kHeaderPath =
std::string("/echoheader?") + net::HttpRequestHeaders::kUserAgent;
GURL test_url = embedded_test_server()->GetURL(kHeaderPath);
const std::string kUserAgentOverride = "bar";
auto check = [](const std::unique_ptr<webview::WebviewResponse>& response) {
return response->has_page_event() &&
response->page_event().current_page_state() ==
webview::AsyncPageEvent_State_LOADED;
};
EXPECT_CALL(client_, EnqueueSend(Truly(check)))
.Times(2)
.WillOnce([&](std::unique_ptr<webview::WebviewResponse> response) {
std::string header_value;
EXPECT_TRUE(ExecuteScriptAndExtractString(
webview.GetWebContents(),
"window.domAutomationController.send(document.body.textContent);",
&header_value));
EXPECT_NE(kUserAgentOverride, header_value);
webview::WebviewRequest update_settings;
update_settings.mutable_update_settings()->set_javascript_enabled(true);
update_settings.mutable_update_settings()
->mutable_user_agent()
->set_value(kUserAgentOverride);
webview.ProcessRequest(update_settings);
webview::WebviewRequest reload;
reload.mutable_reload();
webview.ProcessRequest(reload);
})
.WillOnce([&](std::unique_ptr<webview::WebviewResponse> response) {
std::string header_value;
EXPECT_TRUE(ExecuteScriptAndExtractString(
webview.GetWebContents(),
"window.domAutomationController.send(document.body.textContent);",
&header_value));
EXPECT_EQ(kUserAgentOverride, header_value);
Quit();
});
// Need to enable JS in order to extract the UserAgent string from the loaded
// web page.
webview::WebviewRequest update_settings;
update_settings.mutable_update_settings()->set_javascript_enabled(true);
webview.ProcessRequest(update_settings);
webview::WebviewRequest navigate;
navigate.mutable_navigate()->set_url(test_url.spec());
webview.ProcessRequest(navigate);
RunMessageLoop();
}
} // namespace chromecast } // namespace chromecast
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#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"
#include "content/public/browser/browsing_data_remover.h" #include "content/public/browser/browsing_data_remover.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h" #include "content/public/browser/render_view_host.h"
...@@ -186,12 +187,21 @@ void WebviewController::HandleUpdateSettings( ...@@ -186,12 +187,21 @@ void WebviewController::HandleUpdateSettings(
CastWebContents::FromWebContents(contents)->SetEnabledForRemoteDebugging( CastWebContents::FromWebContents(contents)->SetEnabledForRemoteDebugging(
request.debugging_enabled() || enabled_for_dev_); request.debugging_enabled() || enabled_for_dev_);
if (request.has_user_agent() && const bool user_agent_overridden =
request.user_agent().type_case() == webview::UserAgent::kValue) { request.has_user_agent() &&
request.user_agent().type_case() == webview::UserAgent::kValue;
if (user_agent_overridden) {
contents->SetUserAgentOverride( contents->SetUserAgentOverride(
blink::UserAgentOverride::UserAgentOnly(request.user_agent().value()), blink::UserAgentOverride::UserAgentOnly(request.user_agent().value()),
true); true);
} }
content::NavigationController& controller = contents->GetController();
for (int i = 0; i < controller.GetEntryCount(); ++i) {
controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(
user_agent_overridden);
}
} }
void WebviewController::HandleSetAutoMediaPlaybackPolicy( void WebviewController::HandleSetAutoMediaPlaybackPolicy(
......
...@@ -64,6 +64,7 @@ class WebviewController : public CastWebContents::Delegate, ...@@ -64,6 +64,7 @@ class WebviewController : public CastWebContents::Delegate,
protected: protected:
FRIEND_TEST_ALL_PREFIXES(WebviewTest, SetInsets); FRIEND_TEST_ALL_PREFIXES(WebviewTest, SetInsets);
FRIEND_TEST_ALL_PREFIXES(WebviewTest, UserDataOverride);
content::WebContents* GetWebContents() override; content::WebContents* GetWebContents() override;
......
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