Merge pull request #11654 from sethlu/set-notification-close-button-text
feat: Set macOS notification close button title
This commit is contained in:
commit
af92b04eb9
6 changed files with 133 additions and 21 deletions
|
@ -70,6 +70,7 @@ Notification::Notification(v8::Isolate* isolate,
|
||||||
opts.Get("hasReply", &has_reply_);
|
opts.Get("hasReply", &has_reply_);
|
||||||
opts.Get("actions", &actions_);
|
opts.Get("actions", &actions_);
|
||||||
opts.Get("sound", &sound_);
|
opts.Get("sound", &sound_);
|
||||||
|
opts.Get("closeButtonText", &close_button_text_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,20 +105,24 @@ bool Notification::GetSilent() const {
|
||||||
return silent_;
|
return silent_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Notification::GetHasReply() const {
|
||||||
|
return has_reply_;
|
||||||
|
}
|
||||||
|
|
||||||
base::string16 Notification::GetReplyPlaceholder() const {
|
base::string16 Notification::GetReplyPlaceholder() const {
|
||||||
return reply_placeholder_;
|
return reply_placeholder_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notification::GetHasReply() const {
|
base::string16 Notification::GetSound() const {
|
||||||
return has_reply_;
|
return sound_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<brightray::NotificationAction> Notification::GetActions() const {
|
std::vector<brightray::NotificationAction> Notification::GetActions() const {
|
||||||
return actions_;
|
return actions_;
|
||||||
}
|
}
|
||||||
|
|
||||||
base::string16 Notification::GetSound() const {
|
base::string16 Notification::GetCloseButtonText() const {
|
||||||
return sound_;
|
return close_button_text_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setters
|
// Setters
|
||||||
|
@ -137,12 +142,16 @@ void Notification::SetSilent(bool new_silent) {
|
||||||
silent_ = new_silent;
|
silent_ = new_silent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Notification::SetHasReply(bool new_has_reply) {
|
||||||
|
has_reply_ = new_has_reply;
|
||||||
|
}
|
||||||
|
|
||||||
void Notification::SetReplyPlaceholder(const base::string16& new_placeholder) {
|
void Notification::SetReplyPlaceholder(const base::string16& new_placeholder) {
|
||||||
reply_placeholder_ = new_placeholder;
|
reply_placeholder_ = new_placeholder;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notification::SetHasReply(bool new_has_reply) {
|
void Notification::SetSound(const base::string16& new_sound) {
|
||||||
has_reply_ = new_has_reply;
|
sound_ = new_sound;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notification::SetActions(
|
void Notification::SetActions(
|
||||||
|
@ -150,8 +159,8 @@ void Notification::SetActions(
|
||||||
actions_ = actions;
|
actions_ = actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notification::SetSound(const base::string16& new_sound) {
|
void Notification::SetCloseButtonText(const base::string16& text) {
|
||||||
sound_ = new_sound;
|
close_button_text_ = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notification::NotificationAction(int index) {
|
void Notification::NotificationAction(int index) {
|
||||||
|
@ -201,6 +210,7 @@ void Notification::Show() {
|
||||||
options.reply_placeholder = reply_placeholder_;
|
options.reply_placeholder = reply_placeholder_;
|
||||||
options.actions = actions_;
|
options.actions = actions_;
|
||||||
options.sound = sound_;
|
options.sound = sound_;
|
||||||
|
options.close_button_text = close_button_text_;
|
||||||
notification_->Show(options);
|
notification_->Show(options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -222,15 +232,18 @@ void Notification::BuildPrototype(v8::Isolate* isolate,
|
||||||
.SetProperty("subtitle", &Notification::GetSubtitle,
|
.SetProperty("subtitle", &Notification::GetSubtitle,
|
||||||
&Notification::SetSubtitle)
|
&Notification::SetSubtitle)
|
||||||
.SetProperty("body", &Notification::GetBody, &Notification::SetBody)
|
.SetProperty("body", &Notification::GetBody, &Notification::SetBody)
|
||||||
.SetProperty("silent", &Notification::GetSilent, &Notification::SetSilent)
|
.SetProperty("silent", &Notification::GetSilent,
|
||||||
.SetProperty("replyPlaceholder", &Notification::GetReplyPlaceholder,
|
&Notification::SetSilent)
|
||||||
&Notification::SetReplyPlaceholder)
|
|
||||||
.SetProperty("hasReply", &Notification::GetHasReply,
|
.SetProperty("hasReply", &Notification::GetHasReply,
|
||||||
&Notification::SetHasReply)
|
&Notification::SetHasReply)
|
||||||
|
.SetProperty("replyPlaceholder", &Notification::GetReplyPlaceholder,
|
||||||
|
&Notification::SetReplyPlaceholder)
|
||||||
|
.SetProperty("sound", &Notification::GetSound,
|
||||||
|
&Notification::SetSound)
|
||||||
.SetProperty("actions", &Notification::GetActions,
|
.SetProperty("actions", &Notification::GetActions,
|
||||||
&Notification::SetActions)
|
&Notification::SetActions)
|
||||||
.SetProperty("sound", &Notification::GetSound,
|
.SetProperty("closeButtonText", &Notification::GetCloseButtonText,
|
||||||
&Notification::SetSound);
|
&Notification::SetCloseButtonText);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace api
|
} // namespace api
|
||||||
|
|
|
@ -52,20 +52,22 @@ class Notification : public mate::TrackableObject<Notification>,
|
||||||
base::string16 GetSubtitle() const;
|
base::string16 GetSubtitle() const;
|
||||||
base::string16 GetBody() const;
|
base::string16 GetBody() const;
|
||||||
bool GetSilent() const;
|
bool GetSilent() const;
|
||||||
base::string16 GetReplyPlaceholder() const;
|
|
||||||
bool GetHasReply() const;
|
bool GetHasReply() const;
|
||||||
std::vector<brightray::NotificationAction> GetActions() const;
|
base::string16 GetReplyPlaceholder() const;
|
||||||
base::string16 GetSound() const;
|
base::string16 GetSound() const;
|
||||||
|
std::vector<brightray::NotificationAction> GetActions() const;
|
||||||
|
base::string16 GetCloseButtonText() const;
|
||||||
|
|
||||||
// Prop Setters
|
// Prop Setters
|
||||||
void SetTitle(const base::string16& new_title);
|
void SetTitle(const base::string16& new_title);
|
||||||
void SetSubtitle(const base::string16& new_subtitle);
|
void SetSubtitle(const base::string16& new_subtitle);
|
||||||
void SetBody(const base::string16& new_body);
|
void SetBody(const base::string16& new_body);
|
||||||
void SetSilent(bool new_silent);
|
void SetSilent(bool new_silent);
|
||||||
void SetReplyPlaceholder(const base::string16& new_reply_placeholder);
|
|
||||||
void SetHasReply(bool new_has_reply);
|
void SetHasReply(bool new_has_reply);
|
||||||
void SetActions(const std::vector<brightray::NotificationAction>& actions);
|
void SetReplyPlaceholder(const base::string16& new_reply_placeholder);
|
||||||
void SetSound(const base::string16& sound);
|
void SetSound(const base::string16& sound);
|
||||||
|
void SetActions(const std::vector<brightray::NotificationAction>& actions);
|
||||||
|
void SetCloseButtonText(const base::string16& text);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
base::string16 title_;
|
base::string16 title_;
|
||||||
|
@ -75,10 +77,11 @@ class Notification : public mate::TrackableObject<Notification>,
|
||||||
base::string16 icon_path_;
|
base::string16 icon_path_;
|
||||||
bool has_icon_ = false;
|
bool has_icon_ = false;
|
||||||
bool silent_ = false;
|
bool silent_ = false;
|
||||||
base::string16 reply_placeholder_;
|
|
||||||
bool has_reply_ = false;
|
bool has_reply_ = false;
|
||||||
std::vector<brightray::NotificationAction> actions_;
|
base::string16 reply_placeholder_;
|
||||||
base::string16 sound_;
|
base::string16 sound_;
|
||||||
|
std::vector<brightray::NotificationAction> actions_;
|
||||||
|
base::string16 close_button_text_;
|
||||||
|
|
||||||
brightray::NotificationPresenter* presenter_;
|
brightray::NotificationPresenter* presenter_;
|
||||||
|
|
||||||
|
|
|
@ -88,6 +88,10 @@ void CocoaNotification::Show(const NotificationOptions& options) {
|
||||||
[notification_ setHasReplyButton:true];
|
[notification_ setHasReplyButton:true];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!options.close_button_text.empty()) {
|
||||||
|
[notification_ setOtherButtonTitle:base::SysUTF16ToNSString(options.close_button_text)];
|
||||||
|
}
|
||||||
|
|
||||||
[NSUserNotificationCenter.defaultUserNotificationCenter
|
[NSUserNotificationCenter.defaultUserNotificationCenter
|
||||||
deliverNotification:notification_];
|
deliverNotification:notification_];
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,13 +28,14 @@ struct NotificationOptions {
|
||||||
base::string16 subtitle;
|
base::string16 subtitle;
|
||||||
base::string16 msg;
|
base::string16 msg;
|
||||||
std::string tag;
|
std::string tag;
|
||||||
|
bool silent;
|
||||||
GURL icon_url;
|
GURL icon_url;
|
||||||
SkBitmap icon;
|
SkBitmap icon;
|
||||||
bool silent;
|
|
||||||
bool has_reply;
|
bool has_reply;
|
||||||
base::string16 reply_placeholder;
|
base::string16 reply_placeholder;
|
||||||
base::string16 sound;
|
base::string16 sound;
|
||||||
std::vector<NotificationAction> actions;
|
std::vector<NotificationAction> actions;
|
||||||
|
base::string16 close_button_text;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Notification {
|
class Notification {
|
||||||
|
|
|
@ -39,7 +39,7 @@ Returns `Boolean` - Whether or not desktop notifications are supported on the cu
|
||||||
* `replyPlaceholder` String (optional) _macOS_ - The placeholder to write in the inline reply input field.
|
* `replyPlaceholder` String (optional) _macOS_ - The placeholder to write in the inline reply input field.
|
||||||
* `sound` String (optional) _macOS_ - The name of the sound file to play when the notification is shown.
|
* `sound` String (optional) _macOS_ - The name of the sound file to play when the notification is shown.
|
||||||
* `actions` [NotificationAction[]](structures/notification-action.md) (optional) _macOS_ - Actions to add to the notification. Please read the available actions and limitations in the `NotificationAction` documentation.
|
* `actions` [NotificationAction[]](structures/notification-action.md) (optional) _macOS_ - Actions to add to the notification. Please read the available actions and limitations in the `NotificationAction` documentation.
|
||||||
|
* `closeButtonText` String (optional) _macOS_ - A custom title for the close button of an alert. An empty string will cause the default localized text to be used.
|
||||||
|
|
||||||
### Instance Events
|
### Instance Events
|
||||||
|
|
||||||
|
|
91
spec/api-notification-spec.js
Normal file
91
spec/api-notification-spec.js
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
const assert = require('assert')
|
||||||
|
|
||||||
|
const {Notification} = require('electron').remote
|
||||||
|
|
||||||
|
describe('Notification module', () => {
|
||||||
|
it('inits, gets and sets basic string properties correctly', () => {
|
||||||
|
const n = new Notification({
|
||||||
|
title: 'title',
|
||||||
|
subtitle: 'subtitle',
|
||||||
|
body: 'body',
|
||||||
|
replyPlaceholder: 'replyPlaceholder',
|
||||||
|
sound: 'sound',
|
||||||
|
closeButtonText: 'closeButtonText'
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.equal(n.title, 'title')
|
||||||
|
n.title = 'title1'
|
||||||
|
assert.equal(n.title, 'title1')
|
||||||
|
|
||||||
|
assert.equal(n.subtitle, 'subtitle')
|
||||||
|
n.subtitle = 'subtitle1'
|
||||||
|
assert.equal(n.subtitle, 'subtitle1')
|
||||||
|
|
||||||
|
assert.equal(n.body, 'body')
|
||||||
|
n.body = 'body1'
|
||||||
|
assert.equal(n.body, 'body1')
|
||||||
|
|
||||||
|
assert.equal(n.replyPlaceholder, 'replyPlaceholder')
|
||||||
|
n.replyPlaceholder = 'replyPlaceholder1'
|
||||||
|
assert.equal(n.replyPlaceholder, 'replyPlaceholder1')
|
||||||
|
|
||||||
|
assert.equal(n.sound, 'sound')
|
||||||
|
n.sound = 'sound1'
|
||||||
|
assert.equal(n.sound, 'sound1')
|
||||||
|
|
||||||
|
assert.equal(n.closeButtonText, 'closeButtonText')
|
||||||
|
n.closeButtonText = 'closeButtonText1'
|
||||||
|
assert.equal(n.closeButtonText, 'closeButtonText1')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('inits, gets and sets basic boolean properties correctly', () => {
|
||||||
|
const n = new Notification({
|
||||||
|
silent: true,
|
||||||
|
hasReply: true
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.equal(n.silent, true)
|
||||||
|
n.silent = false
|
||||||
|
assert.equal(n.silent, false)
|
||||||
|
|
||||||
|
assert.equal(n.hasReply, true)
|
||||||
|
n.hasReply = false
|
||||||
|
assert.equal(n.hasReply, false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('inits, gets and sets actions correctly', () => {
|
||||||
|
const n = new Notification({
|
||||||
|
actions: [
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
text: '1'
|
||||||
|
}, {
|
||||||
|
type: 'button',
|
||||||
|
text: '2'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.equal(n.actions[0].type, 'button')
|
||||||
|
assert.equal(n.actions[0].text, '1')
|
||||||
|
assert.equal(n.actions[1].type, 'button')
|
||||||
|
assert.equal(n.actions[1].text, '2')
|
||||||
|
|
||||||
|
n.actions = [
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
text: '3'
|
||||||
|
}, {
|
||||||
|
type: 'button',
|
||||||
|
text: '4'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
assert.equal(n.actions[0].type, 'button')
|
||||||
|
assert.equal(n.actions[0].text, '3')
|
||||||
|
assert.equal(n.actions[1].type, 'button')
|
||||||
|
assert.equal(n.actions[1].text, '4')
|
||||||
|
})
|
||||||
|
|
||||||
|
// TODO(sethlu): Find way to test init with notification icon?
|
||||||
|
})
|
Loading…
Add table
Add a link
Reference in a new issue