Skip to content

Commit

Permalink
feat: add "accessibleTitle" property to a BrowserWindow instance (#19698
Browse files Browse the repository at this point in the history
)

Sometimes it's necessary to convey more information about the window to screen reader users only (simply putting everything to the window title might be unnecessarily noisy).

For example, Chromium uses that technique to tell screen reader users that the window is in incognito mode (the incognito window looks differently and doesn't have «incognito» in the title, but for blind users the screen reader will announce that it's incognito).
  • Loading branch information
mshoho authored and alexeykuzmin committed Aug 27, 2019
1 parent 1dcda7b commit ae9424d
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 0 deletions.
9 changes: 9 additions & 0 deletions docs/api/browser-window.md
Expand Up @@ -379,6 +379,9 @@ It creates a new `BrowserWindow` with native properties as set by the `options`.
* `disableHtmlFullscreenWindowResize` Boolean (optional) - Whether to
prevent the window from resizing when entering HTML Fullscreen. Default
is `false`.
* `accessibleTitle` String (optional) - An alternative title string provided only
to accessibility tools such as screen readers. This string is not directly
visible to users.

When setting minimum or maximum window size with `minWidth`/`maxWidth`/
`minHeight`/`maxHeight`, it only constrains the users. It won't prevent you from
Expand Down Expand Up @@ -821,6 +824,12 @@ const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
```

#### `win.accessibleTitle`

A `String` property that defines an alternative title provided only to
accessibility tools such as screen readers. This string is not directly
visible to users.

### Instance Methods

Objects created with `new BrowserWindow` have the following instance methods:
Expand Down
10 changes: 10 additions & 0 deletions shell/browser/api/atom_api_top_level_window.cc
Expand Up @@ -575,6 +575,14 @@ std::string TopLevelWindow::GetTitle() {
return window_->GetTitle();
}

void TopLevelWindow::SetAccessibleTitle(const std::string& title) {
window_->SetAccessibleTitle(title);
}

std::string TopLevelWindow::GetAccessibleTitle() {
return window_->GetAccessibleTitle();
}

void TopLevelWindow::FlashFrame(bool flash) {
window_->FlashFrame(flash);
}
Expand Down Expand Up @@ -1124,6 +1132,8 @@ void TopLevelWindow::BuildPrototype(v8::Isolate* isolate,
.SetMethod("getPosition", &TopLevelWindow::GetPosition)
.SetMethod("setTitle", &TopLevelWindow::SetTitle)
.SetMethod("getTitle", &TopLevelWindow::GetTitle)
.SetProperty("accessibleTitle", &TopLevelWindow::GetAccessibleTitle,
&TopLevelWindow::SetAccessibleTitle)
.SetMethod("flashFrame", &TopLevelWindow::FlashFrame)
.SetMethod("setSkipTaskbar", &TopLevelWindow::SetSkipTaskbar)
.SetMethod("setSimpleFullScreen", &TopLevelWindow::SetSimpleFullScreen)
Expand Down
2 changes: 2 additions & 0 deletions shell/browser/api/atom_api_top_level_window.h
Expand Up @@ -145,6 +145,8 @@ class TopLevelWindow : public mate::TrackableObject<TopLevelWindow>,
std::vector<int> GetPosition();
void SetTitle(const std::string& title);
std::string GetTitle();
void SetAccessibleTitle(const std::string& title);
std::string GetAccessibleTitle();
void FlashFrame(bool flash);
void SetSkipTaskbar(bool skip);
void SetExcludedFromShownWindowsMenu(bool excluded);
Expand Down
16 changes: 16 additions & 0 deletions shell/browser/native_window.cc
Expand Up @@ -582,6 +582,22 @@ const views::Widget* NativeWindow::GetWidget() const {
return widget();
}

base::string16 NativeWindow::GetAccessibleWindowTitle() const {
if (accessible_title_.empty()) {
return views::WidgetDelegate::GetAccessibleWindowTitle();
}

return accessible_title_;
}

void NativeWindow::SetAccessibleTitle(const std::string& title) {
accessible_title_ = base::UTF8ToUTF16(title);
}

std::string NativeWindow::GetAccessibleTitle() {
return base::UTF16ToUTF8(accessible_title_);
}

// static
void NativeWindowRelay::CreateForWebContents(
content::WebContents* web_contents,
Expand Down
9 changes: 9 additions & 0 deletions shell/browser/native_window.h
Expand Up @@ -134,6 +134,11 @@ class NativeWindow : public base::SupportsUserData,
virtual void Invalidate() = 0;
virtual void SetTitle(const std::string& title) = 0;
virtual std::string GetTitle() = 0;

// Ability to augment the window title for the screen readers.
void SetAccessibleTitle(const std::string& title);
std::string GetAccessibleTitle();

virtual void FlashFrame(bool flash) = 0;
virtual void SetSkipTaskbar(bool skip) = 0;
virtual void SetExcludedFromShownWindowsMenu(bool excluded) = 0;
Expand Down Expand Up @@ -301,6 +306,7 @@ class NativeWindow : public base::SupportsUserData,
// views::WidgetDelegate:
views::Widget* GetWidget() override;
const views::Widget* GetWidget() const override;
base::string16 GetAccessibleWindowTitle() const override;

void set_content_view(views::View* view) { content_view_ = view; }

Expand Down Expand Up @@ -355,6 +361,9 @@ class NativeWindow : public base::SupportsUserData,
// Observers of this window.
base::ObserverList<NativeWindowObserver> observers_;

// Accessible title.
base::string16 accessible_title_;

base::WeakPtrFactory<NativeWindow> weak_factory_;

DISALLOW_COPY_AND_ASSIGN(NativeWindow);
Expand Down

0 comments on commit ae9424d

Please sign in to comment.