1*6777b538SAndroid Build Coastguard Worker// Copyright 2023 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker// Defines base::PathProviderIOS which replaces base::PathProviderPosix for iOS 6*6777b538SAndroid Build Coastguard Worker// in base/path_service.cc. 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker#include "base/apple/bundle_locations.h" 11*6777b538SAndroid Build Coastguard Worker#include "base/apple/foundation_util.h" 12*6777b538SAndroid Build Coastguard Worker#include "base/base_paths.h" 13*6777b538SAndroid Build Coastguard Worker#include "base/base_paths_apple.h" 14*6777b538SAndroid Build Coastguard Worker#include "base/files/file_path.h" 15*6777b538SAndroid Build Coastguard Worker#include "base/files/file_util.h" 16*6777b538SAndroid Build Coastguard Worker#include "base/path_service.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Workernamespace base { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Workerbool PathProviderIOS(int key, base::FilePath* result) { 21*6777b538SAndroid Build Coastguard Worker switch (key) { 22*6777b538SAndroid Build Coastguard Worker case base::FILE_EXE: 23*6777b538SAndroid Build Coastguard Worker *result = base::apple::internal::GetExecutablePath(); 24*6777b538SAndroid Build Coastguard Worker return true; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker case base::DIR_APP_DATA: { 27*6777b538SAndroid Build Coastguard Worker base::FilePath path; 28*6777b538SAndroid Build Coastguard Worker if (!base::apple::GetUserDirectory(NSApplicationSupportDirectory, 29*6777b538SAndroid Build Coastguard Worker &path)) { 30*6777b538SAndroid Build Coastguard Worker return false; 31*6777b538SAndroid Build Coastguard Worker } 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker // On iOS, this directory does not exist unless it is created explicitly. 34*6777b538SAndroid Build Coastguard Worker if (!base::PathExists(path) && !base::CreateDirectory(path)) { 35*6777b538SAndroid Build Coastguard Worker return false; 36*6777b538SAndroid Build Coastguard Worker } 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker *result = path; 39*6777b538SAndroid Build Coastguard Worker return true; 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker case base::DIR_SRC_TEST_DATA_ROOT: 43*6777b538SAndroid Build Coastguard Worker case base::DIR_OUT_TEST_DATA_ROOT: 44*6777b538SAndroid Build Coastguard Worker // On iOS, there is no access to source root, nor build dir, 45*6777b538SAndroid Build Coastguard Worker // however, the necessary resources are packaged into the 46*6777b538SAndroid Build Coastguard Worker // test app as assets. 47*6777b538SAndroid Build Coastguard Worker [[fallthrough]]; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker case base::DIR_ASSETS: 50*6777b538SAndroid Build Coastguard Worker // On iOS, the resources are located at the root of the framework bundle. 51*6777b538SAndroid Build Coastguard Worker *result = base::apple::FrameworkBundlePath(); 52*6777b538SAndroid Build Coastguard Worker#if BUILDFLAG(IS_IOS_MACCATALYST) 53*6777b538SAndroid Build Coastguard Worker // When running in the catalyst environment (i.e. building an iOS app 54*6777b538SAndroid Build Coastguard Worker // to run on macOS), the bundles have the same structure as macOS, so 55*6777b538SAndroid Build Coastguard Worker // the resources are in the "Contents/Resources" sub-directory. 56*6777b538SAndroid Build Coastguard Worker *result = result->Append(FILE_PATH_LITERAL("Contents")) 57*6777b538SAndroid Build Coastguard Worker .Append(FILE_PATH_LITERAL("Resources")); 58*6777b538SAndroid Build Coastguard Worker#endif // BUILDFLAG(IS_IOS_MACCATALYST) 59*6777b538SAndroid Build Coastguard Worker return true; 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker case base::DIR_CACHE: 62*6777b538SAndroid Build Coastguard Worker return base::apple::GetUserDirectory(NSCachesDirectory, result); 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker default: 65*6777b538SAndroid Build Coastguard Worker return false; 66*6777b538SAndroid Build Coastguard Worker } 67*6777b538SAndroid Build Coastguard Worker} 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker} // namespace base 70