Skip to content
This repository was archived by the owner on May 10, 2024. It is now read-only.

Fix #2210: UserAgent refactor, start using Safari's UA #2309

Merged
merged 3 commits into from
Feb 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions Brave_iPad.xctestplan
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"configurations" : [
{
"id" : "B360D002-AA9A-450B-99E4-F48566469CC5",
"name" : "Configuration 1",
"options" : {

}
}
],
"defaultOptions" : {

},
"testTargets" : [
{
"selectedTests" : [
"UserAgentTests\/testBraveWebViewUserAgentOnPhone()",
"UserAgentTests\/testDesktopUserAgent()",
"UserAgentTests\/testFirstUAPart()",
"UserAgentTests\/testIpadMobileUserAgent()"
],
"target" : {
"containerPath" : "container:Client.xcodeproj",
"identifier" : "F84B21D21A090F8100AAB793",
"name" : "ClientTests"
}
}
],
"version" : 1
}
14 changes: 10 additions & 4 deletions Client.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@
0A6112AC230B00E7001BBC45 /* OnboardingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6112AB230B00E7001BBC45 /* OnboardingNavigationController.swift */; };
0A6112BD230B4306001BBC45 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6112BC230B4306001BBC45 /* OnboardingViewController.swift */; };
0A62A355238C6F3E008902E3 /* Bookmark+Restoration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A62A354238C6F3E008902E3 /* Bookmark+Restoration.swift */; };
0A66550A23E9D9750047EF2A /* UserAgent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A66550923E9D9750047EF2A /* UserAgent.swift */; };
0A66550C23E9E04F0047EF2A /* UserAgentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A66550B23E9E04F0047EF2A /* UserAgentTests.swift */; };
0A764F31230EE5CA003A1D9B /* OnboardingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A764F30230EE5CA003A1D9B /* OnboardingState.swift */; };
0A771D35218C8FDC00336E0D /* Bookmark+Sync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A771D34218C8FDC00336E0D /* Bookmark+Sync.swift */; };
0A7B5D6722689C5D00AADF22 /* AddEditHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7B5D6622689C5D00AADF22 /* AddEditHeaderView.swift */; };
Expand Down Expand Up @@ -920,7 +922,6 @@
E65075BC1E37F7AB006961AC /* SupportUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E650758D1E37F7AB006961AC /* SupportUtils.swift */; };
E65075BD1E37F7AB006961AC /* SystemUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E650758E1E37F7AB006961AC /* SystemUtils.swift */; };
E65075BE1E37F7AB006961AC /* TimeConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = E650758F1E37F7AB006961AC /* TimeConstants.swift */; };
E65075BF1E37F7AB006961AC /* UserAgent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65075901E37F7AB006961AC /* UserAgent.swift */; };
E65075C01E37F7AB006961AC /* WeakList.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65075911E37F7AB006961AC /* WeakList.swift */; };
E65075C21E37F956006961AC /* ExtensionUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65075C11E37F956006961AC /* ExtensionUtils.swift */; };
E653422D1C5944F90039DD9E /* BrowserPrompts.swift in Sources */ = {isa = PBXBuildFile; fileRef = E653422C1C5944F90039DD9E /* BrowserPrompts.swift */; };
Expand Down Expand Up @@ -1313,6 +1314,9 @@
0A6112AB230B00E7001BBC45 /* OnboardingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNavigationController.swift; sourceTree = "<group>"; };
0A6112BC230B4306001BBC45 /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = "<group>"; };
0A62A354238C6F3E008902E3 /* Bookmark+Restoration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bookmark+Restoration.swift"; sourceTree = "<group>"; };
0A66550923E9D9750047EF2A /* UserAgent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAgent.swift; sourceTree = "<group>"; };
0A66550B23E9E04F0047EF2A /* UserAgentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAgentTests.swift; sourceTree = "<group>"; };
0A66550D23E9EA540047EF2A /* Brave_iPad.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = Brave_iPad.xctestplan; sourceTree = "<group>"; };
0A67500A23571F21006A6D00 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Storage.strings; sourceTree = "<group>"; };
0A6E095E230E05BC00AB3F19 /* onboarding-shields.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "onboarding-shields.json"; sourceTree = "<group>"; };
0A75A3BD23571F2B00013540 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Storage.strings"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2393,7 +2397,6 @@
E650758D1E37F7AB006961AC /* SupportUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportUtils.swift; sourceTree = "<group>"; };
E650758E1E37F7AB006961AC /* SystemUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemUtils.swift; sourceTree = "<group>"; };
E650758F1E37F7AB006961AC /* TimeConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimeConstants.swift; sourceTree = "<group>"; };
E65075901E37F7AB006961AC /* UserAgent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserAgent.swift; sourceTree = "<group>"; };
E65075911E37F7AB006961AC /* WeakList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeakList.swift; sourceTree = "<group>"; };
E65075C11E37F956006961AC /* ExtensionUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionUtils.swift; sourceTree = "<group>"; };
E653422C1C5944F90039DD9E /* BrowserPrompts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BrowserPrompts.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -4394,6 +4397,7 @@
5E34780F22D7A1D200B0D5F8 /* ResourceDownloadManager.swift */,
5E4845C122DE3DF800372022 /* WindowRenderHelperScript.swift */,
0A19365323508756002E2B81 /* LinkPreviewViewController.swift */,
0A66550923E9D9750047EF2A /* UserAgent.swift */,
);
indentWidth = 4;
path = Browser;
Expand Down Expand Up @@ -4437,7 +4441,6 @@
E650758D1E37F7AB006961AC /* SupportUtils.swift */,
E650758E1E37F7AB006961AC /* SystemUtils.swift */,
E650758F1E37F7AB006961AC /* TimeConstants.swift */,
E65075901E37F7AB006961AC /* UserAgent.swift */,
0ADCD4512319640F0078CC67 /* UserAgentBuilder.swift */,
E65075911E37F7AB006961AC /* WeakList.swift */,
2760D2BE215ACCE20068E131 /* BundleExtensions.swift */,
Expand Down Expand Up @@ -4619,6 +4622,7 @@
isa = PBXGroup;
children = (
0A60A1882358AF9E00953CA8 /* Fennec.xctestplan */,
0A66550D23E9EA540047EF2A /* Brave_iPad.xctestplan */,
0A24F7DE233E8EF2004D2F3A /* Config */,
F84B21C01A090F8100AAB793 /* Client */,
F84B21D61A090F8100AAB793 /* ClientTests */,
Expand Down Expand Up @@ -4723,6 +4727,7 @@
F939FBFD22A596B900D9CD3F /* U2FTests.swift */,
5E9288C922DF864C007BE7A6 /* TabSessionTests.swift */,
E61453BD1B750A1700C3F9D7 /* RollingFileLoggerTests.swift */,
0A66550B23E9E04F0047EF2A /* UserAgentTests.swift */,
);
path = ClientTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -5871,7 +5876,6 @@
EB7FFFC820A9D38D003E1E34 /* AlertController.swift in Sources */,
E65075BC1E37F7AB006961AC /* SupportUtils.swift in Sources */,
E65075B61E37F7AB006961AC /* Loader.swift in Sources */,
E65075BF1E37F7AB006961AC /* UserAgent.swift in Sources */,
E65075C01E37F7AB006961AC /* WeakList.swift in Sources */,
E65075AE1E37F7AB006961AC /* UIImageExtensions.swift in Sources */,
E65075A71E37F7AB006961AC /* ScannerExtensions.swift in Sources */,
Expand Down Expand Up @@ -6332,6 +6336,7 @@
4422D4F021BFFB7600BF1855 /* write_batch.cc in Sources */,
E68AEDB01B18F81A00133D99 /* SwipeAnimator.swift in Sources */,
0AEFB8532226D7C5007AF600 /* AdblockResourcesMappings.swift in Sources */,
0A66550A23E9D9750047EF2A /* UserAgent.swift in Sources */,
3BF56D271CDBBE1F00AC4D75 /* SimpleToast.swift in Sources */,
D31F95E91AC226CB005C9F3B /* ScreenshotHelper.swift in Sources */,
28EADE5D1AFC3A78007FB2FB /* UIImageViewExtensions.swift in Sources */,
Expand Down Expand Up @@ -6456,6 +6461,7 @@
39236E721FCC600200A38F1B /* TabEventHandlerTests.swift in Sources */,
2F13E79B1AC0C02700D75081 /* StringExtensionsTests.swift in Sources */,
59350AFB22612D95004D7445 /* DisplayTextFieldTest.swift in Sources */,
0A66550C23E9E04F0047EF2A /* UserAgentTests.swift in Sources */,
2FDB10931A9FBEC5006CF312 /* PrefsTests.swift in Sources */,
D8EFFA261FF702A8001D3A09 /* NavigationRouterTests.swift in Sources */,
F939FBFE22A596B900D9CD3F /* U2FTests.swift in Sources */,
Expand Down
3 changes: 3 additions & 0 deletions Client.xcodeproj/xcshareddata/xcschemes/Fennec.xcscheme
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@
reference = "container:Client.xcodeproj/Fennec.xctestplan"
default = "YES">
</TestPlanReference>
<TestPlanReference
reference = "container:Brave_iPad.xctestplan">
</TestPlanReference>
</TestPlans>
<Testables>
<TestableReference
Expand Down
3 changes: 2 additions & 1 deletion Client/Application/ClientPreferences.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ extension Preferences {
static let themePrivateMode = Option<String>(key: "general.private-mode-theme", default: Theme.DefaultTheme.private.rawValue)
/// Specifies whether the bookmark button is present on toolbar
static let showBookmarkToolbarShortcut = Option<Bool>(key: "general.show-bookmark-toolbar-shortcut", default: UIDevice.isIpad)
/// Sets Desktop UA for iPad by default (iOS 13+ & iPad only)
/// Sets Desktop UA for iPad by default (iOS 13+ & iPad only).
/// Do not read it directly, prefer to use `UserAgent.shouldUseDesktopMode` instead.
static let alwaysRequestDesktopSite = Option<Bool>(key: "general.always-request-desktop-site", default: UIDevice.isIpad)
/// Controls whether or not media auto-plays
static let mediaAutoPlays = Option<Bool>(key: "general.media-auto-plays", default: false)
Expand Down
13 changes: 5 additions & 8 deletions Client/Application/Delegates/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -409,23 +409,20 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UIViewControllerRestorati
}

