&SystemPreferences::SubscribeNotification)
.SetMethod("unsubscribeNotification",
&SystemPreferences::UnsubscribeNotification)
+ .SetMethod("subscribeLocalNotification",
+ &SystemPreferences::SubscribeLocalNotification)
+ .SetMethod("unsubscribeLocalNotification",
+ &SystemPreferences::UnsubscribeLocalNotification)
.SetMethod("getUserDefault", &SystemPreferences::GetUserDefault)
#endif
.SetMethod("isDarkMode", &SystemPreferences::IsDarkMode);
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype);
-#if defined(OS_MACOSX)
- using NotificationCallback = base::Callback<
- void(const std::string&, const base::DictionaryValue&)>;
-#endif
-
#if defined(OS_WIN)
bool IsAeroGlassEnabled();
#elif defined(OS_MACOSX)
+ using NotificationCallback = base::Callback<
+ void(const std::string&, const base::DictionaryValue&)>;
+
int SubscribeNotification(const std::string& name,
const NotificationCallback& callback);
void UnsubscribeNotification(int id);
+ int SubscribeLocalNotification(const std::string& name,
+ const NotificationCallback& callback);
+ void UnsubscribeLocalNotification(int request_id);
v8::Local<v8::Value> GetUserDefault(const std::string& name,
const std::string& type);
#endif
explicit SystemPreferences(v8::Isolate* isolate);
~SystemPreferences() override;
+#if defined(OS_MACOSX)
+ int DoSubscribeNotification(const std::string& name,
+ const NotificationCallback& callback,
+ bool is_local);
+ void DoUnsubscribeNotification(int request_id, bool is_local);
+#endif
+
private:
DISALLOW_COPY_AND_ASSIGN(SystemPreferences);
};
int SystemPreferences::SubscribeNotification(
const std::string& name, const NotificationCallback& callback) {
+ return DoSubscribeNotification(name, callback, false);
+}
+
+void SystemPreferences::UnsubscribeNotification(int request_id) {
+ DoUnsubscribeNotification(request_id, false);
+}
+
+int SystemPreferences::SubscribeLocalNotification(
+ const std::string& name, const NotificationCallback& callback) {
+ return DoSubscribeNotification(name, callback, true);
+}
+
+void SystemPreferences::UnsubscribeLocalNotification(int request_id) {
+ DoUnsubscribeNotification(request_id, true);
+}
+
+int SystemPreferences::DoSubscribeNotification(const std::string& name,
+ const NotificationCallback& callback, bool is_local) {
int request_id = g_next_id++;
__block NotificationCallback copied_callback = callback;
- g_id_map[request_id] = [[NSDistributedNotificationCenter defaultCenter]
- addObserverForName:base::SysUTF8ToNSString(name)
- object:nil
- queue:nil
- usingBlock:^(NSNotification* notification) {
- std::unique_ptr<base::DictionaryValue> user_info =
- NSDictionaryToDictionaryValue(notification.userInfo);
- if (user_info) {
- copied_callback.Run(
- base::SysNSStringToUTF8(notification.name),
- *user_info);
- } else {
- copied_callback.Run(
- base::SysNSStringToUTF8(notification.name),
- base::DictionaryValue());
- }
+ NSNotificationCenter* center = is_local ?
+ [NSNotificationCenter defaultCenter] :
+ [NSDistributedNotificationCenter defaultCenter];
+
+ g_id_map[request_id] = [center
+ addObserverForName:base::SysUTF8ToNSString(name)
+ object:nil
+ queue:nil
+ usingBlock:^(NSNotification* notification) {
+ std::unique_ptr<base::DictionaryValue> user_info =
+ NSDictionaryToDictionaryValue(notification.userInfo);
+ if (user_info) {
+ copied_callback.Run(
+ base::SysNSStringToUTF8(notification.name),
+ *user_info);
+ } else {
+ copied_callback.Run(
+ base::SysNSStringToUTF8(notification.name),
+ base::DictionaryValue());
}
+ }
];
return request_id;
}
-void SystemPreferences::UnsubscribeNotification(int request_id) {
+void SystemPreferences::DoUnsubscribeNotification(int request_id, bool is_local) {
auto iter = g_id_map.find(request_id);
if (iter != g_id_map.end()) {
id observer = iter->second;
- [[NSDistributedNotificationCenter defaultCenter] removeObserver:observer];
+ NSNotificationCenter* center = is_local ?
+ [NSNotificationCenter defaultCenter] :
+ [NSDistributedNotificationCenter defaultCenter];
+ [center removeObserver:observer];
g_id_map.erase(iter);
}
}
Removes the subscriber with `id`.
+### `systemPreferences.subscribeLocalNotification(event, callback)` _macOS_
+
+Same as `subscribeNotification`, but uses `NSNotificationCenter` for local defaults.
+This is necessary for events such as:
+
+* `NSUserDefaultsDidChangeNotification`
+
+### `systemPreferences.unsubscribeLocalNotification(id)` _macOS_
+
+Same as `unsubscribeNotification`, but removes the subscriber from `NSNotificationCenter`.
+
### `systemPreferences.getUserDefault(key, type)` _macOS_
* `key` String