Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for uploading crash reports to Sentry #2720

Merged
merged 40 commits into from
Apr 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
7373015
Use local BSK
miasma13 Dec 20, 2023
ab472f2
Show prompt asking for crash collection sending
miasma13 Dec 20, 2023
daa1d4a
Use BSK from a branch
ayoy Mar 26, 2024
1777865
Add user defaults flag to control sending crash logs
ayoy Mar 26, 2024
eaf2b96
Update to non-static CrashCollection
ayoy Mar 26, 2024
79c9050
Update BSK
ayoy Mar 27, 2024
674b8f8
Add CrashCollectionOnboarding
ayoy Mar 27, 2024
0401682
Update BSK ref
ayoy Mar 28, 2024
ea78465
Update CrashCollectionOnboardingView according to the newest design
ayoy Apr 8, 2024
d441f6e
Merge branch 'main' into dominik/sentry-appstore
ayoy Apr 8, 2024
4084eb0
Improve UX of the crash report dialog
ayoy Apr 10, 2024
c4407f1
Upload debug symbols to S3 from the release workflow
ayoy Apr 10, 2024
4fc3d7b
Merge branch 'main' into dominik/sentry-appstore
ayoy Apr 10, 2024
5ae0724
Add placeholder crash reports cell to new Settings
ayoy Apr 10, 2024
c988728
Fix UI glitching when displaying crash report contents and make the d…
ayoy Apr 11, 2024
5dfd1a4
Update Breakage image
ayoy Apr 11, 2024
b28e035
Move crash reports setting in New Settings to About section
ayoy Apr 11, 2024
d8fef3d
Always show crash reporting dialog in portait mode on iPhone
ayoy Apr 11, 2024
b43a468
Merge branch 'main' into dominik/sentry-appstore
ayoy Apr 11, 2024
6885adc
Fix SwiftLint
ayoy Apr 11, 2024
6f792d6
Replace sendCrashLogs with crashCollectionOptInStatus enum
ayoy Apr 11, 2024
88168d1
Update colors in the crash report dialog
ayoy Apr 12, 2024
bc14bae
Update background colors
ayoy Apr 12, 2024
3d41553
Merge branch 'main' into dominik/sentry-appstore
ayoy Apr 12, 2024
686b1dc
Move crash collection tests to BSK
ayoy Apr 12, 2024
a802ec7
Add documentation for crash reporting related code
ayoy Apr 12, 2024
11eb50f
Fix SwiftLint issues
ayoy Apr 12, 2024
4c8bd74
Update BSK ref
ayoy Apr 12, 2024
35950d3
Use different explanation copy for new settings
ayoy Apr 12, 2024
2078d09
Update old settings cell
ayoy Apr 15, 2024
7c22b1a
Add dedicated chevron icon for the See What's Sent button
ayoy Apr 15, 2024
053bf2c
Don't animate show/hide button
ayoy Apr 15, 2024
a414226
Use decorative image
ayoy Apr 16, 2024
298146e
Merge branch 'main' into dominik/sentry-appstore
ayoy Apr 16, 2024
ea56423
Update app settings when crash collection opt in status is toggled
ayoy Apr 16, 2024
ecdf684
Allow to skip crash onboarding dialog with a swipe gesture
ayoy Apr 16, 2024
28f3320
Update copy
ayoy Apr 16, 2024
366412c
Update localizations
ayoy Apr 18, 2024
c4d74a4
Merge branch 'main' into dominik/sentry-appstore
ayoy Apr 18, 2024
ec37502
Use BSK 137.0.0
ayoy Apr 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,16 @@ jobs:
--form "file=@${asana_dsyms_path};type=application/zip"
fi

- name: Upload debug symbols to S3
if: always()
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }}
DSYM_S3_PATH: s3://${{ vars.DSYM_BUCKET_NAME }}/${{ vars.DSYM_BUCKET_PREFIX }}/
run: |
aws s3 cp "${{ github.workspace }}/DuckDuckGo-${{ env.app_version }}-dSYM.zip" ${{ env.DSYM_S3_PATH }}