fileprivate func setUserAgent() {
let firefoxUA = UserAgent.defaultUserAgent()
let userAgent = UserAgent.userAgentForDesktopMode

// Set the UA for WKWebView (via defaults), the favicon fetcher, and the image loader.
// Set the favicon fetcher, and the image loader.
// This only needs to be done once per runtime. Note that we use defaults here that are
// readable from extensions, so they can just use the cached identifier.

let defaults = UserDefaults(suiteName: AppInfo.sharedContainerIdentifier)!
defaults.register(defaults: ["UserAgent": firefoxUA])

SDWebImageDownloader.shared().setValue(firefoxUA, forHTTPHeaderField: "User-Agent")
SDWebImageDownloader.shared().setValue(userAgent, forHTTPHeaderField: "User-Agent")

// Record the user agent for use by search suggestion clients.
SearchViewController.userAgent = firefoxUA
SearchViewController.userAgent = userAgent

// Some sites will only serve HTML that points to .ico files.
// The FaviconFetcher is explicitly for getting high-res icons, so use the desktop user agent.
FaviconFetcher.userAgent = UserAgent.desktopUserAgent()
FaviconFetcher.userAgent = UserAgent.desktop
}

fileprivate func presentEmailComposerWithLogs() {
Expand Down
2 changes: 2 additions & 0 deletions Client/Frontend/Browser/BraveWebView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class BraveWebView: WKWebView {
}

super.init(frame: frame, configuration: configuration)

customUserAgent = UserAgent.userAgentForDesktopMode
}

