| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import <Foundation/Foundation.h> |
| |
| #import "ios/components/order_file/save_order_file.h" |
| |
| #define IOS_ORDER_FILE_STARTUP_END_DELAY_MS 4000 |
| |
| static NSString* const kOrderFileError = @"OrderFileGenerationError"; |
| |
| @interface CRWStartupOrderFile : NSObject |
| @end |
| |
| @implementation CRWStartupOrderFile |
| |
| + (void)load { |
| // `load` methods are called early in startup (immediately post-main). |
| // Installing the observer here should always be completed before the relevant |
| // launch signal is reached. |
| [self installRunLoopObserver]; |
| } |
| |
| + (void)saveOrderFile { |
| int64_t saveDelayTimeNs = |
| (int64_t)IOS_ORDER_FILE_STARTUP_END_DELAY_MS * NSEC_PER_MSEC; |
| dispatch_after(dispatch_time(DISPATCH_TIME_NOW, saveDelayTimeNs), |
| dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ |
| CRWSaveOrderFile(); |
| }); |
| } |
| |
| + (void)installRunLoopObserver { |
| // Maximum priority means this observer will fire after all other similar |
| // observers enqueued. |
| CFRunLoopObserverRef runLoopObserver = CFRunLoopObserverCreateWithHandler( |
| NULL, kCFRunLoopBeforeWaiting, NO, LONG_MAX, |
| ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) { |
| [CRWStartupOrderFile saveOrderFile]; |
| CFRunLoopRemoveObserver(CFRunLoopGetMain(), observer, |
| kCFRunLoopDefaultMode); |
| CFRelease(observer); |
| }); |
| CFRunLoopAddObserver(CFRunLoopGetMain(), runLoopObserver, |
| kCFRunLoopDefaultMode); |
| } |
| |
| @end |