From d09b0279b39acf0da5586a3cbd12a6ce1c9a7ac5 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 28 Jan 2020 16:21:06 +0500 Subject: [PATCH 01/26] Update web view cookie with in-app selected language --- Source/AuthenticatedWebViewController.swift | 55 ++++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 9b4633807b..95973b999c 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -66,8 +66,34 @@ private class WKWebViewContentController : WebContentController { if let userAgent = UserDefaults.standard.string(forKey: "UserAgent"), webView.customUserAgent?.isEmpty ?? false { webView.customUserAgent = userAgent } - - webView.load(request as URLRequest) + + let languageCookieName = "prod-edx-language-preference" + let languageCookieValue = preferredLanguage + + if #available(iOS 11.0, *) { + guard let languageCookie = HTTPCookie(properties: [ + .domain: ".edx.org", + .path: "/", + .name: languageCookieName, + .value: languageCookieValue, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { return } + + webView.getCookie(with: languageCookieName) { cookie in + if cookie == nil { + self.webView.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self.webView.load(request as URLRequest) + } + } else { + self.webView.load(request as URLRequest) + } + } + } else { + var cookiedRequest = request as URLRequest + cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") + webView.load(cookiedRequest) + } } func resetState() { @@ -86,6 +112,15 @@ private class WKWebViewContentController : WebContentController { var isLoading: Bool { return webView.isLoading } + + var preferredLanguage: String { + guard let language = NSLocale.preferredLanguages.first, + let _ = Bundle.main.path(forResource: language, ofType: "lproj") else { + return "en" + } + + return language + } } private let OAuthExchangePath = "/oauth2/login/" @@ -355,3 +390,19 @@ public class AuthenticatedWebViewController: UIViewController, WKNavigationDeleg } } } + +@available(iOS 11.0, *) +extension WKWebView { + private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } + + func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { + httpCookieStore.getAllCookies { cookies in + for cookie in cookies { + if cookie.name.contains(name) { + completion(cookie) + } + } + } + completion(nil) + } +} From 19a70cf7208b24142c29569cba8f1821fae82296 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 28 Jan 2020 16:58:53 +0500 Subject: [PATCH 02/26] get preferred localizations from Bundle --- Source/AuthenticatedWebViewController.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 95973b999c..59b62fa1f0 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -114,12 +114,15 @@ private class WKWebViewContentController : WebContentController { } var preferredLanguage: String { - guard let language = NSLocale.preferredLanguages.first, - let _ = Bundle.main.path(forResource: language, ofType: "lproj") else { + guard let language = NSLocale.preferredLanguages.first else { return "en" } - return language + if Bundle.main.preferredLocalizations.contains(language) { + return language + } else { + return "en" + } } } From 5bdfe911c45e6894e574052f460c1cb561c40b6c Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 28 Jan 2020 17:49:08 +0500 Subject: [PATCH 03/26] make host name generic for cookie --- Source/AuthenticatedWebViewController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 59b62fa1f0..7b8d8c47de 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -71,8 +71,9 @@ private class WKWebViewContentController : WebContentController { let languageCookieValue = preferredLanguage if #available(iOS 11.0, *) { - guard let languageCookie = HTTPCookie(properties: [ - .domain: ".edx.org", + guard let domain = request.url?.host, + let languageCookie = HTTPCookie(properties: [ + .domain: domain, .path: "/", .name: languageCookieName, .value: languageCookieValue, From 915a62b9deb2b0d86556063ad207af23983a93e0 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Wed, 29 Jan 2020 13:00:50 +0500 Subject: [PATCH 04/26] extract root domain from host name --- Source/AuthenticatedWebViewController.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 7b8d8c47de..64de0b306d 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -71,9 +71,9 @@ private class WKWebViewContentController : WebContentController { let languageCookieValue = preferredLanguage if #available(iOS 11.0, *) { - guard let domain = request.url?.host, + guard let domain = request.url?.rootDomain, let languageCookie = HTTPCookie(properties: [ - .domain: domain, + .domain: ".\(domain)", .path: "/", .name: languageCookieName, .value: languageCookieValue, @@ -410,3 +410,15 @@ extension WKWebView { completion(nil) } } + +extension URL { + var rootDomain: String? { + guard let hostName = self.host else { return nil } + let components = hostName.components(separatedBy: ".") + if components.count > 2 { + return components.suffix(2).joined(separator: ".") + } else { + return hostName + } + } +} From 3a7bec3ed0db7595616b0f51206b0b118dff3493 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Thu, 30 Jan 2020 17:26:34 +0500 Subject: [PATCH 05/26] move language cookie to extension --- Source/AuthenticatedWebViewController.swift | 89 ++++++++++++--------- Source/DiscoveryWebViewHelper.swift | 2 +- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 64de0b306d..c3f26d58a8 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -67,34 +67,7 @@ private class WKWebViewContentController : WebContentController { webView.customUserAgent = userAgent } - let languageCookieName = "prod-edx-language-preference" - let languageCookieValue = preferredLanguage - - if #available(iOS 11.0, *) { - guard let domain = request.url?.rootDomain, - let languageCookie = HTTPCookie(properties: [ - .domain: ".\(domain)", - .path: "/", - .name: languageCookieName, - .value: languageCookieValue, - .expires: NSDate(timeIntervalSinceNow: 3600000) - ]) - else { return } - - webView.getCookie(with: languageCookieName) { cookie in - if cookie == nil { - self.webView.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - self.webView.load(request as URLRequest) - } - } else { - self.webView.load(request as URLRequest) - } - } - } else { - var cookiedRequest = request as URLRequest - cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") - webView.load(cookiedRequest) - } + webView.loadRequestWithLanguageCookie(request as URLRequest) } func resetState() { @@ -113,18 +86,6 @@ private class WKWebViewContentController : WebContentController { var isLoading: Bool { return webView.isLoading } - - var preferredLanguage: String { - guard let language = NSLocale.preferredLanguages.first else { - return "en" - } - - if Bundle.main.preferredLocalizations.contains(language) { - return language - } else { - return "en" - } - } } private let OAuthExchangePath = "/oauth2/login/" @@ -395,6 +356,54 @@ public class AuthenticatedWebViewController: UIViewController, WKNavigationDeleg } } +extension WKWebView { + private var preferredLanguage: String { + guard let language = NSLocale.preferredLanguages.first else { + return "en" + } + + if Bundle.main.preferredLocalizations.contains(language) { + return language + } else { + return "en" + } + } + + func loadRequestWithLanguageCookie(_ request: URLRequest) { + let languageCookieName = "prod-edx-language-preference" + let languageCookieValue = preferredLanguage + + if #available(iOS 11.0, *) { + guard let domain = request.url?.rootDomain, + let languageCookie = HTTPCookie(properties: [ + .domain: ".\(domain)", + .path: "/", + .name: languageCookieName, + .value: languageCookieValue, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { + self.load(request) + return + } + + getCookie(with: languageCookieName) { cookie in + if cookie == nil { + self.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self.load(request) + } + } else { + self.load(request) + } + } + } else { + var cookiedRequest = request + cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") + load(cookiedRequest) + } + } +} + @available(iOS 11.0, *) extension WKWebView { private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } diff --git a/Source/DiscoveryWebViewHelper.swift b/Source/DiscoveryWebViewHelper.swift index a8f32aed75..b0dd953497 100644 --- a/Source/DiscoveryWebViewHelper.swift +++ b/Source/DiscoveryWebViewHelper.swift @@ -253,7 +253,7 @@ class DiscoveryWebViewHelper: NSObject { fileprivate func loadRequest(withURL url: URL) { let request = URLRequest(url: url) - webView.load(request) + webView.loadRequestWithLanguageCookie(request) self.request = request } From b85f53bf9a3545cfbc1cb103598b84205df83669 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Fri, 31 Jan 2020 16:34:06 +0500 Subject: [PATCH 06/26] fix github comments, move wekwebview extension to seperate file, update function name --- Source/AuthenticatedWebViewController.swift | 78 +------------------ Source/DiscoveryWebViewHelper.swift | 2 +- Source/WKWebViewExtension.swift | 86 +++++++++++++++++++++ edX.xcodeproj/project.pbxproj | 4 + 4 files changed, 92 insertions(+), 78 deletions(-) create mode 100644 Source/WKWebViewExtension.swift diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index c3f26d58a8..4df76342ac 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -67,7 +67,7 @@ private class WKWebViewContentController : WebContentController { webView.customUserAgent = userAgent } - webView.loadRequestWithLanguageCookie(request as URLRequest) + webView.loadRequest(request as URLRequest) } func resetState() { @@ -355,79 +355,3 @@ public class AuthenticatedWebViewController: UIViewController, WKNavigationDeleg } } } - -extension WKWebView { - private var preferredLanguage: String { - guard let language = NSLocale.preferredLanguages.first else { - return "en" - } - - if Bundle.main.preferredLocalizations.contains(language) { - return language - } else { - return "en" - } - } - - func loadRequestWithLanguageCookie(_ request: URLRequest) { - let languageCookieName = "prod-edx-language-preference" - let languageCookieValue = preferredLanguage - - if #available(iOS 11.0, *) { - guard let domain = request.url?.rootDomain, - let languageCookie = HTTPCookie(properties: [ - .domain: ".\(domain)", - .path: "/", - .name: languageCookieName, - .value: languageCookieValue, - .expires: NSDate(timeIntervalSinceNow: 3600000) - ]) - else { - self.load(request) - return - } - - getCookie(with: languageCookieName) { cookie in - if cookie == nil { - self.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - self.load(request) - } - } else { - self.load(request) - } - } - } else { - var cookiedRequest = request - cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") - load(cookiedRequest) - } - } -} - -@available(iOS 11.0, *) -extension WKWebView { - private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } - - func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { - httpCookieStore.getAllCookies { cookies in - for cookie in cookies { - if cookie.name.contains(name) { - completion(cookie) - } - } - } - completion(nil) - } -} - -extension URL { - var rootDomain: String? { - guard let hostName = self.host else { return nil } - let components = hostName.components(separatedBy: ".") - if components.count > 2 { - return components.suffix(2).joined(separator: ".") - } else { - return hostName - } - } -} diff --git a/Source/DiscoveryWebViewHelper.swift b/Source/DiscoveryWebViewHelper.swift index b0dd953497..80109cad4e 100644 --- a/Source/DiscoveryWebViewHelper.swift +++ b/Source/DiscoveryWebViewHelper.swift @@ -253,7 +253,7 @@ class DiscoveryWebViewHelper: NSObject { fileprivate func loadRequest(withURL url: URL) { let request = URLRequest(url: url) - webView.loadRequestWithLanguageCookie(request) + webView.loadRequest(request) self.request = request } diff --git a/Source/WKWebViewExtension.swift b/Source/WKWebViewExtension.swift new file mode 100644 index 0000000000..a2df9a1312 --- /dev/null +++ b/Source/WKWebViewExtension.swift @@ -0,0 +1,86 @@ +// +// WKWebViewExtension.swift +// edX +// +// Created by MuhammadUmer on 31/01/2020. +// Copyright © 2020 edX. All rights reserved. +// + +import Foundation + +extension WKWebView { + private var languageCookieName: String { + return "prod-edx-language-preference" + } + + private var defaultLanguage: String { + guard let language = NSLocale.preferredLanguages.first else { + return "en" + } + + if Bundle.main.preferredLocalizations.contains(language) { + return language + } else { + return "en" + } + } + + func loadRequest(_ request: URLRequest) { + if #available(iOS 11.0, *) { + guard let domain = request.url?.rootDomain, + let languageCookie = HTTPCookie(properties: [ + .domain: ".\(domain)", + .path: "/", + .name: languageCookieName, + .value: defaultLanguage, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { + load(request) + return + } + + getCookie(with: languageCookieName) { [weak self] cookie in + if cookie == nil { + self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self?.load(request) + } + } else { + self?.load(request) + } + } + } else { + var cookiedRequest = request + cookiedRequest.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") + load(cookiedRequest) + } + } +} + +@available(iOS 11.0, *) +extension WKWebView { + private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } + + func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { + httpCookieStore.getAllCookies { cookies in + for cookie in cookies { + if cookie.name.contains(name) { + completion(cookie) + } + } + } + completion(nil) + } +} + +extension URL { + var rootDomain: String? { + guard let hostName = self.host else { return nil } + let components = hostName.components(separatedBy: ".") + if components.count > 2 { + return components.suffix(2).joined(separator: ".") + } else { + return hostName + } + } +} diff --git a/edX.xcodeproj/project.pbxproj b/edX.xcodeproj/project.pbxproj index fa3a444583..013ffe25f6 100644 --- a/edX.xcodeproj/project.pbxproj +++ b/edX.xcodeproj/project.pbxproj @@ -176,6 +176,7 @@ 5DD0FFCF1B1D225C00837121 /* DiscussionNewPostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */; }; 5DD0FFD21B1D23DA00837121 /* DiscussionNewPostViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */; }; 5DEA47D71B62F64300831EC9 /* DiscussionObjectModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */; }; + 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */; }; 67FDC7528B4181D9153A7C36 /* Pods_edXTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F80CBFF126E890C3709DEAF /* Pods_edXTests.framework */; }; 6919F5FF1D65CD27006935C8 /* OEXColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6919F5FE1D65CD27006935C8 /* OEXColors.swift */; }; 6926CDAB1D59BE3600A16E22 /* ic_next_press.png in Resources */ = {isa = PBXBuildFile; fileRef = 6926CDA41D59BE3600A16E22 /* ic_next_press.png */; }; @@ -1179,6 +1180,7 @@ 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionNewPostViewController.swift; sourceTree = ""; }; 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DiscussionNewPostViewController.xib; sourceTree = ""; }; 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionObjectModel.swift; sourceTree = ""; }; + 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewExtension.swift; sourceTree = ""; }; 61E8D7FCCFA0751E2D510864 /* libPods-EndToEndTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EndToEndTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6919F5FE1D65CD27006935C8 /* OEXColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OEXColors.swift; sourceTree = ""; }; 6926CDA41D59BE3600A16E22 /* ic_next_press.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_next_press.png; sourceTree = ""; }; @@ -2882,6 +2884,7 @@ 77503E8D1B287DBF00C47229 /* KeyboardInsetsSource.swift */, 7784C68A1B03BA1E00529C7C /* LoadStateViewController.swift */, 9EAB5BE81B564C2F00CA9F3C /* ProgressController.swift */, + 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */, ); name = "Controller Helpers"; sourceTree = ""; @@ -4921,6 +4924,7 @@ B7CCC738209B16B100A66923 /* Debugging.swift in Sources */, 77C6BBCA1CB4BC6F0026C37B /* AccomplishmentsView.swift in Sources */, B7CCC72F209B16B100A66923 /* ConstraintConstantTarget.swift in Sources */, + 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */, 77509D981BE1916600B10CD3 /* UserProfileManager.swift in Sources */, 77E209851AF158190071316D /* CourseOutline.swift in Sources */, 1A8172531C3C21DE007262AA /* TwitterConfig.swift in Sources */, From 9a97c4d3075553be455d60e7fd212000d900a313 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 4 Feb 2020 13:02:08 +0500 Subject: [PATCH 07/26] fix github comments --- Source/WKWebView+LoadRequestExtension.swift | 81 +++++++++++++++++++++ edX.xcodeproj/project.pbxproj | 8 +- 2 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 Source/WKWebView+LoadRequestExtension.swift diff --git a/Source/WKWebView+LoadRequestExtension.swift b/Source/WKWebView+LoadRequestExtension.swift new file mode 100644 index 0000000000..bcec141ee9 --- /dev/null +++ b/Source/WKWebView+LoadRequestExtension.swift @@ -0,0 +1,81 @@ +// +// WKWebViewExtension.swift +// edX +// +// Created by MuhammadUmer on 31/01/2020. +// Copyright © 2020 edX. All rights reserved. +// + +import Foundation + +extension WKWebView { + private var languageCookieName: String { + return "prod-edx-language-preference" + } + + private var defaultLanguage: String { + guard let language = NSLocale.preferredLanguages.first, + Bundle.main.preferredLocalizations.contains(language) else { return "en" } + return language + } + + func loadRequest(_ request: URLRequest) { + var request = request + + if #available(iOS 11.0, *) { + guard let domain = request.url?.rootDomain, + let languageCookie = HTTPCookie(properties: [ + .domain: ".\(domain)", + .path: "/", + .name: languageCookieName, + .value: defaultLanguage, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { + load(request) + return + } + + getCookie(with: languageCookieName) { [weak self] cookie in + if cookie == nil { + self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self?.load(request) + } + } + } + } else { + request.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") + } + + load(request) + } +} + +@available(iOS 11.0, *) +extension WKWebView { + private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } + + func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { + httpCookieStore.getAllCookies { cookies in + for cookie in cookies { + if cookie.name.contains(name) { + completion(cookie) + } + } + } + completion(nil) + } +} + +extension URL { + var rootDomain: String? { + guard let hostName = host else { return nil } + + let components = hostName.components(separatedBy: ".") + if components.count > 2 { + return components.suffix(2).joined(separator: ".") + } else { + return hostName + } + } +} diff --git a/edX.xcodeproj/project.pbxproj b/edX.xcodeproj/project.pbxproj index 013ffe25f6..ffb67bf3f8 100644 --- a/edX.xcodeproj/project.pbxproj +++ b/edX.xcodeproj/project.pbxproj @@ -176,7 +176,7 @@ 5DD0FFCF1B1D225C00837121 /* DiscussionNewPostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */; }; 5DD0FFD21B1D23DA00837121 /* DiscussionNewPostViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */; }; 5DEA47D71B62F64300831EC9 /* DiscussionObjectModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */; }; - 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */; }; + 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */; }; 67FDC7528B4181D9153A7C36 /* Pods_edXTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F80CBFF126E890C3709DEAF /* Pods_edXTests.framework */; }; 6919F5FF1D65CD27006935C8 /* OEXColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6919F5FE1D65CD27006935C8 /* OEXColors.swift */; }; 6926CDAB1D59BE3600A16E22 /* ic_next_press.png in Resources */ = {isa = PBXBuildFile; fileRef = 6926CDA41D59BE3600A16E22 /* ic_next_press.png */; }; @@ -1180,7 +1180,7 @@ 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionNewPostViewController.swift; sourceTree = ""; }; 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DiscussionNewPostViewController.xib; sourceTree = ""; }; 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionObjectModel.swift; sourceTree = ""; }; - 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewExtension.swift; sourceTree = ""; }; + 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WKWebView+LoadRequestExtension.swift"; sourceTree = ""; }; 61E8D7FCCFA0751E2D510864 /* libPods-EndToEndTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EndToEndTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6919F5FE1D65CD27006935C8 /* OEXColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OEXColors.swift; sourceTree = ""; }; 6926CDA41D59BE3600A16E22 /* ic_next_press.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_next_press.png; sourceTree = ""; }; @@ -2793,6 +2793,7 @@ 7706AAC01BCFEEBF00728432 /* NSAttributedString+Formatting.swift */, 5DEA47D51B62F64300831EC9 /* QLearnSDK */, 774B393A1B5EEF8A00595D33 /* UIAlertController+Selection.swift */, + 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */, 77691F971B38A09B003922F2 /* NSAttributedString+Combination.swift */, 77092C741B42E461004AA1A1 /* UIStatusBarStyle+Styles.swift */, 1AC147361BCEB14900E0A230 /* CGRect+OEXHelpers.swift */, @@ -2884,7 +2885,6 @@ 77503E8D1B287DBF00C47229 /* KeyboardInsetsSource.swift */, 7784C68A1B03BA1E00529C7C /* LoadStateViewController.swift */, 9EAB5BE81B564C2F00CA9F3C /* ProgressController.swift */, - 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */, ); name = "Controller Helpers"; sourceTree = ""; @@ -4924,7 +4924,7 @@ B7CCC738209B16B100A66923 /* Debugging.swift in Sources */, 77C6BBCA1CB4BC6F0026C37B /* AccomplishmentsView.swift in Sources */, B7CCC72F209B16B100A66923 /* ConstraintConstantTarget.swift in Sources */, - 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */, + 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */, 77509D981BE1916600B10CD3 /* UserProfileManager.swift in Sources */, 77E209851AF158190071316D /* CourseOutline.swift in Sources */, 1A8172531C3C21DE007262AA /* TwitterConfig.swift in Sources */, From 86ab8b8a074b1202be73ea6c610614e3f64f4a86 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 4 Feb 2020 13:02:27 +0500 Subject: [PATCH 08/26] delete file --- Source/WKWebViewExtension.swift | 86 --------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 Source/WKWebViewExtension.swift diff --git a/Source/WKWebViewExtension.swift b/Source/WKWebViewExtension.swift deleted file mode 100644 index a2df9a1312..0000000000 --- a/Source/WKWebViewExtension.swift +++ /dev/null @@ -1,86 +0,0 @@ -// -// WKWebViewExtension.swift -// edX -// -// Created by MuhammadUmer on 31/01/2020. -// Copyright © 2020 edX. All rights reserved. -// - -import Foundation - -extension WKWebView { - private var languageCookieName: String { - return "prod-edx-language-preference" - } - - private var defaultLanguage: String { - guard let language = NSLocale.preferredLanguages.first else { - return "en" - } - - if Bundle.main.preferredLocalizations.contains(language) { - return language - } else { - return "en" - } - } - - func loadRequest(_ request: URLRequest) { - if #available(iOS 11.0, *) { - guard let domain = request.url?.rootDomain, - let languageCookie = HTTPCookie(properties: [ - .domain: ".\(domain)", - .path: "/", - .name: languageCookieName, - .value: defaultLanguage, - .expires: NSDate(timeIntervalSinceNow: 3600000) - ]) - else { - load(request) - return - } - - getCookie(with: languageCookieName) { [weak self] cookie in - if cookie == nil { - self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - self?.load(request) - } - } else { - self?.load(request) - } - } - } else { - var cookiedRequest = request - cookiedRequest.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") - load(cookiedRequest) - } - } -} - -@available(iOS 11.0, *) -extension WKWebView { - private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } - - func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { - httpCookieStore.getAllCookies { cookies in - for cookie in cookies { - if cookie.name.contains(name) { - completion(cookie) - } - } - } - completion(nil) - } -} - -extension URL { - var rootDomain: String? { - guard let hostName = self.host else { return nil } - let components = hostName.components(separatedBy: ".") - if components.count > 2 { - return components.suffix(2).joined(separator: ".") - } else { - return hostName - } - } -} From 49e0dd3331d56b1bec09240b007ed88985fbb82b Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 4 Feb 2020 18:40:20 +0500 Subject: [PATCH 09/26] fix github comments --- ...uestExtension.swift => WKWebView+LanguageCookie.swift} | 4 +--- edX.xcodeproj/project.pbxproj | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) rename Source/{WKWebView+LoadRequestExtension.swift => WKWebView+LanguageCookie.swift} (98%) diff --git a/Source/WKWebView+LoadRequestExtension.swift b/Source/WKWebView+LanguageCookie.swift similarity index 98% rename from Source/WKWebView+LoadRequestExtension.swift rename to Source/WKWebView+LanguageCookie.swift index bcec141ee9..7db825833c 100644 --- a/Source/WKWebView+LoadRequestExtension.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -1,5 +1,5 @@ // -// WKWebViewExtension.swift +// WKWebView+LanguageCookie.swift // edX // // Created by MuhammadUmer on 31/01/2020. @@ -21,7 +21,6 @@ extension WKWebView { func loadRequest(_ request: URLRequest) { var request = request - if #available(iOS 11.0, *) { guard let domain = request.url?.rootDomain, let languageCookie = HTTPCookie(properties: [ @@ -46,7 +45,6 @@ extension WKWebView { } else { request.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") } - load(request) } } diff --git a/edX.xcodeproj/project.pbxproj b/edX.xcodeproj/project.pbxproj index ffb67bf3f8..206ee8b43b 100644 --- a/edX.xcodeproj/project.pbxproj +++ b/edX.xcodeproj/project.pbxproj @@ -176,7 +176,7 @@ 5DD0FFCF1B1D225C00837121 /* DiscussionNewPostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */; }; 5DD0FFD21B1D23DA00837121 /* DiscussionNewPostViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */; }; 5DEA47D71B62F64300831EC9 /* DiscussionObjectModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */; }; - 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */; }; + 5F60728123E445E3004DBF07 /* WKWebView+LanguageCookie.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebView+LanguageCookie.swift */; }; 67FDC7528B4181D9153A7C36 /* Pods_edXTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F80CBFF126E890C3709DEAF /* Pods_edXTests.framework */; }; 6919F5FF1D65CD27006935C8 /* OEXColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6919F5FE1D65CD27006935C8 /* OEXColors.swift */; }; 6926CDAB1D59BE3600A16E22 /* ic_next_press.png in Resources */ = {isa = PBXBuildFile; fileRef = 6926CDA41D59BE3600A16E22 /* ic_next_press.png */; }; @@ -1180,7 +1180,7 @@ 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionNewPostViewController.swift; sourceTree = ""; }; 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DiscussionNewPostViewController.xib; sourceTree = ""; }; 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionObjectModel.swift; sourceTree = ""; }; - 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WKWebView+LoadRequestExtension.swift"; sourceTree = ""; }; + 5F60728023E445E2004DBF07 /* WKWebView+LanguageCookie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WKWebView+LanguageCookie.swift"; sourceTree = ""; }; 61E8D7FCCFA0751E2D510864 /* libPods-EndToEndTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EndToEndTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6919F5FE1D65CD27006935C8 /* OEXColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OEXColors.swift; sourceTree = ""; }; 6926CDA41D59BE3600A16E22 /* ic_next_press.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_next_press.png; sourceTree = ""; }; @@ -2793,7 +2793,7 @@ 7706AAC01BCFEEBF00728432 /* NSAttributedString+Formatting.swift */, 5DEA47D51B62F64300831EC9 /* QLearnSDK */, 774B393A1B5EEF8A00595D33 /* UIAlertController+Selection.swift */, - 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */, + 5F60728023E445E2004DBF07 /* WKWebView+LanguageCookie.swift */, 77691F971B38A09B003922F2 /* NSAttributedString+Combination.swift */, 77092C741B42E461004AA1A1 /* UIStatusBarStyle+Styles.swift */, 1AC147361BCEB14900E0A230 /* CGRect+OEXHelpers.swift */, @@ -4924,7 +4924,7 @@ B7CCC738209B16B100A66923 /* Debugging.swift in Sources */, 77C6BBCA1CB4BC6F0026C37B /* AccomplishmentsView.swift in Sources */, B7CCC72F209B16B100A66923 /* ConstraintConstantTarget.swift in Sources */, - 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */, + 5F60728123E445E3004DBF07 /* WKWebView+LanguageCookie.swift in Sources */, 77509D981BE1916600B10CD3 /* UserProfileManager.swift in Sources */, 77E209851AF158190071316D /* CourseOutline.swift in Sources */, 1A8172531C3C21DE007262AA /* TwitterConfig.swift in Sources */, From df7bec34e88a24c638a6877b4143415ab9b9a225 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 28 Jan 2020 16:21:06 +0500 Subject: [PATCH 10/26] Update web view cookie with in-app selected language --- Source/AuthenticatedWebViewController.swift | 55 ++++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 9b4633807b..95973b999c 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -66,8 +66,34 @@ private class WKWebViewContentController : WebContentController { if let userAgent = UserDefaults.standard.string(forKey: "UserAgent"), webView.customUserAgent?.isEmpty ?? false { webView.customUserAgent = userAgent } - - webView.load(request as URLRequest) + + let languageCookieName = "prod-edx-language-preference" + let languageCookieValue = preferredLanguage + + if #available(iOS 11.0, *) { + guard let languageCookie = HTTPCookie(properties: [ + .domain: ".edx.org", + .path: "/", + .name: languageCookieName, + .value: languageCookieValue, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { return } + + webView.getCookie(with: languageCookieName) { cookie in + if cookie == nil { + self.webView.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self.webView.load(request as URLRequest) + } + } else { + self.webView.load(request as URLRequest) + } + } + } else { + var cookiedRequest = request as URLRequest + cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") + webView.load(cookiedRequest) + } } func resetState() { @@ -86,6 +112,15 @@ private class WKWebViewContentController : WebContentController { var isLoading: Bool { return webView.isLoading } + + var preferredLanguage: String { + guard let language = NSLocale.preferredLanguages.first, + let _ = Bundle.main.path(forResource: language, ofType: "lproj") else { + return "en" + } + + return language + } } private let OAuthExchangePath = "/oauth2/login/" @@ -355,3 +390,19 @@ public class AuthenticatedWebViewController: UIViewController, WKNavigationDeleg } } } + +@available(iOS 11.0, *) +extension WKWebView { + private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } + + func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { + httpCookieStore.getAllCookies { cookies in + for cookie in cookies { + if cookie.name.contains(name) { + completion(cookie) + } + } + } + completion(nil) + } +} From 9a9176d2d61c5609e224357b598011c0e8b70756 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 28 Jan 2020 16:58:53 +0500 Subject: [PATCH 11/26] get preferred localizations from Bundle --- Source/AuthenticatedWebViewController.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 95973b999c..59b62fa1f0 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -114,12 +114,15 @@ private class WKWebViewContentController : WebContentController { } var preferredLanguage: String { - guard let language = NSLocale.preferredLanguages.first, - let _ = Bundle.main.path(forResource: language, ofType: "lproj") else { + guard let language = NSLocale.preferredLanguages.first else { return "en" } - return language + if Bundle.main.preferredLocalizations.contains(language) { + return language + } else { + return "en" + } } } From 4906220b08ddfa0a1c9e073859cff445abf93c65 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 28 Jan 2020 17:49:08 +0500 Subject: [PATCH 12/26] make host name generic for cookie --- Source/AuthenticatedWebViewController.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 59b62fa1f0..7b8d8c47de 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -71,8 +71,9 @@ private class WKWebViewContentController : WebContentController { let languageCookieValue = preferredLanguage if #available(iOS 11.0, *) { - guard let languageCookie = HTTPCookie(properties: [ - .domain: ".edx.org", + guard let domain = request.url?.host, + let languageCookie = HTTPCookie(properties: [ + .domain: domain, .path: "/", .name: languageCookieName, .value: languageCookieValue, From 8e9d4ea1f502d71bc33d30e6ddd0a9c9b4b1222e Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Wed, 29 Jan 2020 13:00:50 +0500 Subject: [PATCH 13/26] extract root domain from host name --- Source/AuthenticatedWebViewController.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 7b8d8c47de..64de0b306d 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -71,9 +71,9 @@ private class WKWebViewContentController : WebContentController { let languageCookieValue = preferredLanguage if #available(iOS 11.0, *) { - guard let domain = request.url?.host, + guard let domain = request.url?.rootDomain, let languageCookie = HTTPCookie(properties: [ - .domain: domain, + .domain: ".\(domain)", .path: "/", .name: languageCookieName, .value: languageCookieValue, @@ -410,3 +410,15 @@ extension WKWebView { completion(nil) } } + +extension URL { + var rootDomain: String? { + guard let hostName = self.host else { return nil } + let components = hostName.components(separatedBy: ".") + if components.count > 2 { + return components.suffix(2).joined(separator: ".") + } else { + return hostName + } + } +} From ff1748fe4fafe7e76239738cbd8b02fe153249af Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Thu, 30 Jan 2020 17:26:34 +0500 Subject: [PATCH 14/26] move language cookie to extension --- Source/AuthenticatedWebViewController.swift | 89 ++++++++++++--------- Source/DiscoveryWebViewHelper.swift | 2 +- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index 64de0b306d..c3f26d58a8 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -67,34 +67,7 @@ private class WKWebViewContentController : WebContentController { webView.customUserAgent = userAgent } - let languageCookieName = "prod-edx-language-preference" - let languageCookieValue = preferredLanguage - - if #available(iOS 11.0, *) { - guard let domain = request.url?.rootDomain, - let languageCookie = HTTPCookie(properties: [ - .domain: ".\(domain)", - .path: "/", - .name: languageCookieName, - .value: languageCookieValue, - .expires: NSDate(timeIntervalSinceNow: 3600000) - ]) - else { return } - - webView.getCookie(with: languageCookieName) { cookie in - if cookie == nil { - self.webView.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - self.webView.load(request as URLRequest) - } - } else { - self.webView.load(request as URLRequest) - } - } - } else { - var cookiedRequest = request as URLRequest - cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") - webView.load(cookiedRequest) - } + webView.loadRequestWithLanguageCookie(request as URLRequest) } func resetState() { @@ -113,18 +86,6 @@ private class WKWebViewContentController : WebContentController { var isLoading: Bool { return webView.isLoading } - - var preferredLanguage: String { - guard let language = NSLocale.preferredLanguages.first else { - return "en" - } - - if Bundle.main.preferredLocalizations.contains(language) { - return language - } else { - return "en" - } - } } private let OAuthExchangePath = "/oauth2/login/" @@ -395,6 +356,54 @@ public class AuthenticatedWebViewController: UIViewController, WKNavigationDeleg } } +extension WKWebView { + private var preferredLanguage: String { + guard let language = NSLocale.preferredLanguages.first else { + return "en" + } + + if Bundle.main.preferredLocalizations.contains(language) { + return language + } else { + return "en" + } + } + + func loadRequestWithLanguageCookie(_ request: URLRequest) { + let languageCookieName = "prod-edx-language-preference" + let languageCookieValue = preferredLanguage + + if #available(iOS 11.0, *) { + guard let domain = request.url?.rootDomain, + let languageCookie = HTTPCookie(properties: [ + .domain: ".\(domain)", + .path: "/", + .name: languageCookieName, + .value: languageCookieValue, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { + self.load(request) + return + } + + getCookie(with: languageCookieName) { cookie in + if cookie == nil { + self.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self.load(request) + } + } else { + self.load(request) + } + } + } else { + var cookiedRequest = request + cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") + load(cookiedRequest) + } + } +} + @available(iOS 11.0, *) extension WKWebView { private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } diff --git a/Source/DiscoveryWebViewHelper.swift b/Source/DiscoveryWebViewHelper.swift index a8f32aed75..b0dd953497 100644 --- a/Source/DiscoveryWebViewHelper.swift +++ b/Source/DiscoveryWebViewHelper.swift @@ -253,7 +253,7 @@ class DiscoveryWebViewHelper: NSObject { fileprivate func loadRequest(withURL url: URL) { let request = URLRequest(url: url) - webView.load(request) + webView.loadRequestWithLanguageCookie(request) self.request = request } From 6370b3b7ea10d50b285adec3a54077bf2824ff96 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Fri, 31 Jan 2020 16:34:06 +0500 Subject: [PATCH 15/26] fix github comments, move wekwebview extension to seperate file, update function name --- Source/AuthenticatedWebViewController.swift | 78 +------------------ Source/DiscoveryWebViewHelper.swift | 2 +- Source/WKWebViewExtension.swift | 86 +++++++++++++++++++++ edX.xcodeproj/project.pbxproj | 4 + 4 files changed, 92 insertions(+), 78 deletions(-) create mode 100644 Source/WKWebViewExtension.swift diff --git a/Source/AuthenticatedWebViewController.swift b/Source/AuthenticatedWebViewController.swift index c3f26d58a8..4df76342ac 100644 --- a/Source/AuthenticatedWebViewController.swift +++ b/Source/AuthenticatedWebViewController.swift @@ -67,7 +67,7 @@ private class WKWebViewContentController : WebContentController { webView.customUserAgent = userAgent } - webView.loadRequestWithLanguageCookie(request as URLRequest) + webView.loadRequest(request as URLRequest) } func resetState() { @@ -355,79 +355,3 @@ public class AuthenticatedWebViewController: UIViewController, WKNavigationDeleg } } } - -extension WKWebView { - private var preferredLanguage: String { - guard let language = NSLocale.preferredLanguages.first else { - return "en" - } - - if Bundle.main.preferredLocalizations.contains(language) { - return language - } else { - return "en" - } - } - - func loadRequestWithLanguageCookie(_ request: URLRequest) { - let languageCookieName = "prod-edx-language-preference" - let languageCookieValue = preferredLanguage - - if #available(iOS 11.0, *) { - guard let domain = request.url?.rootDomain, - let languageCookie = HTTPCookie(properties: [ - .domain: ".\(domain)", - .path: "/", - .name: languageCookieName, - .value: languageCookieValue, - .expires: NSDate(timeIntervalSinceNow: 3600000) - ]) - else { - self.load(request) - return - } - - getCookie(with: languageCookieName) { cookie in - if cookie == nil { - self.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - self.load(request) - } - } else { - self.load(request) - } - } - } else { - var cookiedRequest = request - cookiedRequest.addValue("\(languageCookieName)=\(languageCookieValue))", forHTTPHeaderField: "Cookie") - load(cookiedRequest) - } - } -} - -@available(iOS 11.0, *) -extension WKWebView { - private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } - - func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { - httpCookieStore.getAllCookies { cookies in - for cookie in cookies { - if cookie.name.contains(name) { - completion(cookie) - } - } - } - completion(nil) - } -} - -extension URL { - var rootDomain: String? { - guard let hostName = self.host else { return nil } - let components = hostName.components(separatedBy: ".") - if components.count > 2 { - return components.suffix(2).joined(separator: ".") - } else { - return hostName - } - } -} diff --git a/Source/DiscoveryWebViewHelper.swift b/Source/DiscoveryWebViewHelper.swift index b0dd953497..80109cad4e 100644 --- a/Source/DiscoveryWebViewHelper.swift +++ b/Source/DiscoveryWebViewHelper.swift @@ -253,7 +253,7 @@ class DiscoveryWebViewHelper: NSObject { fileprivate func loadRequest(withURL url: URL) { let request = URLRequest(url: url) - webView.loadRequestWithLanguageCookie(request) + webView.loadRequest(request) self.request = request } diff --git a/Source/WKWebViewExtension.swift b/Source/WKWebViewExtension.swift new file mode 100644 index 0000000000..a2df9a1312 --- /dev/null +++ b/Source/WKWebViewExtension.swift @@ -0,0 +1,86 @@ +// +// WKWebViewExtension.swift +// edX +// +// Created by MuhammadUmer on 31/01/2020. +// Copyright © 2020 edX. All rights reserved. +// + +import Foundation + +extension WKWebView { + private var languageCookieName: String { + return "prod-edx-language-preference" + } + + private var defaultLanguage: String { + guard let language = NSLocale.preferredLanguages.first else { + return "en" + } + + if Bundle.main.preferredLocalizations.contains(language) { + return language + } else { + return "en" + } + } + + func loadRequest(_ request: URLRequest) { + if #available(iOS 11.0, *) { + guard let domain = request.url?.rootDomain, + let languageCookie = HTTPCookie(properties: [ + .domain: ".\(domain)", + .path: "/", + .name: languageCookieName, + .value: defaultLanguage, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { + load(request) + return + } + + getCookie(with: languageCookieName) { [weak self] cookie in + if cookie == nil { + self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self?.load(request) + } + } else { + self?.load(request) + } + } + } else { + var cookiedRequest = request + cookiedRequest.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") + load(cookiedRequest) + } + } +} + +@available(iOS 11.0, *) +extension WKWebView { + private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } + + func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { + httpCookieStore.getAllCookies { cookies in + for cookie in cookies { + if cookie.name.contains(name) { + completion(cookie) + } + } + } + completion(nil) + } +} + +extension URL { + var rootDomain: String? { + guard let hostName = self.host else { return nil } + let components = hostName.components(separatedBy: ".") + if components.count > 2 { + return components.suffix(2).joined(separator: ".") + } else { + return hostName + } + } +} diff --git a/edX.xcodeproj/project.pbxproj b/edX.xcodeproj/project.pbxproj index fa3a444583..013ffe25f6 100644 --- a/edX.xcodeproj/project.pbxproj +++ b/edX.xcodeproj/project.pbxproj @@ -176,6 +176,7 @@ 5DD0FFCF1B1D225C00837121 /* DiscussionNewPostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */; }; 5DD0FFD21B1D23DA00837121 /* DiscussionNewPostViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */; }; 5DEA47D71B62F64300831EC9 /* DiscussionObjectModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */; }; + 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */; }; 67FDC7528B4181D9153A7C36 /* Pods_edXTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F80CBFF126E890C3709DEAF /* Pods_edXTests.framework */; }; 6919F5FF1D65CD27006935C8 /* OEXColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6919F5FE1D65CD27006935C8 /* OEXColors.swift */; }; 6926CDAB1D59BE3600A16E22 /* ic_next_press.png in Resources */ = {isa = PBXBuildFile; fileRef = 6926CDA41D59BE3600A16E22 /* ic_next_press.png */; }; @@ -1179,6 +1180,7 @@ 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionNewPostViewController.swift; sourceTree = ""; }; 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DiscussionNewPostViewController.xib; sourceTree = ""; }; 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionObjectModel.swift; sourceTree = ""; }; + 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewExtension.swift; sourceTree = ""; }; 61E8D7FCCFA0751E2D510864 /* libPods-EndToEndTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EndToEndTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6919F5FE1D65CD27006935C8 /* OEXColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OEXColors.swift; sourceTree = ""; }; 6926CDA41D59BE3600A16E22 /* ic_next_press.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_next_press.png; sourceTree = ""; }; @@ -2882,6 +2884,7 @@ 77503E8D1B287DBF00C47229 /* KeyboardInsetsSource.swift */, 7784C68A1B03BA1E00529C7C /* LoadStateViewController.swift */, 9EAB5BE81B564C2F00CA9F3C /* ProgressController.swift */, + 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */, ); name = "Controller Helpers"; sourceTree = ""; @@ -4921,6 +4924,7 @@ B7CCC738209B16B100A66923 /* Debugging.swift in Sources */, 77C6BBCA1CB4BC6F0026C37B /* AccomplishmentsView.swift in Sources */, B7CCC72F209B16B100A66923 /* ConstraintConstantTarget.swift in Sources */, + 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */, 77509D981BE1916600B10CD3 /* UserProfileManager.swift in Sources */, 77E209851AF158190071316D /* CourseOutline.swift in Sources */, 1A8172531C3C21DE007262AA /* TwitterConfig.swift in Sources */, From ba8bc263ac3bdd1c0d20a75f919d9155d0656c4b Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 4 Feb 2020 13:02:08 +0500 Subject: [PATCH 16/26] fix github comments --- Source/WKWebView+LoadRequestExtension.swift | 81 +++++++++++++++++++++ edX.xcodeproj/project.pbxproj | 8 +- 2 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 Source/WKWebView+LoadRequestExtension.swift diff --git a/Source/WKWebView+LoadRequestExtension.swift b/Source/WKWebView+LoadRequestExtension.swift new file mode 100644 index 0000000000..bcec141ee9 --- /dev/null +++ b/Source/WKWebView+LoadRequestExtension.swift @@ -0,0 +1,81 @@ +// +// WKWebViewExtension.swift +// edX +// +// Created by MuhammadUmer on 31/01/2020. +// Copyright © 2020 edX. All rights reserved. +// + +import Foundation + +extension WKWebView { + private var languageCookieName: String { + return "prod-edx-language-preference" + } + + private var defaultLanguage: String { + guard let language = NSLocale.preferredLanguages.first, + Bundle.main.preferredLocalizations.contains(language) else { return "en" } + return language + } + + func loadRequest(_ request: URLRequest) { + var request = request + + if #available(iOS 11.0, *) { + guard let domain = request.url?.rootDomain, + let languageCookie = HTTPCookie(properties: [ + .domain: ".\(domain)", + .path: "/", + .name: languageCookieName, + .value: defaultLanguage, + .expires: NSDate(timeIntervalSinceNow: 3600000) + ]) + else { + load(request) + return + } + + getCookie(with: languageCookieName) { [weak self] cookie in + if cookie == nil { + self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self?.load(request) + } + } + } + } else { + request.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") + } + + load(request) + } +} + +@available(iOS 11.0, *) +extension WKWebView { + private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } + + func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { + httpCookieStore.getAllCookies { cookies in + for cookie in cookies { + if cookie.name.contains(name) { + completion(cookie) + } + } + } + completion(nil) + } +} + +extension URL { + var rootDomain: String? { + guard let hostName = host else { return nil } + + let components = hostName.components(separatedBy: ".") + if components.count > 2 { + return components.suffix(2).joined(separator: ".") + } else { + return hostName + } + } +} diff --git a/edX.xcodeproj/project.pbxproj b/edX.xcodeproj/project.pbxproj index 013ffe25f6..ffb67bf3f8 100644 --- a/edX.xcodeproj/project.pbxproj +++ b/edX.xcodeproj/project.pbxproj @@ -176,7 +176,7 @@ 5DD0FFCF1B1D225C00837121 /* DiscussionNewPostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */; }; 5DD0FFD21B1D23DA00837121 /* DiscussionNewPostViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */; }; 5DEA47D71B62F64300831EC9 /* DiscussionObjectModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */; }; - 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */; }; + 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */; }; 67FDC7528B4181D9153A7C36 /* Pods_edXTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F80CBFF126E890C3709DEAF /* Pods_edXTests.framework */; }; 6919F5FF1D65CD27006935C8 /* OEXColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6919F5FE1D65CD27006935C8 /* OEXColors.swift */; }; 6926CDAB1D59BE3600A16E22 /* ic_next_press.png in Resources */ = {isa = PBXBuildFile; fileRef = 6926CDA41D59BE3600A16E22 /* ic_next_press.png */; }; @@ -1180,7 +1180,7 @@ 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionNewPostViewController.swift; sourceTree = ""; }; 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DiscussionNewPostViewController.xib; sourceTree = ""; }; 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionObjectModel.swift; sourceTree = ""; }; - 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WKWebViewExtension.swift; sourceTree = ""; }; + 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WKWebView+LoadRequestExtension.swift"; sourceTree = ""; }; 61E8D7FCCFA0751E2D510864 /* libPods-EndToEndTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EndToEndTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6919F5FE1D65CD27006935C8 /* OEXColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OEXColors.swift; sourceTree = ""; }; 6926CDA41D59BE3600A16E22 /* ic_next_press.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_next_press.png; sourceTree = ""; }; @@ -2793,6 +2793,7 @@ 7706AAC01BCFEEBF00728432 /* NSAttributedString+Formatting.swift */, 5DEA47D51B62F64300831EC9 /* QLearnSDK */, 774B393A1B5EEF8A00595D33 /* UIAlertController+Selection.swift */, + 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */, 77691F971B38A09B003922F2 /* NSAttributedString+Combination.swift */, 77092C741B42E461004AA1A1 /* UIStatusBarStyle+Styles.swift */, 1AC147361BCEB14900E0A230 /* CGRect+OEXHelpers.swift */, @@ -2884,7 +2885,6 @@ 77503E8D1B287DBF00C47229 /* KeyboardInsetsSource.swift */, 7784C68A1B03BA1E00529C7C /* LoadStateViewController.swift */, 9EAB5BE81B564C2F00CA9F3C /* ProgressController.swift */, - 5F60728023E445E2004DBF07 /* WKWebViewExtension.swift */, ); name = "Controller Helpers"; sourceTree = ""; @@ -4924,7 +4924,7 @@ B7CCC738209B16B100A66923 /* Debugging.swift in Sources */, 77C6BBCA1CB4BC6F0026C37B /* AccomplishmentsView.swift in Sources */, B7CCC72F209B16B100A66923 /* ConstraintConstantTarget.swift in Sources */, - 5F60728123E445E3004DBF07 /* WKWebViewExtension.swift in Sources */, + 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */, 77509D981BE1916600B10CD3 /* UserProfileManager.swift in Sources */, 77E209851AF158190071316D /* CourseOutline.swift in Sources */, 1A8172531C3C21DE007262AA /* TwitterConfig.swift in Sources */, From d680f2fbb8b6a4e55a93cb215cea1aa25612f445 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 4 Feb 2020 13:02:27 +0500 Subject: [PATCH 17/26] delete file --- Source/WKWebViewExtension.swift | 86 --------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 Source/WKWebViewExtension.swift diff --git a/Source/WKWebViewExtension.swift b/Source/WKWebViewExtension.swift deleted file mode 100644 index a2df9a1312..0000000000 --- a/Source/WKWebViewExtension.swift +++ /dev/null @@ -1,86 +0,0 @@ -// -// WKWebViewExtension.swift -// edX -// -// Created by MuhammadUmer on 31/01/2020. -// Copyright © 2020 edX. All rights reserved. -// - -import Foundation - -extension WKWebView { - private var languageCookieName: String { - return "prod-edx-language-preference" - } - - private var defaultLanguage: String { - guard let language = NSLocale.preferredLanguages.first else { - return "en" - } - - if Bundle.main.preferredLocalizations.contains(language) { - return language - } else { - return "en" - } - } - - func loadRequest(_ request: URLRequest) { - if #available(iOS 11.0, *) { - guard let domain = request.url?.rootDomain, - let languageCookie = HTTPCookie(properties: [ - .domain: ".\(domain)", - .path: "/", - .name: languageCookieName, - .value: defaultLanguage, - .expires: NSDate(timeIntervalSinceNow: 3600000) - ]) - else { - load(request) - return - } - - getCookie(with: languageCookieName) { [weak self] cookie in - if cookie == nil { - self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - self?.load(request) - } - } else { - self?.load(request) - } - } - } else { - var cookiedRequest = request - cookiedRequest.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") - load(cookiedRequest) - } - } -} - -@available(iOS 11.0, *) -extension WKWebView { - private var httpCookieStore: WKHTTPCookieStore { return WKWebsiteDataStore.default().httpCookieStore } - - func getCookie(with name: String, completion: @escaping (HTTPCookie?)-> ()) { - httpCookieStore.getAllCookies { cookies in - for cookie in cookies { - if cookie.name.contains(name) { - completion(cookie) - } - } - } - completion(nil) - } -} - -extension URL { - var rootDomain: String? { - guard let hostName = self.host else { return nil } - let components = hostName.components(separatedBy: ".") - if components.count > 2 { - return components.suffix(2).joined(separator: ".") - } else { - return hostName - } - } -} From ef87091de02dd4ef7b80df0704bcce85ffda9718 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Tue, 4 Feb 2020 18:40:20 +0500 Subject: [PATCH 18/26] fix github comments --- ...uestExtension.swift => WKWebView+LanguageCookie.swift} | 4 +--- edX.xcodeproj/project.pbxproj | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) rename Source/{WKWebView+LoadRequestExtension.swift => WKWebView+LanguageCookie.swift} (98%) diff --git a/Source/WKWebView+LoadRequestExtension.swift b/Source/WKWebView+LanguageCookie.swift similarity index 98% rename from Source/WKWebView+LoadRequestExtension.swift rename to Source/WKWebView+LanguageCookie.swift index bcec141ee9..7db825833c 100644 --- a/Source/WKWebView+LoadRequestExtension.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -1,5 +1,5 @@ // -// WKWebViewExtension.swift +// WKWebView+LanguageCookie.swift // edX // // Created by MuhammadUmer on 31/01/2020. @@ -21,7 +21,6 @@ extension WKWebView { func loadRequest(_ request: URLRequest) { var request = request - if #available(iOS 11.0, *) { guard let domain = request.url?.rootDomain, let languageCookie = HTTPCookie(properties: [ @@ -46,7 +45,6 @@ extension WKWebView { } else { request.addValue("\(languageCookieName)=\(defaultLanguage))", forHTTPHeaderField: "Cookie") } - load(request) } } diff --git a/edX.xcodeproj/project.pbxproj b/edX.xcodeproj/project.pbxproj index ffb67bf3f8..206ee8b43b 100644 --- a/edX.xcodeproj/project.pbxproj +++ b/edX.xcodeproj/project.pbxproj @@ -176,7 +176,7 @@ 5DD0FFCF1B1D225C00837121 /* DiscussionNewPostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */; }; 5DD0FFD21B1D23DA00837121 /* DiscussionNewPostViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */; }; 5DEA47D71B62F64300831EC9 /* DiscussionObjectModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */; }; - 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */; }; + 5F60728123E445E3004DBF07 /* WKWebView+LanguageCookie.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60728023E445E2004DBF07 /* WKWebView+LanguageCookie.swift */; }; 67FDC7528B4181D9153A7C36 /* Pods_edXTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F80CBFF126E890C3709DEAF /* Pods_edXTests.framework */; }; 6919F5FF1D65CD27006935C8 /* OEXColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6919F5FE1D65CD27006935C8 /* OEXColors.swift */; }; 6926CDAB1D59BE3600A16E22 /* ic_next_press.png in Resources */ = {isa = PBXBuildFile; fileRef = 6926CDA41D59BE3600A16E22 /* ic_next_press.png */; }; @@ -1180,7 +1180,7 @@ 5DD0FFCD1B1D225C00837121 /* DiscussionNewPostViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionNewPostViewController.swift; sourceTree = ""; }; 5DD0FFD11B1D23DA00837121 /* DiscussionNewPostViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DiscussionNewPostViewController.xib; sourceTree = ""; }; 5DEA47D61B62F64300831EC9 /* DiscussionObjectModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionObjectModel.swift; sourceTree = ""; }; - 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WKWebView+LoadRequestExtension.swift"; sourceTree = ""; }; + 5F60728023E445E2004DBF07 /* WKWebView+LanguageCookie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WKWebView+LanguageCookie.swift"; sourceTree = ""; }; 61E8D7FCCFA0751E2D510864 /* libPods-EndToEndTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-EndToEndTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6919F5FE1D65CD27006935C8 /* OEXColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OEXColors.swift; sourceTree = ""; }; 6926CDA41D59BE3600A16E22 /* ic_next_press.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_next_press.png; sourceTree = ""; }; @@ -2793,7 +2793,7 @@ 7706AAC01BCFEEBF00728432 /* NSAttributedString+Formatting.swift */, 5DEA47D51B62F64300831EC9 /* QLearnSDK */, 774B393A1B5EEF8A00595D33 /* UIAlertController+Selection.swift */, - 5F60728023E445E2004DBF07 /* WKWebView+LoadRequestExtension.swift */, + 5F60728023E445E2004DBF07 /* WKWebView+LanguageCookie.swift */, 77691F971B38A09B003922F2 /* NSAttributedString+Combination.swift */, 77092C741B42E461004AA1A1 /* UIStatusBarStyle+Styles.swift */, 1AC147361BCEB14900E0A230 /* CGRect+OEXHelpers.swift */, @@ -4924,7 +4924,7 @@ B7CCC738209B16B100A66923 /* Debugging.swift in Sources */, 77C6BBCA1CB4BC6F0026C37B /* AccomplishmentsView.swift in Sources */, B7CCC72F209B16B100A66923 /* ConstraintConstantTarget.swift in Sources */, - 5F60728123E445E3004DBF07 /* WKWebView+LoadRequestExtension.swift in Sources */, + 5F60728123E445E3004DBF07 /* WKWebView+LanguageCookie.swift in Sources */, 77509D981BE1916600B10CD3 /* UserProfileManager.swift in Sources */, 77E209851AF158190071316D /* CourseOutline.swift in Sources */, 1A8172531C3C21DE007262AA /* TwitterConfig.swift in Sources */, From b35657f425dbb26aa98e552721a777fc88bb1d64 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Thu, 6 Feb 2020 17:00:13 +0500 Subject: [PATCH 19/26] update language cookie when app language is changed --- Source/WKWebView+LanguageCookie.swift | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index 7db825833c..8ef42a5857 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -8,36 +8,49 @@ import Foundation +let SelectedLanguageCookieValue = "SelectedLanguageCookieValue" + extension WKWebView { private var languageCookieName: String { return "prod-edx-language-preference" } - + private var defaultLanguage: String { guard let language = NSLocale.preferredLanguages.first, Bundle.main.preferredLocalizations.contains(language) else { return "en" } return language } + private var storedLanguageCookieValue: String { + set { + UserDefaults.standard.set(newValue, forKey: SelectedLanguageCookieValue) + UserDefaults.standard.synchronize() + } + get { + return UserDefaults.standard.value(forKey: SelectedLanguageCookieValue) as? String ?? "" + } + } + func loadRequest(_ request: URLRequest) { var request = request if #available(iOS 11.0, *) { guard let domain = request.url?.rootDomain, let languageCookie = HTTPCookie(properties: [ - .domain: ".\(domain)", - .path: "/", - .name: languageCookieName, - .value: defaultLanguage, - .expires: NSDate(timeIntervalSinceNow: 3600000) + .domain: ".\(domain)", + .path: "/", + .name: languageCookieName, + .value: defaultLanguage, + .expires: NSDate(timeIntervalSinceNow: 3600000) ]) else { load(request) return } - + getCookie(with: languageCookieName) { [weak self] cookie in - if cookie == nil { + if cookie == nil || self?.storedLanguageCookieValue != self?.defaultLanguage { self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self?.storedLanguageCookieValue = self?.defaultLanguage ?? "" self?.load(request) } } From 2de881129598ede4870a05af59e5bd5c71ff97fb Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Thu, 6 Feb 2020 18:43:05 +0500 Subject: [PATCH 20/26] check for device langue and cookie language --- Source/WKWebView+LanguageCookie.swift | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index 8ef42a5857..517e2b02fc 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -16,9 +16,18 @@ extension WKWebView { } private var defaultLanguage: String { - guard let language = NSLocale.preferredLanguages.first, - Bundle.main.preferredLocalizations.contains(language) else { return "en" } - return language + guard let deviceLanguage = NSLocale.preferredLanguages.first, + let language = deviceLanguage.components(separatedBy: "-").first else { return "en" } + + let preferredLocalizations = Bundle.main.preferredLocalizations + + for (index, element) in preferredLocalizations.enumerated() { + if element.contains(find: language) { + return preferredLocalizations[index] + } + } + + return "en" } private var storedLanguageCookieValue: String { From faa823b78af2a94849ea58177480c0347a342de9 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Fri, 7 Feb 2020 11:31:43 +0500 Subject: [PATCH 21/26] get language code --- Source/WKWebView+LanguageCookie.swift | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index 517e2b02fc..f45f9aa9b6 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -16,17 +16,16 @@ extension WKWebView { } private var defaultLanguage: String { - guard let deviceLanguage = NSLocale.preferredLanguages.first, - let language = deviceLanguage.components(separatedBy: "-").first else { return "en" } + guard let deviceLanguage = NSLocale.current.languageCode else { return "en" } let preferredLocalizations = Bundle.main.preferredLocalizations - - for (index, element) in preferredLocalizations.enumerated() { - if element.contains(find: language) { + + for (index, language) in preferredLocalizations.enumerated() { + if language.contains(find: deviceLanguage) { return preferredLocalizations[index] } } - + return "en" } @@ -57,10 +56,12 @@ extension WKWebView { } getCookie(with: languageCookieName) { [weak self] cookie in - if cookie == nil || self?.storedLanguageCookieValue != self?.defaultLanguage { - self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - self?.storedLanguageCookieValue = self?.defaultLanguage ?? "" - self?.load(request) + if let weakSelf = self { + if cookie == nil || self?.storedLanguageCookieValue != weakSelf.defaultLanguage { + weakSelf.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + weakSelf.storedLanguageCookieValue = weakSelf.defaultLanguage + weakSelf.load(request) + } } } } From 4aa2d4ba476497864032776663480c444117690b Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Fri, 7 Feb 2020 11:32:30 +0500 Subject: [PATCH 22/26] cleanup --- Source/WKWebView+LanguageCookie.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index f45f9aa9b6..5cfe44490c 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -57,7 +57,7 @@ extension WKWebView { getCookie(with: languageCookieName) { [weak self] cookie in if let weakSelf = self { - if cookie == nil || self?.storedLanguageCookieValue != weakSelf.defaultLanguage { + if cookie == nil || weakSelf.storedLanguageCookieValue != weakSelf.defaultLanguage { weakSelf.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { weakSelf.storedLanguageCookieValue = weakSelf.defaultLanguage weakSelf.load(request) From bf6b1e3b8eeb20009a028ff4a9930f3e6ecf60a6 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Fri, 7 Feb 2020 11:36:53 +0500 Subject: [PATCH 23/26] add return statement --- Source/WKWebView+LanguageCookie.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index 5cfe44490c..347ccb5f03 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -61,6 +61,7 @@ extension WKWebView { weakSelf.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { weakSelf.storedLanguageCookieValue = weakSelf.defaultLanguage weakSelf.load(request) + return } } } From ab260ca1650f733751b642e9fd3038ac96fa4a85 Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Fri, 7 Feb 2020 16:09:49 +0500 Subject: [PATCH 24/26] set cache --- Source/WKWebView+LanguageCookie.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index 347ccb5f03..429b854ef8 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -41,6 +41,9 @@ extension WKWebView { func loadRequest(_ request: URLRequest) { var request = request + request.setValue("no-cache", forHTTPHeaderField: "Pragma") + request.setValue("no-cache", forHTTPHeaderField: "Cache-Control") + if #available(iOS 11.0, *) { guard let domain = request.url?.rootDomain, let languageCookie = HTTPCookie(properties: [ From 07e3ac699c73bb68410aa0bd8683d9284740320c Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Thu, 13 Feb 2020 12:11:48 +0500 Subject: [PATCH 25/26] compare cookie value if it exists --- Source/WKWebView+LanguageCookie.swift | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index 429b854ef8..9c204a690a 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -8,8 +8,6 @@ import Foundation -let SelectedLanguageCookieValue = "SelectedLanguageCookieValue" - extension WKWebView { private var languageCookieName: String { return "prod-edx-language-preference" @@ -29,16 +27,6 @@ extension WKWebView { return "en" } - private var storedLanguageCookieValue: String { - set { - UserDefaults.standard.set(newValue, forKey: SelectedLanguageCookieValue) - UserDefaults.standard.synchronize() - } - get { - return UserDefaults.standard.value(forKey: SelectedLanguageCookieValue) as? String ?? "" - } - } - func loadRequest(_ request: URLRequest) { var request = request request.setValue("no-cache", forHTTPHeaderField: "Pragma") @@ -58,12 +46,11 @@ extension WKWebView { return } - getCookie(with: languageCookieName) { [weak self] cookie in - if let weakSelf = self { - if cookie == nil || weakSelf.storedLanguageCookieValue != weakSelf.defaultLanguage { - weakSelf.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { - weakSelf.storedLanguageCookieValue = weakSelf.defaultLanguage - weakSelf.load(request) + getCookie(with: languageCookieName) { [weak self] cookie in + if let cookie = cookie { + if cookie.value != languageCookie.value { + self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self?.load(request) return } } From afcf6229e6befe6229430ab25f9ee5b030acdb2a Mon Sep 17 00:00:00 2001 From: MuhammadUmer Date: Thu, 13 Feb 2020 17:34:20 +0500 Subject: [PATCH 26/26] update cookie on language default case --- Source/WKWebView+LanguageCookie.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/WKWebView+LanguageCookie.swift b/Source/WKWebView+LanguageCookie.swift index 9c204a690a..725db9f3dc 100644 --- a/Source/WKWebView+LanguageCookie.swift +++ b/Source/WKWebView+LanguageCookie.swift @@ -54,6 +54,11 @@ extension WKWebView { return } } + } else { + self?.configuration.websiteDataStore.httpCookieStore.setCookie(languageCookie) { + self?.load(request) + return + } } } } else {