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 @@
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.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/web_contents_tester.h"
#include "net/dns/mock_host_resolver.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_response.h"
#include "testing/gmock/include/gmock/gmock.h"
......@@ -55,6 +57,7 @@ class WebviewTest : public content::BrowserTestBase {
}
void SetUp() final {
SetUpCommandLine(base::CommandLine::ForCurrentProcess());
net::test_server::RegisterDefaultHandlers(embedded_test_server());
embedded_test_server()->RegisterRequestHandler(base::BindRepeating(
&WebviewTest::HandleRequest, base::Unretained(this)));
ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
......@@ -176,4 +179,64 @@ IN_PROC_BROWSER_TEST_F(WebviewTest, SetInsets) {
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
......@@ -17,6 +17,7 @@
#include "chromecast/browser/webview/webview_navigation_throttle.h"
#include "content/public/browser/browser_context.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/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
......@@ -186,12 +187,21 @@ void WebviewController::HandleUpdateSettings(
CastWebContents::FromWebContents(contents)->SetEnabledForRemoteDebugging(
request.debugging_enabled() || enabled_for_dev_);
if (request.has_user_agent() &&
request.user_agent().type_case() == webview::UserAgent::kValue) {
const bool user_agent_overridden =
request.has_user_agent() &&
request.user_agent().type_case() == webview::UserAgent::kValue;
if (user_agent_overridden) {
contents->SetUserAgentOverride(
blink::UserAgentOverride::UserAgentOnly(request.user_agent().value()),
true);
}
content::NavigationController& controller = contents->GetController();
for (int i = 0; i < controller.GetEntryCount(); ++i) {
controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(
user_agent_overridden);
}
}
void WebviewController::HandleSetAutoMediaPlaybackPolicy(
......
......@@ -64,6 +64,7 @@ class WebviewController : public CastWebContents::Delegate,
protected:
FRIEND_TEST_ALL_PREFIXES(WebviewTest, SetInsets);
FRIEND_TEST_ALL_PREFIXES(WebviewTest, UserDataOverride);
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