- name: Send Mattermost message
if: ${{ success() || failure() }} # Don't execute when cancelled
env:
Expand Down
28 changes: 22 additions & 6 deletions DuckDuckGo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,9 @@
37A6A8FE2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A6A8FD2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift */; };
37CBCA9E2A8A659C0050218F /* SyncSettingsAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CBCA9D2A8A659C0050218F /* SyncSettingsAdapter.swift */; };
37CEFCAC2A673B90001EF741 /* CredentialsCleanupErrorHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CEFCAB2A673B90001EF741 /* CredentialsCleanupErrorHandling.swift */; };
37CF91602BB4737300BADCAE /* CrashCollectionOnboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CF915F2BB4737300BADCAE /* CrashCollectionOnboarding.swift */; };
37CF91622BB474AA00BADCAE /* CrashCollectionOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CF91612BB474AA00BADCAE /* CrashCollectionOnboardingView.swift */; };
37CF91642BB4A82A00BADCAE /* CrashCollectionOnboardingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CF91632BB4A82A00BADCAE /* CrashCollectionOnboardingViewModel.swift */; };
37DF000A29F9C416002B7D3E /* SyncMetadataDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DF000929F9C416002B7D3E /* SyncMetadataDatabase.swift */; };
37DF000C29F9CA80002B7D3E /* SyncDataProviders in Frameworks */ = {isa = PBXBuildFile; productRef = 37DF000B29F9CA80002B7D3E /* SyncDataProviders */; };
37DF000F29F9D635002B7D3E /* SyncBookmarksAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DF000E29F9D635002B7D3E /* SyncBookmarksAdapter.swift */; };
Expand Down Expand Up @@ -435,7 +438,6 @@
85449EFD23FDA71F00512AAF /* KeyboardSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85449EFC23FDA71F00512AAF /* KeyboardSettings.swift */; };
8544C37C250B827300A0FE73 /* UserText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8544C37A250B823600A0FE73 /* UserText.swift */; };
8546A54A2A672959003929BF /* MainViewController+Email.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8546A5492A672959003929BF /* MainViewController+Email.swift */; };
85480CB429226B3B007E8F13 /* CrashCollectionExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85480CB229226B1E007E8F13 /* CrashCollectionExtensionTests.swift */; };
85482D8D2462DCD100EDEDD1 /* ActionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85482D8C2462DCD100EDEDD1 /* ActionViewController.swift */; };
85482D902462DCD100EDEDD1 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 85482D8E2462DCD100EDEDD1 /* MainInterface.storyboard */; };
85482D942462DCD100EDEDD1 /* OpenAction.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 85482D882462DCD100EDEDD1 /* OpenAction.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
Expand Down Expand Up @@ -1428,6 +1430,9 @@
37A6A8FD2AFD0208008580A3 /* FaviconsFetcherOnboarding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FaviconsFetcherOnboarding.swift; sourceTree = "<group>"; };
37CBCA9D2A8A659C0050218F /* SyncSettingsAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncSettingsAdapter.swift; sourceTree = "<group>"; };
37CEFCAB2A673B90001EF741 /* CredentialsCleanupErrorHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialsCleanupErrorHandling.swift; sourceTree = "<group>"; };
37CF915F2BB4737300BADCAE /* CrashCollectionOnboarding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashCollectionOnboarding.swift; sourceTree = "<group>"; };
37CF91612BB474AA00BADCAE /* CrashCollectionOnboardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashCollectionOnboardingView.swift; sourceTree = "<group>"; };
37CF91632BB4A82A00BADCAE /* CrashCollectionOnboardingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashCollectionOnboardingViewModel.swift; sourceTree = "<group>"; };
37DF000929F9C416002B7D3E /* SyncMetadataDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncMetadataDatabase.swift; sourceTree = "<group>"; };
37DF000E29F9D635002B7D3E /* SyncBookmarksAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncBookmarksAdapter.swift; sourceTree = "<group>"; };
37E615742A5F533E00ACD63D /* SyncCredentialsAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncCredentialsAdapter.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1585,7 +1590,6 @@
85449F0023FEAF3000512AAF /* UserDefaultsExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsExtension.swift; sourceTree = "<group>"; };
8544C37A250B823600A0FE73 /* UserText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserText.swift; sourceTree = "<group>"; };
8546A5492A672959003929BF /* MainViewController+Email.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MainViewController+Email.swift"; sourceTree = "<group>"; };
85480CB229226B1E007E8F13 /* CrashCollectionExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashCollectionExtensionTests.swift; sourceTree = "<group>"; };
85481A6A2BA46AFB00F9EFB0 /* AppRatingPrompt 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AppRatingPrompt 2.xcdatamodel"; sourceTree = "<group>"; };
85482D882462DCD100EDEDD1 /* OpenAction.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = OpenAction.appex; sourceTree = BUILT_PRODUCTS_DIR; };
85482D8C2462DCD100EDEDD1 /* ActionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3650,6 +3654,16 @@
name = SettingSyncHandlers;
sourceTree = "<group>";
};
37CF915E2BB4735F00BADCAE /* Crashes */ = {
isa = PBXGroup;
children = (
37CF915F2BB4737300BADCAE /* CrashCollectionOnboarding.swift */,
37CF91612BB474AA00BADCAE /* CrashCollectionOnboardingView.swift */,
37CF91632BB4A82A00BADCAE /* CrashCollectionOnboardingViewModel.swift */,
);
name = Crashes;
sourceTree = "<group>";
};
37DF000829F9C3F0002B7D3E /* Sync */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -3946,6 +3960,7 @@
9830A05725ED0C5D00DB64DE /* BrowsingMenu */,
CB258D1129A4F1BB00DEBA24 /* Configuration */,
B652DF02287C01EE00C12A9C /* ContentBlocking */,
37CF915E2BB4735F00BADCAE /* Crashes */,
D6E0C1812B7A2B0700D5E1E9 /* DesktopDownloads */,
310D09192799EF5C00DC0060 /* Downloads */,
F143C2C51E4A08F300CFDE3A /* DuckDuckGo.entitlements */,
Expand Down Expand Up @@ -5391,7 +5406,6 @@
children = (
85BA58561F34F61C00C6E8CA /* AppUserDefaultsTests.swift */,
4B62C4B925B930DD008912C6 /* AppConfigurationFetchTests.swift */,
85480CB229226B1E007E8F13 /* CrashCollectionExtensionTests.swift */,
85AFA1202B45D14F0028A504 /* BookmarksMigrationAssertionTests.swift */,
);
name = Application;
Expand Down Expand Up @@ -6824,6 +6838,7 @@
CB9B873C278C8FEA001F4906 /* WidgetEducationView.swift in Sources */,
85F200002215C17B006BB258 /* FindInPage.swift in Sources */,
F1386BA41E6846C40062FC3C /* TabDelegate.swift in Sources */,
37CF91602BB4737300BADCAE /* CrashCollectionOnboarding.swift in Sources */,
C1B924B72ACD6E6800EE7B06 /* AutofillNeverSavedTableViewCell.swift in Sources */,
020108A929A7C1CD00644F9D /* AppTrackerImageCache.swift in Sources */,
4B78074E2B183A1F009DB2CF /* SurveyURLBuilder.swift in Sources */,
Expand Down Expand Up @@ -6905,6 +6920,7 @@
F4D7221026F29A70007D6193 /* BookmarkDetailsCell.swift in Sources */,
F1617C131E572E0300DEDCAF /* TabSwitcherViewController.swift in Sources */,
83BE9BC3215D69C1009844D9 /* AppConfigurationFetch.swift in Sources */,
37CF91622BB474AA00BADCAE /* CrashCollectionOnboardingView.swift in Sources */,
1EEC460627A9499600E75FCB /* DownloadsList.swift in Sources */,
D6E83C5A2B2213ED006C8AFB /* SettingsPrivacyView.swift in Sources */,
85B9CB8921AEBDD5009001F1 /* FavoriteHomeCell.swift in Sources */,
Expand Down Expand Up @@ -6942,6 +6958,7 @@
D66F683D2BB333C100AE93E2 /* SubscriptionContainerView.swift in Sources */,
851B128822200575004781BC /* Onboarding.swift in Sources */,
3151F0EE2735800800226F58 /* VoiceSearchFeedbackView.swift in Sources */,
37CF91642BB4A82A00BADCAE /* CrashCollectionOnboardingViewModel.swift in Sources */,
857EEB752095FFAC008A005C /* HomeRowInstructionsViewController.swift in Sources */,
311BD1AF2836BB4200AEF6C1 /* AutofillItemsLockedView.swift in Sources */,
85DE681A2B6A8BB000DED4FE /* MainViewCoordinator.swift in Sources */,
Expand Down Expand Up @@ -7345,7 +7362,6 @@
851DFD8A212C5EE800D95F20 /* TabSwitcherButtonTests.swift in Sources */,
98983096255B5019003339A2 /* BookmarksCachingSearchTests.swift in Sources */,
EE7917912A83DE93008DFF28 /* CombineTestUtilities.swift in Sources */,
85480CB429226B3B007E8F13 /* CrashCollectionExtensionTests.swift in Sources */,
8540BD5223D8C2220057FDD2 /* PreserveLoginsTests.swift in Sources */,
85F200072217032E006BB258 /* AddressDisplayHelperTests.swift in Sources */,
B6AD9E3728D4510A0019CDE9 /* ContentBlockingUpdatingTests.swift in Sources */,
Expand Down Expand Up @@ -10245,7 +10261,7 @@
repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit";
requirement = {
kind = exactVersion;
version = 136.0.0;
version = 137.0.0;
};
};
9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = {
Expand Down Expand Up @@ -10285,7 +10301,7 @@
repositoryURL = "https://github.com/duckduckgo/DesignResourcesKit";
requirement = {
kind = exactVersion;
version = 2.0.0;
version = 3.0.0;
};
};
F486D2EF25069482002D07D7 /* XCRemoteSwiftPackageReference "Kingfisher" */ = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/DuckDuckGo/BrowserServicesKit",
"state" : {
"revision" : "7eab61a08c9535b1a8e59c622fe57d33a310a2fc",
"version" : "136.0.0"
"revision" : "4ce049682cb47a9fb510237070666e5e8bf1e07b",
"version" : "137.0.0"
}
},
{
Expand All @@ -59,8 +59,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/DesignResourcesKit",
"state" : {
"revision" : "d7ea2561ec7624c224f52e1c9b349075ddf1c782",
"version" : "2.0.0"
"revision" : "ae83941bb277a2750abc2d6697fa278f8c8c5f5e",
"version" : "3.0.0"
}
},
{
Expand Down Expand Up @@ -138,7 +138,7 @@
{
"identity" : "swift-argument-parser",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-argument-parser",
"location" : "https://github.com/apple/swift-argument-parser.git",
"state" : {
"revision" : "46989693916f56d1186bd59ac15124caef896560",
"version" : "1.3.1"
Expand Down
6 changes: 5 additions & 1 deletion DuckDuckGo/AboutView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,13 @@ struct AboutViewVersion: View {
@EnvironmentObject var viewModel: SettingsViewModel

var body: some View {
Section(header: Text("DuckDuckGo for iOS")) {
Section(header: Text("DuckDuckGo for iOS"), footer: Text(UserText.settingsSendCrashReportsDescription)) {
SettingsCellView(label: UserText.settingsVersion,
accesory: .rightDetail(viewModel.state.version))

// Send Crash Reports
SettingsCellView(label: UserText.settingsSendCrashReports,
accesory: .toggle(isOn: viewModel.crashCollectionOptInStatusBinding))
}
}
}
Expand Down
20 changes: 18 additions & 2 deletions DuckDuckGo/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
private var syncStateCancellable: AnyCancellable?
private var isSyncInProgressCancellable: AnyCancellable?

private let crashCollection = CrashCollection(platform: .iOS, log: .generalLog)
private var crashReportUploaderOnboarding: CrashCollectionOnboarding?

// MARK: lifecycle

@UserDefaultsWrapper(key: .privacyConfigCustomURL, defaultValue: nil)
Expand Down Expand Up @@ -130,8 +133,21 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
Configuration.setURLProvider(AppConfigurationURLProvider())
}

CrashCollection.start {
Pixel.fire(pixel: .dbCrashDetected, withAdditionalParameters: $0, includedParameters: [])
crashCollection.start { pixelParameters, payloads, sendReport in
pixelParameters.forEach { params in
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Previously the callback was called for every crash report found. Now we have a single callback that can contain multiple crash reports. We still send pixels for all crash reports, and we present onboarding for Sentry as needed using the most recent crash report (this is the same behavior as on macOS for both DMG and App Store builds).

Pixel.fire(pixel: .dbCrashDetected, withAdditionalParameters: params, includedParameters: [])
}

// Async dispatch because rootViewController may otherwise be nil here
DispatchQueue.main.async {
guard let viewController = self.window?.rootViewController else {
return
}
let dataPayloads = payloads.map { $0.jsonRepresentation() }
let crashReportUploaderOnboarding = CrashCollectionOnboarding(appSettings: AppDependencyProvider.shared.appSettings)
crashReportUploaderOnboarding.presentOnboardingIfNeeded(for: dataPayloads, from: viewController, sendReport: sendReport)
self.crashReportUploaderOnboarding = crashReportUploaderOnboarding
}
}

clearTmp()
Expand Down
2 changes: 2 additions & 0 deletions DuckDuckGo/AppSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,6 @@ protocol AppSettings: AnyObject {

var isSyncBookmarksPaused: Bool { get }
var isSyncCredentialsPaused: Bool { get }

var crashCollectionOptInStatus: CrashCollectionOptInStatus { get set }
}
16 changes: 16 additions & 0 deletions DuckDuckGo/AppUserDefaults.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import Core
import WidgetKit

// swiftlint:disable file_length
// swiftlint:disable:next type_body_length
public class AppUserDefaults: AppSettings {

public struct Notifications {
Expand Down Expand Up @@ -71,6 +72,8 @@ public class AppUserDefaults: AppSettings {
static let autofillIsNewInstallForOnByDefault = "com.duckduckgo.ios.autofillIsNewInstallForOnByDefault"

static let favoritesDisplayMode = "com.duckduckgo.ios.favoritesDisplayMode"

static let crashCollectionOptInStatus = "com.duckduckgo.ios.crashCollectionOptInStatus"
}

private struct DebugKeys {
Expand Down Expand Up @@ -343,6 +346,19 @@ public class AppUserDefaults: AppSettings {
}
}

var crashCollectionOptInStatus: CrashCollectionOptInStatus {
get {
guard let string = userDefaults?.string(forKey: Keys.crashCollectionOptInStatus),
let optInStatus = CrashCollectionOptInStatus(rawValue: string)
else {
return .undetermined
}
return optInStatus
}
set {
userDefaults?.setValue(newValue.rawValue, forKey: Keys.crashCollectionOptInStatus)
}
}
}

extension AppUserDefaults: AppConfigurationFetchStatistics {
Expand Down
Binary file modified DuckDuckGo/Assets.xcassets/Breakage-128.imageset/Breakage-128.pdf
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions DuckDuckGo/Assets.xcassets/ChevronDown.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "Chevron-Small-Down-16.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions DuckDuckGo/Assets.xcassets/ChevronUp.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "Chevron-Small-Up-16.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
Loading
Loading