static func removeNonPersistentStore() {
Expand Down
42 changes: 4 additions & 38 deletions Client/Frontend/Browser/BrowserViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,6 @@ class BrowserViewController: UIViewController {

}


KeyboardHelper.defaultHelper.addDelegate(self)

webViewContainerBackdrop = UIView()
Expand Down Expand Up @@ -1126,7 +1125,6 @@ class BrowserViewController: UIViewController {
//Block all other contexts such as redirects, downloads, embed, linked, etc..
if visitType == .typed || visitType == .bookmark {
if let webView = tab.webView, let code = url.bookmarkletCodeComponent {
resetSpoofedUserAgentIfRequired(webView, newURL: url)
webView.evaluateJavaScript(code, completionHandler: { _, error in
if let error = error {
log.error(error)
Expand All @@ -1142,10 +1140,6 @@ class BrowserViewController: UIViewController {
return
}

if let webView = tab.webView {
resetSpoofedUserAgentIfRequired(webView, newURL: url)
}

tab.loadRequest(PrivilegedRequest(url: url) as URLRequest)
}
}
Expand Down Expand Up @@ -1405,26 +1399,6 @@ class BrowserViewController: UIViewController {
}
}

// MARK: User Agent Spoofing

func resetSpoofedUserAgentIfRequired(_ webView: WKWebView, newURL: URL) {
// Reset the UA when a different domain is being loaded
if webView.url?.host != newURL.host {
webView.customUserAgent = nil
}
}

func restoreSpoofedUserAgentIfRequired(_ webView: WKWebView, newRequest: URLRequest) {
// Restore any non-default UA from the request's header
let ua = newRequest.value(forHTTPHeaderField: "User-Agent")

if #available(iOS 13.0, *) {
webView.customUserAgent = Preferences.General.alwaysRequestDesktopSite.value == UserAgent.isDesktopUA(ua) ? nil : ua
} else {
webView.customUserAgent = ua == UserAgent.defaultUserAgent() ? nil : ua
}
}

fileprivate func presentActivityViewController(_ url: URL, tab: Tab? = nil, sourceView: UIView?, sourceRect: CGRect, arrowDirection: UIPopoverArrowDirection) {
let helper = ShareExtensionHelper(url: url, tab: tab)

Expand All @@ -1433,7 +1407,7 @@ class BrowserViewController: UIViewController {
}

let requestDesktopSiteActivity = RequestDesktopSiteActivity(tab: tab) { [weak tab] in
tab?.toggleDesktopSite()
tab?.switchUserAgent()
}

var activities: [UIActivity] = [findInPageActivity]
Expand Down Expand Up @@ -1561,15 +1535,6 @@ class BrowserViewController: UIViewController {
}
}
}

// Remember whether or not a desktop site was requested
tab.desktopSite = UserAgent.isDesktopUA(webView.customUserAgent)

if #available(iOS 13.0, *), UIDevice.isIpad {
if webView.customUserAgent?.isEmpty == true {
tab.desktopSite = Preferences.General.alwaysRequestDesktopSite.value
}
}
}

