Browse Source

refactor: add ARC scaffolding for macOS (#38621)

Shelley Vohr 1 year ago
parent
commit
9a9d8ae5ea

+ 22 - 0
BUILD.gn

@@ -540,6 +540,7 @@ source_set("electron_lib") {
 
   if (is_mac) {
     deps += [
+      ":electron_lib_arc",
       "//components/remote_cocoa/app_shim",
       "//components/remote_cocoa/browser",
       "//content/browser:mac_helpers",
@@ -774,6 +775,27 @@ source_set("electron_lib") {
   }
 }
 
+if (is_mac) {
+  source_set("electron_lib_arc") {
+    include_dirs = [ "." ]
+    sources = [
+      "shell/browser/mac/dict_util.h",
+      "shell/browser/mac/dict_util.mm",
+      "shell/browser/mac/electron_application_delegate.h",
+      "shell/browser/mac/electron_application_delegate.mm",
+    ]
+
+    deps = [
+      "//base",
+      "//skia",
+      "//third_party/electron_node:node_lib",
+      "//v8",
+    ]
+
+    configs += [ "//build/config/compiler:enable_arc" ]
+  }
+}
+
 electron_paks("packed_resources") {
   if (is_mac) {
     output_dir = "$root_gen_dir/electron_repack"

+ 0 - 4
filenames.gni

@@ -129,10 +129,6 @@ filenames = {
     "shell/browser/auto_updater_mac.mm",
     "shell/browser/browser_mac.mm",
     "shell/browser/electron_browser_main_parts_mac.mm",
-    "shell/browser/mac/dict_util.h",
-    "shell/browser/mac/dict_util.mm",
-    "shell/browser/mac/electron_application_delegate.h",
-    "shell/browser/mac/electron_application_delegate.mm",
     "shell/browser/mac/electron_application.h",
     "shell/browser/mac/electron_application.mm",
     "shell/browser/mac/in_app_purchase_observer.h",

+ 4 - 0
shell/browser/mac/dict_util.mm

@@ -10,6 +10,10 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/values.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace electron {
 
 NSArray* ListValueToNSArray(const base::Value::List& value) {

+ 1 - 4
shell/browser/mac/electron_application_delegate.h

@@ -9,10 +9,7 @@
 
 #import "shell/browser/ui/cocoa/electron_menu_controller.h"
 
-@interface ElectronApplicationDelegate : NSObject <NSApplicationDelegate> {
- @private
-  base::scoped_nsobject<ElectronMenuController> menu_controller_;
-}
+@interface ElectronApplicationDelegate : NSObject <NSApplicationDelegate>
 
 // Sets the menu that will be returned in "applicationDockMenu:".
 - (void)setApplicationDockMenu:(electron::ElectronMenuModel*)model;

+ 16 - 15
shell/browser/mac/electron_application_delegate.mm

@@ -10,7 +10,6 @@
 #include "base/allocator/buildflags.h"
 #include "base/allocator/partition_allocator/shim/allocator_shim.h"
 #include "base/mac/mac_util.h"
-#include "base/mac/scoped_objc_class_swizzler.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/values.h"
 #include "shell/browser/api/electron_api_push_notifications.h"
@@ -20,9 +19,12 @@
 
 #import <UserNotifications/UserNotifications.h>
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 static NSDictionary* UNNotificationResponseToNSDictionary(
     UNNotificationResponse* response) API_AVAILABLE(macosx(10.14)) {
-  // [response isKindOfClass:[UNNotificationResponse class]]
   if (![response respondsToSelector:@selector(actionIdentifier)] ||
       ![response respondsToSelector:@selector(notification)]) {
     return nil;
@@ -43,11 +45,13 @@ static NSDictionary* UNNotificationResponseToNSDictionary(
   return result;
 }
 
-@implementation ElectronApplicationDelegate
+@implementation ElectronApplicationDelegate {
+  ElectronMenuController* __strong menu_controller_;
+}
 
 - (void)setApplicationDockMenu:(electron::ElectronMenuModel*)model {
-  menu_controller_.reset([[ElectronMenuController alloc] initWithModel:model
-                                                 useDefaultAccelerator:NO]);
+  menu_controller_ = [[ElectronMenuController alloc] initWithModel:model
+                                             useDefaultAccelerator:NO];
 }
 
 - (void)willPowerOff:(NSNotification*)notify {
@@ -97,10 +101,7 @@ static NSDictionary* UNNotificationResponseToNSDictionary(
 }
 
 - (NSMenu*)applicationDockMenu:(NSApplication*)sender {
-  if (menu_controller_)
-    return [menu_controller_ menu];
-  else
-    return nil;
+  return menu_controller_ ? menu_controller_.menu : nil;
 }
 
 - (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename {
@@ -126,7 +127,7 @@ static NSDictionary* UNNotificationResponseToNSDictionary(
               restorationHandler {
   std::string activity_type(base::SysNSStringToUTF8(userActivity.activityType));
   NSURL* url = userActivity.webpageURL;
-  NSDictionary* details = url ? @{@"webpageURL" : [url absoluteString]} : @{};
+  NSDictionary* details = url ? @{@"webpageURL" : url.absoluteString} : @{};
   if (!userActivity.userInfo)
     return NO;
 
@@ -152,7 +153,7 @@ static NSDictionary* UNNotificationResponseToNSDictionary(
                                     error:(NSError*)error {
   std::string activity_type(base::SysNSStringToUTF8(userActivityType));
   std::string error_message(
-      base::SysNSStringToUTF8([error localizedDescription]));
+      base::SysNSStringToUTF8(error.localizedDescription));
 
   electron::Browser* browser = electron::Browser::Get();
   browser->DidFailToContinueUserActivity(activity_type, error_message);
@@ -165,9 +166,9 @@ static NSDictionary* UNNotificationResponseToNSDictionary(
 - (void)application:(NSApplication*)application
     didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
   // https://stackoverflow.com/a/16411517
-  const char* token_data = static_cast<const char*>([deviceToken bytes]);
+  const char* token_data = static_cast<const char*>(deviceToken.bytes);
   NSMutableString* token_string = [NSMutableString string];
-  for (NSUInteger i = 0; i < [deviceToken length]; i++) {
+  for (NSUInteger i = 0; i < deviceToken.length; i++) {
     [token_string appendFormat:@"%02.2hhX", token_data[i]];
   }
   // Resolve outstanding APNS promises created during registration attempts
@@ -182,8 +183,8 @@ static NSDictionary* UNNotificationResponseToNSDictionary(
 - (void)application:(NSApplication*)application
     didFailToRegisterForRemoteNotificationsWithError:(NSError*)error {
   std::string error_message(base::SysNSStringToUTF8(
-      [NSString stringWithFormat:@"%ld %@ %@", [error code], [error domain],
-                                 [error userInfo]]));
+      [NSString stringWithFormat:@"%ld %@ %@", error.code, error.domain,
+                                 error.userInfo]));
   electron::api::PushNotifications* push_notifications =
       electron::api::PushNotifications::Get();
   if (push_notifications) {