From 097dd46f73a1eb791a31870efc2623e555529dea Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 15:52:35 -0500 Subject: [PATCH] Added FXIOS-10710 default browser telemetry (backport #23426) (#23616) * Added FXIOS-10710 default browser telemetry (#23426) * Add default browser utility * Add telemetry * Telemetry tests * Add tests * Fix tests * Update bitrise to use 18.2 * Fix linting * Fix typo * Disable warnings as errors * Up the number of warnings * Revert "Update bitrise to use 18.2" This reverts commit 2e03e5ad95dd24974e1815c00bd5897fd77114aa. * Update bitrise * Fix bitrise * Fix bitrise * Fix concurrency errors * Update api * Update sim versions * Fix test (cherry picked from commit 475c70f1ff1008705c3f336f6ba9d7f5d0ba1f59) # Conflicts: # bitrise.yml # firefox-ios/Client.xcodeproj/project.pbxproj # firefox-ios/Client.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved * Update Package.resolved * Update bitrise.yml * Fix conflicts --------- Co-authored-by: OrlaM --- bitrise.yml | 32 ++--- firefox-ios/Client.xcodeproj/project.pbxproj | 119 ++++++++++++++++++ .../Client/Application/AppLaunchUtil.swift | 2 + .../Application/DefaultBrowserUtil.swift | 64 ++++++++++ .../Client/Telemetry/TelemetryWrapper.swift | 13 ++ .../Client/Utils/LocaleInterface.swift | 15 +++ .../Client/Utils/UIApplicationInterface.swift | 18 +++ firefox-ios/Client/metrics.yaml | 22 ++++ firefox-ios/Shared/Prefs.swift | 3 + .../Storage/Rust/RustFirefoxSuggest.swift | 4 +- .../Application/AppSendTabDelegateTests.swift | 1 + .../Application/DefaultBrowserUitTests.swift | 103 +++++++++++++++ .../ClientTests/Application/MockLocale.swift | 9 ++ .../Application/MockUIApplication.swift | 14 +++ .../ClientTests/Mocks/MockUserDefaults.swift | 3 + .../ClientTests/TelemetryWrapperTests.swift | 21 ++++ test-fixtures/generate-metrics.sh | 4 +- 17 files changed, 428 insertions(+), 19 deletions(-) create mode 100644 firefox-ios/Client/Application/DefaultBrowserUtil.swift create mode 100644 firefox-ios/Client/Utils/LocaleInterface.swift create mode 100644 firefox-ios/Client/Utils/UIApplicationInterface.swift create mode 100644 firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/DefaultBrowserUitTests.swift create mode 100644 firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockLocale.swift create mode 100644 firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockUIApplication.swift diff --git a/bitrise.yml b/bitrise.yml index e70fab5ad1b5..2697bd48794d 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -55,7 +55,7 @@ workflows: mkdir DerivedData xcodebuild -resolvePackageDependencies -onlyUsePackageVersionsFromResolvedFile - xcodebuild "-project" "/Users/vagrant/git/firefox-ios/Client.xcodeproj" "-scheme" "Fennec" -configuration "Fennec_Testing" "CODE_SIGNING_ALLOWED=NO" -sdk "iphonesimulator" "-destination" "platform=iOS Simulator,name=iPhone 16,OS=18.1" "COMPILER_INDEX_STORE_ENABLE=NO" "build-for-testing" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO" -derivedDataPath "/Users/vagrant/git/DerivedData" | xcpretty | tee xcodebuild_fennec.log + xcodebuild "-project" "/Users/vagrant/git/firefox-ios/Client.xcodeproj" "-scheme" "Fennec" -configuration "Fennec_Testing" "CODE_SIGNING_ALLOWED=NO" -sdk "iphonesimulator" "-destination" "platform=iOS Simulator,name=iPhone 16,OS=18.2" "COMPILER_INDEX_STORE_ENABLE=NO" "build-for-testing" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO" -derivedDataPath "/Users/vagrant/git/DerivedData" | xcpretty | tee xcodebuild_fennec.log ls /Users/vagrant/git/DerivedData/Build/Products ls /Users/vagrant/git/DerivedData @@ -63,9 +63,9 @@ workflows: run_if: '{{getenv "RUN_UI_TESTS" | eq "Run_UI_Tests"}}' timeout: 600 inputs: - - destination: platform=iOS Simulator,name=iPhone 16,OS=18.1 + - destination: platform=iOS Simulator,name=iPhone 16,OS=18.2 - xcodebuild_options: '"COMPILER_INDEX_STORE_ENABLE=NO" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO"' - - xctestrun: "/Users/vagrant/git/DerivedData/Build/Products/Fennec_UnitTest_iphonesimulator18.1-arm64.xctestrun" + - xctestrun: "/Users/vagrant/git/DerivedData/Build/Products/Fennec_UnitTest_iphonesimulator18.2-arm64.xctestrun" - maximum_test_repetitions: 2 - save-spm-cache@1: is_always_run: true @@ -205,10 +205,10 @@ workflows: run_if: '{{getenv "RUN_UI_TESTS" | eq "Run_UI_Tests"}}' timeout: 1200 inputs: - - destination: platform=iOS Simulator,name=iPhone 16,OS=18.1 + - destination: platform=iOS Simulator,name=iPhone 16,OS=18.2 - xcodebuild_options: '"-derivedDataPath" "/Users/vagrant/git/DerivedData" "COMPILER_INDEX_STORE_ENABLE=NO" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO"' - - xctestrun: "Users/vagrant/git/DerivedData/Build/Products/Fennec_Smoketest${SHARD}_iphonesimulator18.1-arm64.xctestrun" - - deploy-to-bitrise-io@2.1.1: + - xctestrun: "Users/vagrant/git/DerivedData/Build/Products/Fennec_Smoketest${SHARD}_iphonesimulator18.2-arm64.xctestrun" + - deploy-to-bitrise-io@2.9.2: run_if: '{{getenv "RUN_UI_TESTS" | eq "Run_UI_Tests"}}' inputs: - pipeline_intermediate_files: '$BITRISE_XCRESULT_PATH:BITRISE_UITESTS_${SHARD}_XCRESULT_PATH' @@ -738,8 +738,8 @@ workflows: run_if: '{{getenv "NEW_XCODE_VERSION" | eq "New_Version_Found" | or (getenv "RUN_ALL_STEPS" | eq "Run_All_Steps")}}' inputs: - scheme: Fennec - - destination: platform=iOS Simulator,name=iPhone 16,OS=18.1 - - deploy-to-bitrise-io@2.2: {} + - destination: platform=iOS Simulator,name=iPhone 16,OS=18.2 + - deploy-to-bitrise-io@2.9.2: {} - cache-push@2.4: {} - slack@3.1: run_if: '{{getenv "NEW_XCODE_VERSION" | eq "New_Version_Found" | or (getenv "RUN_ALL_STEPS" | eq "Run_All_Steps")}}' @@ -751,7 +751,7 @@ workflows: description: This Workflow is to build the app using latest xcode available in Bitrise meta: bitrise.io: - stack: osx-xcode-16.1.x + stack: osx-xcode-16.2.x-edge machine_type_id: g2-m1.8core L10nBuild: steps: @@ -1203,7 +1203,7 @@ workflows: inputs: - project_path: firefox-ios/Client.xcodeproj - scheme: Fennec - - destination: platform=iOS Simulator,name=iPhone 16,OS=18.1 + - destination: platform=iOS Simulator,name=iPhone 16,OS=18.2 - test_plan: PerformanceTestPlan - script@1.1: is_always_run: true @@ -1592,14 +1592,14 @@ workflows: echo "-- build-for-testing --" mkdir DerivedData #xcodebuild -resolvePackageDependencies -onlyUsePackageVersionsFromResolvedFile - xcodebuild "-project" "/Users/vagrant/git/focus-ios/Blockzilla.xcodeproj" "-scheme" "Focus" -configuration "FocusDebug" "CODE_SIGNING_ALLOWED=NO" "-destination" "platform=iOS Simulator,name=iPhone 16,OS=18.1" "COMPILER_INDEX_STORE_ENABLE=NO" "build-for-testing" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO" -derivedDataPath "/Users/vagrant/git/DerivedData" | xcpretty | tee xcodebuild_test.log + xcodebuild "-project" "/Users/vagrant/git/focus-ios/Blockzilla.xcodeproj" "-scheme" "Focus" -configuration "FocusDebug" "CODE_SIGNING_ALLOWED=NO" "-destination" "platform=iOS Simulator,name=iPhone 16,OS=18.2" "COMPILER_INDEX_STORE_ENABLE=NO" "build-for-testing" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO" -derivedDataPath "/Users/vagrant/git/DerivedData" | xcpretty | tee xcodebuild_test.log - script@1.1: title: Build for Testing Klar inputs: - content: | set -euxo pipefail echo "-- build-for-testing --" - xcodebuild "-project" "/Users/vagrant/git/focus-ios/Blockzilla.xcodeproj" "-scheme" "Klar" -configuration "KlarDebug" "CODE_SIGNING_ALLOWED=NO" "-destination" "platform=iOS Simulator,name=iPhone 16,OS=18.1" "COMPILER_INDEX_STORE_ENABLE=NO" "build-for-testing" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO" -derivedDataPath "/Users/vagrant/git/DerivedData" | xcpretty | tee xcodebuild_test.log + xcodebuild "-project" "/Users/vagrant/git/focus-ios/Blockzilla.xcodeproj" "-scheme" "Klar" -configuration "KlarDebug" "CODE_SIGNING_ALLOWED=NO" "-destination" "platform=iOS Simulator,name=iPhone 16,OS=18.2" "COMPILER_INDEX_STORE_ENABLE=NO" "build-for-testing" "CODE_SIGN_IDENTITY=" "CODE_SIGNING_REQUIRED=NO" "CODE_SIGNING_ALLOWED=NO" -derivedDataPath "/Users/vagrant/git/DerivedData" | xcpretty | tee xcodebuild_test.log - script@1.1: title: Compress Derived Data is_always_run: true @@ -1666,7 +1666,7 @@ workflows: mv ./Users/vagrant/git/* . ls -la echo "-- test-without-building --" - xcodebuild -resultBundlePath "xcodebuild.xcresult" -derivedDataPath "/Users/vagrant/git/DerivedData" -destination "platform=iOS Simulator,name=iPhone 16,OS=18.1" test-without-building -xctestrun "/Users/vagrant/git/DerivedData/Build/Products/Focus_SmokeTest_iphonesimulator18.1-arm64.xctestrun" + xcodebuild -resultBundlePath "xcodebuild.xcresult" -derivedDataPath "/Users/vagrant/git/DerivedData" -destination "platform=iOS Simulator,name=iPhone 16,OS=18.2" test-without-building -xctestrun "/Users/vagrant/git/DerivedData/Build/Products/Focus_SmokeTest_iphonesimulator18.2-arm64.xctestrun" - custom-test-results-export@0: inputs: - search_pattern: "$BITRISE_SOURCE_DIR/xcodebuild.xcresult" @@ -1696,7 +1696,7 @@ workflows: mv ./Users/vagrant/git/* . ls -la echo "-- test-without-building --" - xcodebuild -resultBundlePath "xcodebuild.xcresult" -derivedDataPath "/Users/vagrant/git/DerivedData" -destination "platform=iOS Simulator,name=iPhone 16,OS=18.1" test-without-building -xctestrun "/Users/vagrant/git/DerivedData/Build/Products/Klar_UnitTests_iphonesimulator18.1-arm64.xctestrun" + xcodebuild -resultBundlePath "xcodebuild.xcresult" -derivedDataPath "/Users/vagrant/git/DerivedData" -destination "platform=iOS Simulator,name=iPhone 16,OS=18.2" test-without-building -xctestrun "/Users/vagrant/git/DerivedData/Build/Products/Klar_UnitTests_iphonesimulator18.2-arm64.xctestrun" - custom-test-results-export@0: inputs: - search_pattern: "$BITRISE_SOURCE_DIR/xcodebuild.xcresult" @@ -1724,7 +1724,7 @@ workflows: mv ./Users/vagrant/git/* . ls -la echo "-- test-without-building --" - xcodebuild -resultBundlePath "xcodebuild.xcresult" -derivedDataPath "/Users/vagrant/git/DerivedData" -destination "platform=iOS Simulator,name=iPhone 16,OS=18.1" test-without-building -xctestrun "/Users/vagrant/git/DerivedData/Build/Products/Focus_UnitTests_iphonesimulator18.1-arm64.xctestrun" + xcodebuild -resultBundlePath "xcodebuild.xcresult" -derivedDataPath "/Users/vagrant/git/DerivedData" -destination "platform=iOS Simulator,name=iPhone 16,OS=18.2" test-without-building -xctestrun "/Users/vagrant/git/DerivedData/Build/Products/Focus_UnitTests_iphonesimulator18.2-arm64.xctestrun" - custom-test-results-export@0: inputs: - search_pattern: "$BITRISE_SOURCE_DIR/xcodebuild.xcresult" @@ -2127,5 +2127,5 @@ trigger_map: meta: bitrise.io: - stack: osx-xcode-16.1.x + stack: osx-xcode-16.2.x-edge machine_type_id: g2-m1.8core diff --git a/firefox-ios/Client.xcodeproj/project.pbxproj b/firefox-ios/Client.xcodeproj/project.pbxproj index 68a7532a42d0..bf7bec8a65f8 100644 --- a/firefox-ios/Client.xcodeproj/project.pbxproj +++ b/firefox-ios/Client.xcodeproj/project.pbxproj @@ -563,6 +563,12 @@ 5AB4237E28A2BA9C003BC40C /* HistoryHighlightsDataAdaptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AB4237D28A2BA9C003BC40C /* HistoryHighlightsDataAdaptor.swift */; }; 5AC40329291AFBDB002BF91C /* DispatchQueueHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D83821FF1FC7961D00303C12 /* DispatchQueueHelper.swift */; }; 5AC7110729F822E60011ED11 /* MockTabSessionStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AC7110629F822E60011ED11 /* MockTabSessionStore.swift */; }; + 5AD3B6742CF625B000AFA1FE /* DefaultBrowserUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD3B6732CF625A300AFA1FE /* DefaultBrowserUtil.swift */; }; + 5AD3B6782CF650DF00AFA1FE /* DefaultBrowserUitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD3B6772CF650D000AFA1FE /* DefaultBrowserUitTests.swift */; }; + 5AD3B67A2CF653A600AFA1FE /* MockLocale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD3B6792CF653A200AFA1FE /* MockLocale.swift */; }; + 5AD3B67C2CF65DE600AFA1FE /* LocaleInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD3B67B2CF65DE300AFA1FE /* LocaleInterface.swift */; }; + 5AD3B67E2CF665B400AFA1FE /* UIApplicationInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD3B67D2CF665AE00AFA1FE /* UIApplicationInterface.swift */; }; + 5AD3B6802CF6674F00AFA1FE /* MockUIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AD3B67F2CF6674B00AFA1FE /* MockUIApplication.swift */; }; 5AE371842A4DD6F50092A760 /* PasswordManagerListViewControllerSpy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE371832A4DD6F50092A760 /* PasswordManagerListViewControllerSpy.swift */; }; 5AE371852A4DD6FE0092A760 /* PasswordManagerCoordinatorDelegateMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE371812A4DD0D70092A760 /* PasswordManagerCoordinatorDelegateMock.swift */; }; 5AE371872A4E11750092A760 /* AboutSettingsDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AE371862A4E11750092A760 /* AboutSettingsDelegate.swift */; }; @@ -6735,6 +6741,12 @@ 5AC24B85BF0D2FCC2F1EB6D3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/LoginManager.strings; sourceTree = ""; }; 5AC549C0BA565EB2B08B87EC /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/ClearHistoryConfirm.strings; sourceTree = ""; }; 5AC7110629F822E60011ED11 /* MockTabSessionStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTabSessionStore.swift; sourceTree = ""; }; + 5AD3B6732CF625A300AFA1FE /* DefaultBrowserUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultBrowserUtil.swift; sourceTree = ""; }; + 5AD3B6772CF650D000AFA1FE /* DefaultBrowserUitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultBrowserUitTests.swift; sourceTree = ""; }; + 5AD3B6792CF653A200AFA1FE /* MockLocale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockLocale.swift; sourceTree = ""; }; + 5AD3B67B2CF65DE300AFA1FE /* LocaleInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocaleInterface.swift; sourceTree = ""; }; + 5AD3B67D2CF665AE00AFA1FE /* UIApplicationInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIApplicationInterface.swift; sourceTree = ""; }; + 5AD3B67F2CF6674B00AFA1FE /* MockUIApplication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockUIApplication.swift; sourceTree = ""; }; 5AE371812A4DD0D70092A760 /* PasswordManagerCoordinatorDelegateMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordManagerCoordinatorDelegateMock.swift; sourceTree = ""; }; 5AE371832A4DD6F50092A760 /* PasswordManagerListViewControllerSpy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordManagerListViewControllerSpy.swift; sourceTree = ""; }; 5AE371862A4E11750092A760 /* AboutSettingsDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutSettingsDelegate.swift; sourceTree = ""; }; @@ -11084,7 +11096,10 @@ 8A171A6029F82AD90085770E /* Application */ = { isa = PBXGroup; children = ( + 5AD3B67F2CF6674B00AFA1FE /* MockUIApplication.swift */, + 5AD3B6792CF653A200AFA1FE /* MockLocale.swift */, 8A13FA882AD82BC8007527AB /* AppSendTabDelegateTests.swift */, + 5AD3B6772CF650D000AFA1FE /* DefaultBrowserUitTests.swift */, ); path = Application; sourceTree = ""; @@ -13626,6 +13641,8 @@ E65075551E37F714006961AC /* Utils */ = { isa = PBXGroup; children = ( + 5AD3B67D2CF665AE00AFA1FE /* UIApplicationInterface.swift */, + 5AD3B67B2CF65DE300AFA1FE /* LocaleInterface.swift */, 8A13FA8C2AD834FA007527AB /* BackgroundTabLoader.swift */, DFACBF80277B916B003D5F41 /* ConfigurableGradientView.swift */, 8ADED7ED276A7750009C19E6 /* CumulativeDaysOfUseCounter.swift */, @@ -14061,6 +14078,7 @@ F84B21E41A0910F600AAB793 /* Application */ = { isa = PBXGroup; children = ( + 5AD3B6732CF625A300AFA1FE /* DefaultBrowserUtil.swift */, 8A46F5AA2C9E4389005B6422 /* RemoteSettings */, C84266742728462900382274 /* AccessibilityIdentifiers.swift */, 5A47CFF42860FB8900B2B7BF /* AppLaunchUtil.swift */, @@ -16025,6 +16043,7 @@ F8A0B08229AD61FA0091C75B /* RustSyncManager.swift in Sources */, 438FE8642988ABA600155B10 /* CreditCardTableViewController.swift in Sources */, 3BCE6D3C1CEB9E4D0080928C /* ThirdPartySearchAlerts.swift in Sources */, + 5AD3B6742CF625B000AFA1FE /* DefaultBrowserUtil.swift in Sources */, 8A93F86229D36F0F004159D9 /* NavigationController.swift in Sources */, E13F8C342928194800BDC8B4 /* PhotonActionSheetSiteHeaderView.swift in Sources */, C2D71B9B2A3850B4003DEC7A /* ThemedTableViewCellViewModel.swift in Sources */, @@ -16351,6 +16370,7 @@ 2165B2CC28748CD7004C0786 /* LibraryPanelDescriptor.swift in Sources */, D31A0FC71A65D6D000DC8C7E /* SearchSuggestClient.swift in Sources */, 8A57519927AD80B800A84DBF /* ReaderModeStyleViewModel.swift in Sources */, + 5AD3B67E2CF665B400AFA1FE /* UIApplicationInterface.swift in Sources */, 435D7CC5246209AA0043ACB9 /* IntroViewController.swift in Sources */, C855728429AEA3C300AF32B0 /* SurveySurfaceViewModel.swift in Sources */, CA4ACE4924C8C91600F55894 /* BreachAlertsDetailView.swift in Sources */, @@ -16427,6 +16447,7 @@ 8A3EF80D2A2FD04D00796E3A /* ResetWallpaperOnboardingPage.swift in Sources */, E1FE132F29C0B3CB002A65FF /* NotificationSurfaceManager.swift in Sources */, D88FDA9F1F4E2B9200FD9709 /* PhotonActionSheetProtocol.swift in Sources */, + 5AD3B67C2CF65DE600AFA1FE /* LocaleInterface.swift in Sources */, 21618A932A4499FC00A5189E /* AppState.swift in Sources */, BD1C89CA2A1E3CE7000A4201 /* PocketFooterView.swift in Sources */, 81020C942BB5B026007B8481 /* OnboardingMultipleChoiceButtonViewModel.swift in Sources */, @@ -16832,6 +16853,7 @@ 961577942A39008100391E8D /* SponsoredTileDataUtilityTests.swift in Sources */, 8A093D812A4B58330099ABA5 /* MockSettingsFlowDelegate.swift in Sources */, 431C0D1E25C9DC4D00395CE4 /* DefaultBrowserOnboardingTests.swift in Sources */, + 5AD3B6782CF650DF00AFA1FE /* DefaultBrowserUitTests.swift in Sources */, 213B67A827CE721E000542F5 /* StartAtHomeHelperTests.swift in Sources */, 8A13FA892AD82BC8007527AB /* AppSendTabDelegateTests.swift in Sources */, 8A7653C228A2E57D00924ABF /* PocketDataAdaptorTests.swift in Sources */, @@ -17057,6 +17079,7 @@ 1D558A5B2BEE7D07001EF527 /* WindowSimpleTabsCoordinator.swift in Sources */, 8A6E8DEB2B275BA9000C4301 /* PrivateHomepageViewControllerTests.swift in Sources */, 8A93F86529D37331004159D9 /* DefaultRouterTests.swift in Sources */, + 5AD3B6802CF6674F00AFA1FE /* MockUIApplication.swift in Sources */, 8AF10D8A29D713F50086351D /* LaunchScreenViewModelTests.swift in Sources */, 2F13E79B1AC0C02700D75081 /* StringExtensionsTests.swift in Sources */, CA24B52224ABD7D40093848C /* PasswordManagerViewModelTests.swift in Sources */, @@ -17089,6 +17112,7 @@ 8A11C8132731E54800AC7318 /* DictionaryExtensionsTests.swift in Sources */, 5A475E8F29DB89CE009C13FD /* MockTabDataStore.swift in Sources */, ED45893E2CC800D9006F2C0B /* SearchEngineSelectionViewControllerTests.swift in Sources */, + 5AD3B67A2CF653A600AFA1FE /* MockLocale.swift in Sources */, 8A7A93EE2810ADF2005E7E1B /* ContileProviderTests.swift in Sources */, 5A3A7DDA2889EC4D0065F81A /* ReadingListMock.swift in Sources */, 8A33221F27DFE318008F809E /* TopSitesDataAdaptorTests.swift in Sources */, @@ -23437,6 +23461,7 @@ CODE_SIGN_ENTITLEMENTS = ""; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = Sync/Info.plist; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Sync/Sync-Bridging-Header.h"; @@ -23447,6 +23472,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/firefox-ios-tests/Tests/SyncTests/SyncTests-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -23464,6 +23490,7 @@ COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "Shared/Supporting Files/Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -23482,6 +23509,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, @@ -23504,6 +23532,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/AccountTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Account/Account-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -23514,6 +23543,7 @@ isa = XCBuildConfiguration; buildSettings = { DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Storage/Info.plist; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; @@ -23525,6 +23555,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StorageTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -23540,6 +23571,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9G8J6YA743; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/NotificationService/Info.plist; OTHER_LDFLAGS = ( "$(inherited)", @@ -23562,6 +23594,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/NotificationService/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_FENNEC -DMOZ_TARGET_NOTIFICATIONSERVICE"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; @@ -23577,6 +23610,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/NotificationService/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_RELEASE -DMOZ_TARGET_NOTIFICATIONSERVICE"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; @@ -23592,6 +23626,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/NotificationService/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_BETA -DMOZ_TARGET_NOTIFICATIONSERVICE"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)2"; @@ -23606,6 +23641,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StoragePerfTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -23615,6 +23651,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StoragePerfTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -23624,6 +23661,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StoragePerfTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -23636,6 +23674,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/XCUITests/Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID)"; PROVISIONING_PROFILE_SPECIFIER = "org.mozilla.ios.XCUITests 2021-08-12"; @@ -23651,6 +23690,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/XCUITests/Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID)"; PROVISIONING_PROFILE_SPECIFIER = "bitrise org.mozilla.ios.XCUITests"; @@ -23665,6 +23705,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/XCUITests/Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID)"; PROVISIONING_PROFILE_SPECIFIER = "bitrise org.mozilla.ios.XCUITests"; @@ -23679,6 +23720,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = WidgetKit/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 0.0.1; @@ -23697,6 +23739,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9G8J6YA743; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = WidgetKit/Info.plist; MARKETING_VERSION = 0.0.1; OTHER_LDFLAGS = ( @@ -23720,6 +23763,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = WidgetKit/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 0.0.1; @@ -23736,6 +23780,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = WidgetKit/Info.plist; MARKETING_VERSION = 0.0.1; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).WidgetKit"; @@ -23756,6 +23801,7 @@ DEFINES_MODULE = NO; DEVELOPMENT_TEAM = 43AQ936H96; EAGER_LINKING = NO; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "RustMozillaAppServices-Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -23782,6 +23828,7 @@ DEVELOPMENT_TEAM = 43AQ936H96; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9G8J6YA743; EAGER_LINKING = NO; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "RustMozillaAppServices-Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -23808,6 +23855,7 @@ DEVELOPMENT_TEAM = 43AQ936H96; EAGER_LINKING = NO; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "RustMozillaAppServices-Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -23833,6 +23881,7 @@ DEFINES_MODULE = NO; DEVELOPMENT_TEAM = 43AQ936H96; EAGER_LINKING = NO; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "RustMozillaAppServices-Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -23877,6 +23926,7 @@ CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -23905,6 +23955,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/NotificationService/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_FENNEC -DMOZ_TARGET_NOTIFICATIONSERVICE"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; @@ -23920,6 +23971,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/ShareTo/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_FENNEC -DMOZ_TARGET_SHARETO"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; @@ -23935,6 +23987,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = WidgetKit/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 0.0.1; @@ -23993,6 +24046,7 @@ "DEBUG=1", "$(inherited)", ); + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -24027,6 +24081,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, @@ -24049,6 +24104,7 @@ isa = XCBuildConfiguration; buildSettings = { DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Storage/Info.plist; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; @@ -24060,6 +24116,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/AccountTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Account/Account-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24070,6 +24127,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/ClientTests/Info.plist"; LOCALIZATION_EXPORT_SUPPORTED = NO; PRODUCT_NAME = ClientTests; @@ -24082,6 +24140,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StoragePerfTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -24091,6 +24150,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StorageTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24101,6 +24161,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SharedTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Shared/Shared-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24111,6 +24172,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTelemetryTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -24120,6 +24182,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/firefox-ios-tests/Tests/SyncTests/SyncTests-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24141,6 +24204,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; IPHONEOS_DEPLOYMENT_TARGET = 16.4; PRODUCT_NAME = L10nSnapshotTests; TEST_TARGET_NAME = Client; @@ -24155,6 +24219,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/XCUITests/Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID)"; PROVISIONING_PROFILE_SPECIFIER = "org.mozilla.ios.XCUITests 2021-08-12"; @@ -24175,6 +24240,7 @@ DEFINES_MODULE = NO; DEVELOPMENT_TEAM = 43AQ936H96; EAGER_LINKING = NO; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "RustMozillaAppServices-Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -24200,6 +24266,7 @@ COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "Shared/Supporting Files/Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -24220,6 +24287,7 @@ CODE_SIGN_ENTITLEMENTS = ""; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = Sync/Info.plist; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Sync/Sync-Bridging-Header.h"; @@ -24272,6 +24340,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; EXCLUDED_SOURCE_FILE_NAMES = "Client/Nimbus/TestData/*"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Client/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -24296,6 +24365,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/ClientTests/Info.plist"; LOCALIZATION_EXPORT_SUPPORTED = NO; PRODUCT_NAME = ClientTests; @@ -24310,6 +24380,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/ShareTo/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_RELEASE -DMOZ_TARGET_SHARETO"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; @@ -24337,6 +24408,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 43AQ936H96; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "Shared/Supporting Files/Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -24355,6 +24427,7 @@ buildSettings = { DEFINES_MODULE = YES; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Storage/Info.plist; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; }; @@ -24365,6 +24438,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StorageTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24376,6 +24450,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, @@ -24399,6 +24474,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/AccountTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Account/Account-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24412,6 +24488,7 @@ CODE_SIGN_ENTITLEMENTS = ""; DEFINES_MODULE = YES; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = Sync/Info.plist; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Sync/Sync-Bridging-Header.h"; @@ -24422,6 +24499,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/firefox-ios-tests/Tests/SyncTests/SyncTests-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24432,6 +24510,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; IPHONEOS_DEPLOYMENT_TARGET = 16.4; PRODUCT_NAME = L10nSnapshotTests; TEST_TARGET_NAME = Client; @@ -24443,6 +24522,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; IPHONEOS_DEPLOYMENT_TARGET = 16.4; PRODUCT_NAME = L10nSnapshotTests; TEST_TARGET_NAME = Client; @@ -24454,6 +24534,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; IPHONEOS_DEPLOYMENT_TARGET = 16.4; PRODUCT_NAME = L10nSnapshotTests; TEST_TARGET_NAME = Client; @@ -24465,6 +24546,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTelemetryTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -24474,6 +24556,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTelemetryTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -24483,6 +24566,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTelemetryTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -24492,6 +24576,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTelemetryTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -24529,6 +24614,7 @@ CredentialProvider.appex, "Client/Nimbus/TestData/*", ); + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Client/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -24560,6 +24646,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9G8J6YA743; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/ShareTo/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_FENNEC -DMOZ_TARGET_SHARETO"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; @@ -24580,6 +24667,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 43AQ936H96; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9G8J6YA743; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "Shared/Supporting Files/Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -24597,6 +24685,7 @@ isa = XCBuildConfiguration; buildSettings = { DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Storage/Info.plist; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; }; @@ -24607,6 +24696,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, @@ -24634,6 +24724,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; DEFINES_MODULE = YES; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9G8J6YA743; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = Sync/Info.plist; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Sync/Sync-Bridging-Header.h"; @@ -24644,6 +24735,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/ClientTests/Info.plist"; LOCALIZATION_EXPORT_SUPPORTED = NO; PRODUCT_NAME = ClientTests; @@ -24666,6 +24758,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StorageTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24676,6 +24769,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/AccountTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Account/Account-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24686,6 +24780,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/firefox-ios-tests/Tests/SyncTests/SyncTests-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24696,6 +24791,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SharedTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Shared/Shared-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24706,6 +24802,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; IPHONEOS_DEPLOYMENT_TARGET = 16.4; PRODUCT_NAME = L10nSnapshotTests; TEST_TARGET_NAME = Client; @@ -24723,6 +24820,7 @@ COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9G8J6YA743; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/XCUITests/Info.plist"; PRODUCT_BUNDLE_IDENTIFIER = org.mozilla.ios.XCUITests; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -24736,6 +24834,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StoragePerfTests/Info.plist"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; }; @@ -24745,6 +24844,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SharedTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Shared/Shared-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24755,6 +24855,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SharedTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Shared/Shared-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24787,6 +24888,7 @@ CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; EXCLUDED_SOURCE_FILE_NAMES = "Client/Nimbus/TestData/*"; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Client/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -24811,6 +24913,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/ClientTests/Info.plist"; LOCALIZATION_EXPORT_SUPPORTED = NO; PRODUCT_NAME = ClientTests; @@ -24825,6 +24928,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/ShareTo/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_BETA -DMOZ_TARGET_SHARETO"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; @@ -24851,6 +24955,7 @@ CODE_SIGN_STYLE = Manual; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = "Shared/Supporting Files/Info.plist"; LOCALIZED_STRING_MACRO_NAMES = ( @@ -24868,6 +24973,7 @@ isa = XCBuildConfiguration; buildSettings = { DEFINES_MODULE = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Storage/Info.plist; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; }; @@ -24878,6 +24984,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/StorageTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Storage/Storage-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24890,6 +24997,7 @@ ALWAYS_SEARCH_USER_PATHS = YES; DEFINES_MODULE = YES; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, @@ -24913,6 +25021,7 @@ buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/AccountTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Account/Account-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24930,6 +25039,7 @@ DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 43AQ936H96; ENABLE_TESTABILITY = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = Sync/Info.plist; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -24942,6 +25052,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SyncTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/firefox-ios-tests/Tests/SyncTests/SyncTests-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -24952,6 +25063,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/SharedTests/Info.plist"; SWIFT_OBJC_BRIDGING_HEADER = "$SRCROOT/Shared/Shared-Bridging-Header.h"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Client.app/Client"; @@ -25007,6 +25119,7 @@ "DEBUG=1", "$(inherited)", ); + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -25081,6 +25194,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -25154,6 +25268,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -25226,6 +25341,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -25282,6 +25398,7 @@ CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -25306,6 +25423,7 @@ isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_ENTITLEMENTS = ""; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = "firefox-ios-tests/Tests/ClientTests/Info.plist"; LOCALIZATION_EXPORT_SUPPORTED = NO; PRODUCT_NAME = ClientTests; @@ -25320,6 +25438,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 43AQ936H96; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; INFOPLIST_FILE = Extensions/ShareTo/Info.plist; OTHER_SWIFT_FLAGS = "-DMOZ_CHANNEL_FENNEC -DMOZ_TARGET_SHARETO"; PRODUCT_BUNDLE_IDENTIFIER = "$(MOZ_BUNDLE_ID).$(PRODUCT_NAME)"; diff --git a/firefox-ios/Client/Application/AppLaunchUtil.swift b/firefox-ios/Client/Application/AppLaunchUtil.swift index 0455c68e91be..a5fcf7f5745b 100644 --- a/firefox-ios/Client/Application/AppLaunchUtil.swift +++ b/firefox-ios/Client/Application/AppLaunchUtil.swift @@ -100,6 +100,8 @@ class AppLaunchUtil { } func setUpPostLaunchDependencies() { + DefaultBrowserUtil().processUserDefaultState(isFirstRun: introScreenManager.shouldShowIntroScreen) + let persistedCurrentVersion = InstallType.persistedCurrentVersion() // upgrade install - Intro screen shown & persisted current version does not match if !introScreenManager.shouldShowIntroScreen && persistedCurrentVersion != AppInfo.appVersion { diff --git a/firefox-ios/Client/Application/DefaultBrowserUtil.swift b/firefox-ios/Client/Application/DefaultBrowserUtil.swift new file mode 100644 index 000000000000..68d7eb54bee0 --- /dev/null +++ b/firefox-ios/Client/Application/DefaultBrowserUtil.swift @@ -0,0 +1,64 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Foundation +import Shared +import Common + +struct DefaultBrowserUtil { + let userDefault: UserDefaultsInterface + let telemtryWrapper: TelemetryWrapperProtocol + let locale: LocaleInterface + let application: UIApplicationInterface + let dmaCountries = ["BE", "BG", "CZ", "DK", "DE", "EE", "IE", "EL", "ES", "FR", "HR", "IT", "CY", "LV", + "LT", "LU", "HU", "MT", "NL", "AT", "PL", "PT", "RO", "SI", "SK", "FI", "SE", "GR"] + init(userDefault: UserDefaultsInterface = UserDefaults.standard, + telemetryWrapper: TelemetryWrapperProtocol = TelemetryWrapper.shared, + locale: LocaleInterface = Locale.current, + application: UIApplicationInterface = UIApplication.shared) { + self.userDefault = userDefault + self.telemtryWrapper = telemetryWrapper + self.locale = locale + self.application = application + } + + func processUserDefaultState(isFirstRun: Bool) { + guard #available(iOS 18.2, *), + let isDefault = try? application.isDefault(.webBrowser) + else { return } + + trackIfUserIsDefault(isDefault) + + if isFirstRun { + trackIfNewUserIsComingFromBrowserChoiceScreen(isDefault) + + if isDefault { + // If the user is set to default don't ask on the home page later + // This is temporary until we can refactor set to default flows now that we have the ability to check + userDefault.set(true, forKey: PrefsKeys.DidDismissDefaultBrowserMessage) + } + } + } + + private func trackIfUserIsDefault(_ isDefault: Bool) { + userDefault.set(isDefault, forKey: PrefsKeys.AppleConfirmedUserIsDefaultBrowser) + + telemtryWrapper.recordEvent(category: .action, + method: .open, + object: .defaultBrowser, + extras: [TelemetryWrapper.EventExtraKey.isDefaultBrowser.rawValue: isDefault]) + } + + private func trackIfNewUserIsComingFromBrowserChoiceScreen(_ isDefault: Bool) { + guard let regionCode = locale.localeRegionCode else { return } + // User is in a DMA effective region + if dmaCountries.contains(regionCode) { + let key = TelemetryWrapper.EventExtraKey.didComeFromBrowserChoiceScreen.rawValue + telemtryWrapper.recordEvent(category: .action, + method: .open, + object: .choiceScreenAcquisition, + extras: [key: isDefault]) + } + } +} diff --git a/firefox-ios/Client/Telemetry/TelemetryWrapper.swift b/firefox-ios/Client/Telemetry/TelemetryWrapper.swift index fd0f9efd877d..059637dd14dc 100644 --- a/firefox-ios/Client/Telemetry/TelemetryWrapper.swift +++ b/firefox-ios/Client/Telemetry/TelemetryWrapper.swift @@ -443,6 +443,8 @@ extension TelemetryWrapper { case creditCardDeleted = "creditCard-deleted" case creditCardModified = "creditCard-modified" case notificationPermission = "notificationPermission" + case defaultBrowser = "defaultBrowser" + case choiceScreenAcquisition = "choiceScreenAcquisition" case engagementNotification = "engagementNotification" // MARK: New Onboarding case onboardingCardView = "onboarding-card-view" @@ -653,6 +655,9 @@ extension TelemetryWrapper { } public enum EventExtraKey: String, CustomStringConvertible { + case isDefaultBrowser = "is-default-browser" + case didComeFromBrowserChoiceScreen = "did-come-from-browser-choice-screen" + case topSitePosition = "tilePosition" case topSiteTileType = "tileType" case contextualMenuType = "contextualMenuType" @@ -1256,6 +1261,14 @@ extension TelemetryWrapper { value: value, extras: extras) } + case (.action, .open, .defaultBrowser, _, let extras): + if let isDefaultBrowser = extras?[EventExtraKey.isDefaultBrowser.rawValue] as? Bool { + GleanMetrics.App.defaultBrowser.set(isDefaultBrowser) + } + case (.action, .open, .choiceScreenAcquisition, _, let extras): + if let choiceScreen = extras?[EventExtraKey.didComeFromBrowserChoiceScreen.rawValue] as? Bool { + GleanMetrics.App.choiceScreenAcquisition.set(choiceScreen) + } case(.action, .tap, .engagementNotification, _, _): GleanMetrics.Onboarding.engagementNotificationTapped.record() case(.action, .cancel, .engagementNotification, _, _): diff --git a/firefox-ios/Client/Utils/LocaleInterface.swift b/firefox-ios/Client/Utils/LocaleInterface.swift new file mode 100644 index 000000000000..882ffe3fccd2 --- /dev/null +++ b/firefox-ios/Client/Utils/LocaleInterface.swift @@ -0,0 +1,15 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Foundation + +protocol LocaleInterface { + var localeRegionCode: String? { get } +} + +extension Locale: LocaleInterface { + var localeRegionCode: String? { + return self.regionCode + } +} diff --git a/firefox-ios/Client/Utils/UIApplicationInterface.swift b/firefox-ios/Client/Utils/UIApplicationInterface.swift new file mode 100644 index 000000000000..305eb88c74b6 --- /dev/null +++ b/firefox-ios/Client/Utils/UIApplicationInterface.swift @@ -0,0 +1,18 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import Foundation + +protocol UIApplicationInterface { + @available(iOS 18.2, *) + @available(visionOS, unavailable) + @available(macCatalyst, unavailable) + @available(tvOS, unavailable) + @available(watchOS, unavailable) + @MainActor + @preconcurrency + func isDefault(_ category: UIApplication.Category) throws -> Bool +} + +extension UIApplication: UIApplicationInterface {} diff --git a/firefox-ios/Client/metrics.yaml b/firefox-ios/Client/metrics.yaml index 8504acceb6fd..7f5591b3c12f 100755 --- a/firefox-ios/Client/metrics.yaml +++ b/firefox-ios/Client/metrics.yaml @@ -668,6 +668,28 @@ default_browser_onboarding: expires: "2025-07-01" app: + default_browser: + type: boolean + description: | + Is Firefox the default browser + bugs: + - https://github.com/mozilla-mobile/firefox-ios/issues/XXX + data_reviews: + - https://github.com/mozilla-mobile/firefox-ios/pull/XXX + notification_emails: + - fx-ios-data-stewards@mozilla.com + expires: "2026-01-01" + choice_screen_acquisition: + type: boolean + description: | + The user installed the app via the browser choice screen + bugs: + - https://github.com/mozilla-mobile/firefox-ios/issues/XXX + data_reviews: + - https://github.com/mozilla-mobile/firefox-ios/pull/XXX + notification_emails: + - fx-ios-data-stewards@mozilla.com + expires: "2026-01-01" opened_as_default_browser: type: counter description: | diff --git a/firefox-ios/Shared/Prefs.swift b/firefox-ios/Shared/Prefs.swift index a232cc5e9787..b0d5d2ec7e6d 100644 --- a/firefox-ios/Shared/Prefs.swift +++ b/firefox-ios/Shared/Prefs.swift @@ -40,6 +40,9 @@ public struct PrefsKeys { public static let KeyAutofillCreditCardStatus = "KeyAutofillCreditCardStatus" public static let KeyAutofillAddressStatus = "KeyAutofillAddressStatus" + // Only set if we get an actual response, no assumptions, nil otherwise + public static let AppleConfirmedUserIsDefaultBrowser = "AppleConfirmedUserIsDefaultBrowser" + public struct Session { public static let FirstAppUse = "firstAppUse" public static let Last = "lastSession" diff --git a/firefox-ios/Storage/Rust/RustFirefoxSuggest.swift b/firefox-ios/Storage/Rust/RustFirefoxSuggest.swift index 931998177e50..af7f3cbb2159 100644 --- a/firefox-ios/Storage/Rust/RustFirefoxSuggest.swift +++ b/firefox-ios/Storage/Rust/RustFirefoxSuggest.swift @@ -4,7 +4,7 @@ import Foundation -import class MozillaAppServices.SuggestStore +@preconcurrency import class MozillaAppServices.SuggestStore import class MozillaAppServices.SuggestStoreBuilder import class MozillaAppServices.Viaduct import enum MozillaAppServices.SuggestionProvider @@ -12,6 +12,7 @@ import enum MozillaAppServices.RemoteSettingsServer import struct MozillaAppServices.SuggestIngestionConstraints import struct MozillaAppServices.SuggestionQuery +@preconcurrency public protocol RustFirefoxSuggestProtocol { /// Downloads and stores new Firefox Suggest suggestions. func ingest() async throws @@ -32,6 +33,7 @@ public protocol RustFirefoxSuggestProtocol { /// Wraps the synchronous Rust `SuggestStore` binding to execute /// blocking operations on a dispatch queue. +@preconcurrency public class RustFirefoxSuggest: RustFirefoxSuggestProtocol { private let store: SuggestStore diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/AppSendTabDelegateTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/AppSendTabDelegateTests.swift index 653ac2a74801..e2773d84e8c5 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/AppSendTabDelegateTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/AppSendTabDelegateTests.swift @@ -5,6 +5,7 @@ import XCTest @testable import Client +@preconcurrency final class AppFxACommandsTests: XCTestCase { private var applicationStateProvider: MockApplicationStateProvider! private var applicationHelper: MockApplicationHelper! diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/DefaultBrowserUitTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/DefaultBrowserUitTests.swift new file mode 100644 index 000000000000..5abde2e992d3 --- /dev/null +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/DefaultBrowserUitTests.swift @@ -0,0 +1,103 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +import XCTest +import Shared +@testable import Client + +final class DefaultBrowserUtilTests: XCTestCase { + var subject: DefaultBrowserUtil! + var telemetryWrapper: MockTelemetryWrapper! + var userDefaults: MockUserDefaults! + var application: MockUIApplication! + var locale: MockLocale! + + override func setUp() { + super.setUp() + telemetryWrapper = MockTelemetryWrapper() + userDefaults = MockUserDefaults() + locale = MockLocale() + application = MockUIApplication() + } + + override func tearDown() { + telemetryWrapper = nil + userDefaults = nil + locale = nil + application = nil + subject = nil + super.tearDown() + } + + func testFirstLaunchWithDMAUser() { + guard #available(iOS 18.2, *) else { return } + + locale.localeRegionCode = "IE" + application.mockDefaultApplicationValue = true + + setupSubject() + subject.processUserDefaultState(isFirstRun: true) + + XCTAssertTrue(userDefaults.bool(forKey: PrefsKeys.DidDismissDefaultBrowserMessage)) + XCTAssertTrue(userDefaults.bool(forKey: PrefsKeys.AppleConfirmedUserIsDefaultBrowser)) + XCTAssertTrue(telemetryWrapper.recordedObjects.contains(.defaultBrowser)) + XCTAssertTrue(telemetryWrapper.recordedObjects.contains(.choiceScreenAcquisition)) + XCTAssertEqual(userDefaults.setCalledCount, 2) + } + + func testFirstLaunchWithNonDMAUser() { + guard #available(iOS 18.2, *) else { return } + + locale.localeRegionCode = "US" + application.mockDefaultApplicationValue = false + + setupSubject() + subject.processUserDefaultState(isFirstRun: true) + + XCTAssertFalse(userDefaults.bool(forKey: PrefsKeys.DidDismissDefaultBrowserMessage)) + XCTAssertFalse(userDefaults.bool(forKey: PrefsKeys.AppleConfirmedUserIsDefaultBrowser)) + XCTAssertTrue(telemetryWrapper.recordedObjects.contains(.defaultBrowser)) + XCTAssertFalse(telemetryWrapper.recordedObjects.contains(.choiceScreenAcquisition)) + XCTAssertEqual(userDefaults.setCalledCount, 1) + } + + func testSecondLaunchWithDMAUser() { + guard #available(iOS 18.2, *) else { return } + + locale.localeRegionCode = "IT" + application.mockDefaultApplicationValue = true + + setupSubject() + subject.processUserDefaultState(isFirstRun: false) + + XCTAssertFalse(userDefaults.bool(forKey: PrefsKeys.DidDismissDefaultBrowserMessage)) + XCTAssertTrue(userDefaults.bool(forKey: PrefsKeys.AppleConfirmedUserIsDefaultBrowser)) + XCTAssertTrue(telemetryWrapper.recordedObjects.contains(.defaultBrowser)) + XCTAssertFalse(telemetryWrapper.recordedObjects.contains(.choiceScreenAcquisition)) + XCTAssertEqual(userDefaults.setCalledCount, 1) + } + + func testSecondLaunchWithNonDMAUser() { + guard #available(iOS 18.2, *) else { return } + + locale.localeRegionCode = "US" + application.mockDefaultApplicationValue = false + + setupSubject() + subject.processUserDefaultState(isFirstRun: false) + + XCTAssertFalse(userDefaults.bool(forKey: PrefsKeys.DidDismissDefaultBrowserMessage)) + XCTAssertFalse(userDefaults.bool(forKey: PrefsKeys.AppleConfirmedUserIsDefaultBrowser)) + XCTAssertTrue(telemetryWrapper.recordedObjects.contains(.defaultBrowser)) + XCTAssertFalse(telemetryWrapper.recordedObjects.contains(.choiceScreenAcquisition)) + XCTAssertEqual(userDefaults.setCalledCount, 1) + } + + private func setupSubject() { + subject = DefaultBrowserUtil(userDefault: userDefaults, + telemetryWrapper: telemetryWrapper, + locale: locale, + application: application) + } +} diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockLocale.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockLocale.swift new file mode 100644 index 000000000000..a83de550374c --- /dev/null +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockLocale.swift @@ -0,0 +1,9 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +@testable import Client + +struct MockLocale: LocaleInterface { + var localeRegionCode: String? +} diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockUIApplication.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockUIApplication.swift new file mode 100644 index 000000000000..27118f5dcbad --- /dev/null +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Application/MockUIApplication.swift @@ -0,0 +1,14 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/ + +@testable import Client + +class MockUIApplication: UIApplicationInterface { + var mockDefaultApplicationValue = false + + @available(iOS 18.2, *) + func isDefault(_ category: UIApplication.Category) throws -> Bool { + return mockDefaultApplicationValue + } +} diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockUserDefaults.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockUserDefaults.swift index ce6fce5dca99..42df3c348569 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockUserDefaults.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockUserDefaults.swift @@ -10,6 +10,7 @@ class MockUserDefaults: UserDefaultsInterface { // MARK: - Properties public var savedData: [String: Any?] public var registrationDictionary: [String: Any] + public var setCalledCount = 0 // MARK: - Initializers init() { @@ -20,6 +21,7 @@ class MockUserDefaults: UserDefaultsInterface { // MARK: - Public interface func set(_ value: Any?, forKey defaultName: String) { savedData[defaultName] = value + setCalledCount += 1 } func object(forKey defaultName: String) -> Any? { @@ -28,6 +30,7 @@ class MockUserDefaults: UserDefaultsInterface { func set(_ value: Bool, forKey defaultName: String) { savedData[defaultName] = value + setCalledCount += 1 } func bool(forKey defaultName: String) -> Bool { diff --git a/firefox-ios/firefox-ios-tests/Tests/ClientTests/TelemetryWrapperTests.swift b/firefox-ios/firefox-ios-tests/Tests/ClientTests/TelemetryWrapperTests.swift index 23f98cdda5d4..624ad444b8b1 100644 --- a/firefox-ios/firefox-ios-tests/Tests/ClientTests/TelemetryWrapperTests.swift +++ b/firefox-ios/firefox-ios-tests/Tests/ClientTests/TelemetryWrapperTests.swift @@ -1567,6 +1567,27 @@ class TelemetryWrapperTests: XCTestCase { extras: extra) testEventMetricRecordingSuccess(metric: GleanMetrics.Webview.showErrorPage) } + + func testRecordIfUserDefault() { + TelemetryWrapper.recordEvent(category: .action, + method: .open, + object: .defaultBrowser, + extras: [TelemetryWrapper.EventExtraKey.isDefaultBrowser.rawValue: true]) + testBoolMetricSuccess(metric: GleanMetrics.App.defaultBrowser, + expectedValue: true, + failureMessage: "Failed to record is default browser") + } + + func testRecordChoiceScreenAcquisition() { + let key = TelemetryWrapper.EventExtraKey.didComeFromBrowserChoiceScreen.rawValue + TelemetryWrapper.recordEvent(category: .action, + method: .open, + object: .choiceScreenAcquisition, + extras: [key: true]) + testBoolMetricSuccess(metric: GleanMetrics.App.choiceScreenAcquisition, + expectedValue: true, + failureMessage: "Failed to record choice screen acquisition") + } } // MARK: - Helper functions to test telemetry diff --git a/test-fixtures/generate-metrics.sh b/test-fixtures/generate-metrics.sh index 000f0375ddcb..6f4b1b049aef 100755 --- a/test-fixtures/generate-metrics.sh +++ b/test-fixtures/generate-metrics.sh @@ -4,8 +4,8 @@ set -e BUILD_LOG_FILE="$1" TYPE_LOG_FILE="$2" -THRESHOLD_UNIT_TEST=9 -THRESHOLD_XCUITEST=8 +THRESHOLD_UNIT_TEST=28 +THRESHOLD_XCUITEST=28 WARNING_COUNT=$(grep -E -v "SourcePackages/checkouts" "$BUILD_LOG_FILE" | grep -E "(^|:)[0-9]+:[0-9]+:|warning:|ld: warning:|:0: warning:|fatal|===" | uniq | wc -l)