private func focusLocationField() {
Expand Down Expand Up @@ -1752,9 +1717,10 @@ extension BrowserViewController: TopToolbarDelegate {
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
alert.addAction(UIAlertAction(title: Strings.cancelButtonTitle, style: .cancel, handler: nil))

let toggleActionTitle = tab.desktopSite ? Strings.appMenuViewMobileSiteTitleString : Strings.appMenuViewDesktopSiteTitleString
let toggleActionTitle = tab.isDesktopSite == true ?
Strings.appMenuViewMobileSiteTitleString : Strings.appMenuViewDesktopSiteTitleString
alert.addAction(UIAlertAction(title: toggleActionTitle, style: .default, handler: { _ in
tab.toggleDesktopSite()
tab.switchUserAgent()
}))

let generator = UIImpactFeedbackGenerator(style: .heavy)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,10 +191,8 @@ extension BrowserViewController: WKNavigationDelegate {
// always allow this. Additionally, data URIs are also handled just like normal web pages.

if ["http", "https", "data", "blob", "file"].contains(url.scheme) {
if navigationAction.navigationType == .linkActivated {
resetSpoofedUserAgentIfRequired(webView, newURL: url)
} else if navigationAction.navigationType == .backForward {
restoreSpoofedUserAgentIfRequired(webView, newRequest: navigationAction.request)
if navigationAction.targetFrame?.isMainFrame == true {
tabManager[webView]?.updateUserAgent(webView, newURL: url)
}

pendingRequests[url.absoluteString] = navigationAction.request
Expand Down Expand Up @@ -355,7 +353,6 @@ extension BrowserViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) {

self.webView(webView, decidePolicyFor: navigationAction) {
preferences.preferredContentMode = Preferences.General.alwaysRequestDesktopSite.value ? .desktop : .mobile
decisionHandler($0, preferences)
}
}
Expand Down
Loading