Commit 62ee0f71 authored by Daniel Nicoara's avatar Daniel Nicoara Committed by Chromium LUCI CQ

cast: webview: Always allow user agent override in LoadUrl requests

This allows overriding the user agent if an override is set.

NOTE: This does require the caller to override the user agent in order
for it to happen. If the caller doesn't override, the default user agent
is used.

Bug: b:175857659
Test: cast_shell_browsertests
Change-Id: I713f01076baabe108b17e1d4934f7dc4259b7139
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2633705Reviewed-by: default avatarSean Topping <seantopping@chromium.org>
Commit-Queue: Daniel Nicoara <dnicoara@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844585}
parent 4ed36547
...@@ -179,6 +179,67 @@ IN_PROC_BROWSER_TEST_F(WebviewTest, SetInsets) { ...@@ -179,6 +179,67 @@ IN_PROC_BROWSER_TEST_F(WebviewTest, SetInsets) {
RunMessageLoop(); RunMessageLoop();
} }
IN_PROC_BROWSER_TEST_F(WebviewTest, UserDataOverrideOnFirstRequest) {
// 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_EQ(kUserAgentOverride, header_value);
// Send an update without the override so we can check that the caller
// can disable the override.
webview::WebviewRequest update_settings;
update_settings.mutable_update_settings()->set_javascript_enabled(true);
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_NE(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);
update_settings.mutable_update_settings()->mutable_user_agent()->set_value(
kUserAgentOverride);
webview.ProcessRequest(update_settings);
webview::WebviewRequest navigate;
navigate.mutable_navigate()->set_url(test_url.spec());
webview.ProcessRequest(navigate);
RunMessageLoop();
}
IN_PROC_BROWSER_TEST_F(WebviewTest, UserDataOverride) { IN_PROC_BROWSER_TEST_F(WebviewTest, UserDataOverride) {
// Webview creation sends messages to the client (eg: accessibility ID). // Webview creation sends messages to the client (eg: accessibility ID).
EXPECT_CALL(client_, EnqueueSend(_)).Times(testing::AnyNumber()); EXPECT_CALL(client_, EnqueueSend(_)).Times(testing::AnyNumber());
......
...@@ -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_controller.h"
#include "content/public/browser/navigation_entry.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"
...@@ -127,9 +128,7 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) { ...@@ -127,9 +128,7 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) {
switch (request.type_case()) { switch (request.type_case()) {
case webview::WebviewRequest::kNavigate: case webview::WebviewRequest::kNavigate:
if (request.has_navigate()) { if (request.has_navigate()) {
LOG(INFO) << "Navigate webview to " << request.navigate().url(); HandleLoadUrl(request.navigate());
stopped_ = false;
cast_web_contents_->LoadUrl(GURL(request.navigate().url()));
} else { } else {
client_->OnError("navigate() not supplied"); client_->OnError("navigate() not supplied");
} }
...@@ -174,6 +173,16 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) { ...@@ -174,6 +173,16 @@ void WebviewController::ProcessRequest(const webview::WebviewRequest& request) {
} }
} }
void WebviewController::HandleLoadUrl(const webview::NavigateRequest& request) {
LOG(INFO) << "Navigate webview to " << request.url();
stopped_ = false;
content::NavigationController::LoadURLParams params(GURL(request.url()));
params.transition_type = ui::PAGE_TRANSITION_TYPED;
params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE;
GetWebContents()->GetController().LoadURLWithParams(params);
}
void WebviewController::HandleUpdateSettings( void WebviewController::HandleUpdateSettings(
const webview::UpdateSettingsRequest& request) { const webview::UpdateSettingsRequest& request) {
content::WebContents* contents = GetWebContents(); content::WebContents* contents = GetWebContents();
......
...@@ -64,11 +64,13 @@ class WebviewController : public CastWebContents::Delegate, ...@@ -64,11 +64,13 @@ class WebviewController : public CastWebContents::Delegate,
protected: protected:
FRIEND_TEST_ALL_PREFIXES(WebviewTest, SetInsets); FRIEND_TEST_ALL_PREFIXES(WebviewTest, SetInsets);
FRIEND_TEST_ALL_PREFIXES(WebviewTest, UserDataOverrideOnFirstRequest);
FRIEND_TEST_ALL_PREFIXES(WebviewTest, UserDataOverride); FRIEND_TEST_ALL_PREFIXES(WebviewTest, UserDataOverride);
content::WebContents* GetWebContents() override; content::WebContents* GetWebContents() override;
private: private:
void HandleLoadUrl(const webview::NavigateRequest& request);
void HandleUpdateSettings(const webview::UpdateSettingsRequest& request); void HandleUpdateSettings(const webview::UpdateSettingsRequest& request);
void HandleSetAutoMediaPlaybackPolicy( void HandleSetAutoMediaPlaybackPolicy(
const webview::SetAutoMediaPlaybackPolicyRequest& request); const webview::SetAutoMediaPlaybackPolicyRequest& request);
......
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