blob: eab108d7f6302d094589182c195e71f5832823c5 [file] [log] [blame]
// Copyright (c) 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ios/chrome/browser/web/chrome_web_client.h"
#import <UIKit/UIKit.h>
#include <memory>
#include "base/command_line.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string_split.h"
#include "base/strings/sys_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/scoped_task_environment.h"
#include "components/payments/core/features.h"
#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
#include "ios/chrome/browser/passwords/credential_manager_features.h"
#import "ios/web/public/test/js_test_util.h"
#include "ios/web/public/test/scoped_testing_web_client.h"
#import "ios/web/public/web_view_creation_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gtest_mac.h"
#include "testing/platform_test.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
class ChromeWebClientTest : public PlatformTest {
public:
ChromeWebClientTest() {
browser_state_ = TestChromeBrowserState::Builder().Build();
}
~ChromeWebClientTest() override = default;
ios::ChromeBrowserState* browser_state() { return browser_state_.get(); }
private:
base::test::ScopedTaskEnvironment environment_;
std::unique_ptr<ios::ChromeBrowserState> browser_state_;
DISALLOW_COPY_AND_ASSIGN(ChromeWebClientTest);
};
TEST_F(ChromeWebClientTest, UserAgent) {
std::vector<std::string> pieces;
// Check if the pieces of the user agent string come in the correct order.
ChromeWebClient web_client;
std::string buffer = web_client.GetUserAgent(web::UserAgentType::MOBILE);
pieces = base::SplitStringUsingSubstr(
buffer, "Mozilla/5.0 (", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
ASSERT_EQ(2u, pieces.size());
buffer = pieces[1];
EXPECT_EQ("", pieces[0]);
pieces = base::SplitStringUsingSubstr(
buffer, ") AppleWebKit/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
ASSERT_EQ(2u, pieces.size());
buffer = pieces[1];
std::string os_str = pieces[0];
pieces =
base::SplitStringUsingSubstr(buffer, " (KHTML, like Gecko) ",
base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
ASSERT_EQ(2u, pieces.size());
buffer = pieces[1];
std::string webkit_version_str = pieces[0];
pieces = base::SplitStringUsingSubstr(
buffer, " Safari/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
ASSERT_EQ(2u, pieces.size());
std::string product_str = pieces[0];
std::string safari_version_str = pieces[1];
// Not sure what can be done to better check the OS string, since it's highly
// platform-dependent.
EXPECT_FALSE(os_str.empty());
EXPECT_FALSE(webkit_version_str.empty());
EXPECT_FALSE(safari_version_str.empty());
EXPECT_EQ(0u, product_str.find("CriOS/"));
}
// Tests that ChromeWebClient provides print script for WKWebView.
TEST_F(ChromeWebClientTest, WKWebViewEarlyPageScriptPrint) {
// Chrome scripts rely on __gCrWeb object presence.
WKWebView* web_view = web::BuildWKWebView(CGRectZero, browser_state());
web::ExecuteJavaScript(web_view, @"__gCrWeb = {};");
web::ScopedTestingWebClient web_client(base::MakeUnique<ChromeWebClient>());
NSString* script =
web_client.Get()->GetEarlyPageScriptForMainFrame(browser_state());
web::ExecuteJavaScript(web_view, script);
EXPECT_NSEQ(@"object",
web::ExecuteJavaScript(web_view, @"typeof __gCrWeb.print"));
}
// Tests that ChromeWebClient provides autofill controller script for WKWebView.
TEST_F(ChromeWebClientTest, WKWebViewEarlyPageScriptAutofillController) {
// Chrome scripts rely on __gCrWeb object presence.
WKWebView* web_view = web::BuildWKWebView(CGRectZero, browser_state());
web::ExecuteJavaScript(web_view, @"__gCrWeb = {};");
web::ScopedTestingWebClient web_client(base::MakeUnique<ChromeWebClient>());
NSString* script =
web_client.Get()->GetEarlyPageScriptForMainFrame(browser_state());
web::ExecuteJavaScript(web_view, script);
EXPECT_NSEQ(@"object",
web::ExecuteJavaScript(web_view, @"typeof __gCrWeb.autofill"));
}
// Tests that ChromeWebClient provides credential manager script for WKWebView
// if and only if the feature is enabled.
TEST_F(ChromeWebClientTest, WKWebViewEarlyPageScriptCredentialManager) {
// Chrome scripts rely on __gCrWeb object presence.
WKWebView* web_view = web::BuildWKWebView(CGRectZero, browser_state());
web::ExecuteJavaScript(web_view, @"__gCrWeb = {};");
web::ScopedTestingWebClient web_client(base::MakeUnique<ChromeWebClient>());
NSString* script =
web_client.Get()->GetEarlyPageScriptForMainFrame(browser_state());
web::ExecuteJavaScript(web_view, script);
EXPECT_NSEQ(@"undefined", web::ExecuteJavaScript(
web_view, @"typeof navigator.credentials"));
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(features::kCredentialManager);
script = web_client.Get()->GetEarlyPageScriptForMainFrame(browser_state());
web::ExecuteJavaScript(web_view, script);
EXPECT_NSEQ(@"object", web::ExecuteJavaScript(
web_view, @"typeof navigator.credentials"));
}
// Tests that ChromeWebClient provides payment request script for WKWebView if
// the feature is enabled.
TEST_F(ChromeWebClientTest, WKWebViewEarlyPageScriptPaymentRequestEnabled) {
// Chrome scripts rely on __gCrWeb object presence.
WKWebView* web_view = web::BuildWKWebView(CGRectZero, browser_state());
web::ExecuteJavaScript(web_view, @"__gCrWeb = {};");
web::ScopedTestingWebClient web_client(base::MakeUnique<ChromeWebClient>());
base::test::ScopedFeatureList feature_list;
feature_list.InitAndEnableFeature(payments::features::kWebPayments);
NSString* script =
web_client.Get()->GetEarlyPageScriptForMainFrame(browser_state());
web::ExecuteJavaScript(web_view, script);
EXPECT_NSEQ(@"function", web::ExecuteJavaScript(
web_view, @"typeof window.PaymentRequest"));
}
// Tests that ChromeWebClient does not provide payment request script for
// WKWebView if the feature is disabled.
TEST_F(ChromeWebClientTest, WKWebViewEarlyPageScriptPaymentRequestDisabled) {
// Chrome scripts rely on __gCrWeb object presence.
WKWebView* web_view = web::BuildWKWebView(CGRectZero, browser_state());
web::ExecuteJavaScript(web_view, @"__gCrWeb = {};");
web::ScopedTestingWebClient web_client(base::MakeUnique<ChromeWebClient>());
base::test::ScopedFeatureList feature_list;
feature_list.InitAndDisableFeature(payments::features::kWebPayments);
NSString* script =
web_client.Get()->GetEarlyPageScriptForMainFrame(browser_state());
web::ExecuteJavaScript(web_view, script);
EXPECT_NSEQ(@"undefined", web::ExecuteJavaScript(
web_view, @"typeof window.PaymentRequest"));
}
} // namespace