[IMPROVE] A11y: Buttons, Images, Popups (#15405)

pull/15412/head^2
Tasso Evangelista 6 years ago committed by Guilherme Gazzo
parent cda8ddbadf
commit e446db03a3
  1. 2
      app/apps/client/admin/appManage.html
  2. 2
      app/lazy-load/client/lazyloadImage.html
  3. 2
      app/lib/server/startup/settings.js
  4. 2
      app/search/client/search/search.html
  5. 2
      app/threads/client/flextab/thread.html
  6. 6
      app/ui-account/client/avatar/avatar.html
  7. 21
      app/ui-account/client/avatar/avatar.js
  8. 2
      app/ui-flextab/client/flexTabBar.html
  9. 4
      app/ui-flextab/client/tabs/membersList.html
  10. 2
      app/ui-flextab/client/tabs/userInfo.html
  11. 18
      app/ui-message/client/message.html
  12. 6
      app/ui-message/client/messageBox/messageBox.html
  13. 4
      app/ui-message/client/messageThread.html
  14. 4
      app/ui-sidenav/client/sidebarHeader.html
  15. 4
      app/ui-sidenav/client/sidebarHeader.js
  16. 2
      app/ui-sidenav/client/sidebarItem.html
  17. 2
      app/ui-utils/client/lib/alerts.html
  18. 2
      app/ui-utils/client/lib/popout.html
  19. 2
      app/ui/client/components/contextualBar.html
  20. 6
      app/ui/client/components/header/headerRoom.html
  21. 65
      app/ui/client/components/header/headerRoom.js
  22. 61
      package-lock.json
  23. 4
      tests/pageobjects/main-content.page.js

@ -12,7 +12,7 @@
{{/if}}
<div class="rc-header__block rc-header__block-action">
<button class="rc-button rc-button--nude js-close">
<button class="rc-button rc-button--nude js-close" aria-label="{{_ "Close"}}">
{{> icon icon="cross"}}
</button>
</div>

@ -1,4 +1,4 @@
<template name="lazyloadImage">
<img data-src="{{srcUrl}}" src="{{lazySrcUrl}}" height="{{height}}" class="{{class}}"
<img data-src="{{srcUrl}}" src="{{lazySrcUrl}}" alt="{{alt}}" height="{{height}}" class="{{class}}"
data-title="{{title}}" data-description="{{description}}">
</template>

@ -1274,7 +1274,7 @@ settings.addGroup('Layout', function() {
multiline: true,
public: true,
});
return this.add('Layout_Sidenav_Footer', '<a href="/home"><img src="assets/logo.png"/></a>', {
return this.add('Layout_Sidenav_Footer', '<a href="/home"><img src="assets/logo.png" alt="Home" /></a>', {
type: 'code',
code: 'text/html',
public: true,

@ -20,7 +20,7 @@
<div class="rc-input__icon">
{{> icon block="rc-input__icon-svg" icon=provider.icon}}
</div>
<input value="{{text}}" type="text" class="rc-input__element" name="message-search" id="message-search" placeholder="{{_ 'Search_Messages'}}" autocomplete="off" />
<input value="{{text}}" type="text" class="rc-input__element" name="message-search" id="message-search" placeholder="{{_ 'Search_Messages'}}" autocomplete="off" aria-label="{{_ 'Search_Messages'}}" />
</div>
</label>
</div>

@ -7,7 +7,7 @@
{{!-- <sub class="contextual-bar__header-description">{{room.fname}}</sub> --}}
</h2>
</div>
<button class="contextual-bar__header-close js-close">
<button class="contextual-bar__header-close js-close" aria-label="{{_ "Close"}}">
{{> icon block="contextual-bar__header-close-icon" icon="plus"}}
</button>
</header>

@ -1,9 +1,9 @@
<template name="avatar">
<div class="avatar">
{{# if lazy}}
{{> lazyloadImage src=src class="avatar-image" placeholder=true}}
{{#if lazy}}
{{> lazyloadImage src=src alt=alt class="avatar-image" placeholder=true}}
{{else}}
<img src="{{src}}" class="avatar-image"/>
<img src="{{src}}" alt="{{alt}}" class="avatar-image"/>
{{/if}}
</div>
</template>

@ -4,6 +4,17 @@ import { Template } from 'meteor/templating';
import { getUserAvatarURL } from '../../../utils/lib/getUserAvatarURL';
const getUsername = ({ userId, username }) => {
if (username) {
return username;
}
if (userId) {
const user = Meteor.users.findOne(this.userId, { fields: { username: 1 } });
return user && user.username;
}
};
Template.avatar.helpers({
src() {
const { url } = Template.instance().data;
@ -11,11 +22,7 @@ Template.avatar.helpers({
return url;
}
let { username } = this;
if (username == null && this.userId != null) {
const user = Meteor.users.findOne(this.userId);
username = user && user.username;
}
let username = getUsername(this);
if (!username) {
return;
}
@ -28,4 +35,8 @@ Template.avatar.helpers({
return getUserAvatarURL(username);
},
alt() {
return getUsername(this);
},
});

@ -10,7 +10,7 @@
<h1 class="contextual-bar__header-title">{{_ label}}</h1>
</div>
{{/with}}
<button class="contextual-bar__header-close js-close close-flex-tab">
<button class="contextual-bar__header-close js-close close-flex-tab" aria-label="{{_ "Close"}}">
{{> icon block="contextual-bar__header-close-icon" icon="plus"}}
</button>
</header>

@ -9,11 +9,11 @@
<div class="rc-input__icon">
{{> icon block="rc-input__icon-svg" icon="magnifier"}}
</div>
<input type="text" class="rc-input__element js-filter" name="user-search" id="user-search" placeholder={{_ "Search_by_username"}} autocomplete="off" />
<input type="text" class="rc-input__element js-filter" name="user-search" id="user-search" placeholder={{_ "Search_by_username"}} autocomplete="off" aria-label="{{_ "Search_by_username"}}" />
</div>
<label class="rc-select">
<select class="rc-select__element js-type" name="status-type">
<select class="rc-select__element js-type" name="status-type" aria-label="{{_ "Status"}}">
<option value="online">{{_ 'online'}}</option>
<option value="all">{{_ 'All_users'}}</option>
</select>

@ -10,7 +10,7 @@
{{> icon icon="user" block="contextual-bar__header-icon"}}
<h1 class="contextual-bar__header-title">{{_ "User_Info"}}</h1>
</div>
<button class="contextual-bar__header-close js-close">
<button class="contextual-bar__header-close js-close" aria-label="{{_ "Close"}}">
{{> icon block="contextual-bar__header-close-icon" icon="plus"}}
</button>
</header>

@ -5,9 +5,11 @@
{{else}}
{{#if msg.avatar}}
{{#if avatarFromUsername}}
<button class="thumb user-card-message" data-username="{{msg.u.username}}" tabindex="1">{{> avatar username=avatarFromUsername}}</button>
<button aria-label="{{msg.u.username}}" class="thumb user-card-message" data-username="{{msg.u.username}}">
{{> avatar username=avatarFromUsername}}
</button>
{{else}}
<button class="thumb user-card-message" data-username="{{msg.u.username}}" tabindex="1">
<button aria-label="{{msg.u.username}}" class="thumb user-card-message" data-username="{{msg.u.username}}">
<div class="avatar">
<div class="avatar-image" style="background-image:url({{encodeURI msg.avatar}})"></div>
</div>
@ -15,18 +17,22 @@
{{/if}}
{{else}}
{{#if msg.emoji}}
<button class="thumb user-card-message" data-username="{{msg.u.username}}" tabindex="1">
<button aria-label="{{msg.u.username}}" class="thumb user-card-message" data-username="{{msg.u.username}}">
<div class="avatar">
{{> renderEmoji msg.emoji}}
</div>
</button>
{{else}}
<button class="thumb user-card-message" data-username="{{msg.u.username}}" tabindex="1">{{> avatar username=msg.u.username}}</button>
<button aria-label="{{msg.u.username}}" class="thumb user-card-message" data-username="{{msg.u.username}}">
{{> avatar username=msg.u.username}}
</button>
{{/if}}
{{/if}}
<div class="message-body-wrapper">
<div class="title border-component-color color-info-font-color">
<button type="button" class="user user-card-message color-primary-font-color" data-username="{{msg.u.username}}" tabindex="1">{{getName}}{{#if showUsername}} <span class="message-alias border-component-color color-info-font-color">@{{msg.u.username}}</span>{{/if}}</button>
<button type="button" class="user user-card-message color-primary-font-color" data-username="{{msg.u.username}}" tabindex="1">
{{getName}}{{#if showUsername}} <span class="message-alias border-component-color color-info-font-color">@{{msg.u.username}}</span>{{/if}}
</button>
<span class="info border-component-color color-info-font-color"></span>
{{#each role in roleTags}}
<span class="role-tag color-secondary-color border-component-color" data-role="{{role.description}}">{{role.description}}</span>
@ -127,7 +133,7 @@
</button>
{{/each}}
</div>
<div class="message-actions__menu">
<div class="message-actions__menu" aria-haspopup="true">
{{> icon block="message-actions__menu-icon" icon="menu"}}
</div>
</div>

@ -20,10 +20,10 @@
{{/if}}
<label class="rc-message-box__container">
<span class="rc-message-box__icon emoji-picker-icon {{#unless isEmojiEnabled}}emoji-picker-icon--disabled{{/unless}} js-emoji-picker">
<span class="rc-message-box__icon emoji-picker-icon {{#unless isEmojiEnabled}}emoji-picker-icon--disabled{{/unless}} js-emoji-picker" aria-haspopup="true">
{{> icon block="rc-input__icon-svg" icon="emoji"}}
</span>
<textarea name="msg" maxlength="{{maxMessageLength}}" placeholder="{{_ 'Message'}}" rows="1" class="rc-message-box__textarea js-input-message"></textarea>
<textarea aria-label="{{_ 'Message'}}" name="msg" maxlength="{{maxMessageLength}}" placeholder="{{_ 'Message'}}" rows="1" class="rc-message-box__textarea js-input-message"></textarea>
<div class="js-input-message-shadow"></div>
{{#if isSendIconVisible}}
<span class="rc-message-box__icon rc-message-box__send js-send" data-desktop>
@ -32,7 +32,7 @@
{{else}}
{{#if canSend}}
{{> messageBoxAudioMessage rid=rid tmid=tmid}}
<span class="rc-message-box__action-menu js-action-menu" data-desktop>
<span class="rc-message-box__action-menu js-action-menu" data-desktop aria-haspopup="true">
{{#if actions}}
<span class="rc-message-box__icon">
{{> icon block="rc-input__icon-svg" icon="plus"}}

@ -14,7 +14,9 @@
</q>
<div class="thread-replied js-open-thread">
<button class="thumb user-card-message" data-username="{{msg.u.username}}" tabindex="1">{{> avatar username=avatar}}</button>
<button aria-label="{{msg.u.username}}" class="thumb user-card-message" data-username="{{msg.u.username}}">
{{> avatar username=avatar}}
</button>
<span role="button" class="js-toggle-thread-reply thread-reply-preview color-primary-font-color">
{{# if threadMessage}}
<span class="message-body--unstyled">{{{threadMessage}}}</span>

@ -1,13 +1,13 @@
<template name="sidebarHeader">
<header class="sidebar__header">
{{#with myUserInfo}}
<div class="sidebar__header-thumb">
<div aria-haspopup="true" class="sidebar__header-thumb">
{{> avatar username=username}}
<div class="sidebar__header-status-bullet sidebar__header-status-bullet--{{status}}"></div>
</div>
<div class="sidebar__toolbar">
{{#each toolbarButtons}}
<button class="sidebar__toolbar-button rc-tooltip rc-tooltip--down js-button" aria-label="{{name}}">
<button class="sidebar__toolbar-button rc-tooltip rc-tooltip--down js-button" aria-label="{{name}}" aria-haspopup="{{hasPopup}}">
{{> icon block="sidebar__toolbar-button-icon" icon=icon }}
</button>
{{/each}}

@ -74,6 +74,7 @@ const toolbarButtons = (user) => [{
{
name: t('View_mode'),
icon: () => viewModeIcon[getUserPreference(user, 'sidebarViewMode') || 'condensed'],
hasPopup: true,
action: (e) => {
const hideAvatarSetting = getUserPreference(user, 'sidebarHideAvatar');
const config = {
@ -137,6 +138,7 @@ const toolbarButtons = (user) => [{
{
name: t('Sort'),
icon: 'sort',
hasPopup: true,
action: (e) => {
const options = [];
const config = {
@ -154,6 +156,7 @@ const toolbarButtons = (user) => [{
name: t('Create_new'),
icon: 'edit-rounded',
condition: () => hasAtLeastOnePermission(['create-c', 'create-p']),
hasPopup: true,
action: (e) => {
const createChannel = (e) => {
e.preventDefault();
@ -222,6 +225,7 @@ const toolbarButtons = (user) => [{
name: t('Options'),
icon: 'menu',
condition: () => AccountBox.getItems().length || hasAtLeastOnePermission(['manage-emoji', 'manage-integrations', 'manage-oauth-apps', 'manage-own-integrations', 'manage-selected-settings', 'manage-sounds', 'view-logs', 'view-privileged-setting', 'view-room-administration', 'view-statistics', 'view-user-administration', 'access-setting-permissions']),
hasPopup: true,
action: (e) => {
let adminOption;
if (hasAtLeastOnePermission(['manage-emoji', 'manage-integrations', 'manage-oauth-apps', 'manage-own-integrations', 'manage-selected-settings', 'manage-sounds', 'view-logs', 'view-privileged-setting', 'view-room-administration', 'view-statistics', 'view-user-administration', 'access-setting-permissions'])) {

@ -66,7 +66,7 @@
{{/let}}
{{#if isRoom}}
<div class="sidebar-item__menu">
<div class="sidebar-item__menu" aria-haspopup="true">
{{> icon block="sidebar-item__menu-icon rc-icon--default-size" icon="menu"}}
</div>
{{/if}}

@ -21,7 +21,7 @@
{{/if}}
</div>
{{#if closable}}
<div class="rc-alerts__icon js-close">
<div class="rc-alerts__icon js-close" aria-label="{{_ "Close"}}">
{{> icon block="rc-alerts__icon rc-alerts__icon--close" icon='plus'}}
</div>
{{/if}}

@ -28,7 +28,7 @@
{{> icon classes="rc-popout__minimize" icon="arrow-down"}}
</button>
{{/unless}}
<button class="contextual-bar__close js-close">
<button class="contextual-bar__close js-close" aria-label="{{_ "Close"}}">
{{> icon classes="rc-popout__close" icon="plus"}}
</button>
</header>

@ -11,7 +11,7 @@
</h1>
</div>
{{/with}}
<button class="contextual-bar__header-close js-close">
<button class="contextual-bar__header-close js-close" aria-label="{{_ "Close"}}">
{{> icon block="contextual-bar__header-close-icon" icon="plus"}}
</button>
</header>

@ -12,9 +12,11 @@
</div>
{{/if}}
{{#if showToggleFavorite}}
{{#if isToggleFavoriteButtonVisible}}
<div class="rc-header__block rc-header__favorite rc-header__block--action">
<a href="#favorite" class="rc-header__toggle-favorite rc-header__first-icon {{state}}">{{> icon block="rc-header__icon" icon="star"}}</a>
<button aria-label="{{toggleFavoriteButtonIconLabel}}" type="button" class="rc-header__toggle-favorite rc-header__first-icon js-favorite">
{{> icon block="rc-header__icon" icon=toggleFavoriteButtonIcon}}
</button>
</div>
{{/if}}

@ -1,5 +1,6 @@
import toastr from 'toastr';
import { Meteor } from 'meteor/meteor';
import { ReactiveDict } from 'meteor/reactive-dict';
import { ReactiveVar } from 'meteor/reactive-var';
import { Session } from 'meteor/session';
import { Template } from 'meteor/templating';
@ -13,15 +14,6 @@ import { emoji } from '../../../../emoji';
import { Markdown } from '../../../../markdown/client';
import { hasAllPermission } from '../../../../authorization';
const isSubscribed = (_id) => ChatSubscription.find({ rid: _id }).count() > 0;
const favoritesEnabled = () => settings.get('Favorite_Rooms');
const isDiscussion = ({ _id }) => {
const room = ChatRoom.findOne({ _id });
return !!(room && room.prid);
};
const getUserStatus = (id) => {
const roomData = Session.get(`roomData${ id }`);
return roomTypes.getUserStatus(roomData.t, id);
@ -33,6 +25,11 @@ const getUserStatusText = (id) => {
};
Template.headerRoom.helpers({
isDiscussion: () => Template.instance().state.get('discussion'),
isToggleFavoriteButtonVisible: () => Template.instance().state.get('favorite') !== null,
toggleFavoriteButtonIconLabel: () => (Template.instance().state.get('favorite') ? t('Unfavorite') : t('Favorite')),
toggleFavoriteButtonIcon: () => (Template.instance().state.get('favorite') ? 'star-filled' : 'star'),
back() {
return Template.instance().data.back;
},
@ -45,27 +42,11 @@ Template.headerRoom.helpers({
return TabBar.getButtons();
},
isDiscussion() {
return isDiscussion(Template.instance().data);
},
isTranslated() {
const sub = ChatSubscription.findOne({ rid: this._id }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1 } });
return settings.get('AutoTranslate_Enabled') && ((sub != null ? sub.autoTranslate : undefined) === true) && (sub.autoTranslateLanguage != null);
},
state() {
const sub = ChatSubscription.findOne({ rid: this._id }, { fields: { f: 1 } });
if (((sub != null ? sub.f : undefined) != null) && sub.f && favoritesEnabled()) { return ' favorite-room'; }
return 'empty';
},
favoriteLabel() {
const sub = ChatSubscription.findOne({ rid: this._id }, { fields: { f: 1 } });
if (((sub != null ? sub.f : undefined) != null) && sub.f && favoritesEnabled()) { return 'Unfavorite'; }
return 'Favorite';
},
isDirect() {
return Rooms.findOne(this._id).t === 'd';
},
@ -137,10 +118,6 @@ Template.headerRoom.helpers({
return t('offline');
},
showToggleFavorite() {
return !isDiscussion(Template.instance().data) && isSubscribed(this._id) && favoritesEnabled();
},
fixedHeight() {
return Template.instance().data.fixedHeight;
},
@ -165,13 +142,14 @@ Template.headerRoom.events({
return false;
},
'click .rc-header__toggle-favorite'(event) {
'click .js-favorite'(event, instance) {
event.stopPropagation();
event.preventDefault();
return Meteor.call(
'toggleFavorite',
this._id,
!$(event.currentTarget).hasClass('favorite-room'),
!instance.state.get('favorite'),
(err) => err && handleError(err)
);
},
@ -224,6 +202,31 @@ const loadUserStatusText = () => {
};
Template.headerRoom.onCreated(function() {
this.state = new ReactiveDict();
const isFavoritesEnabled = () => settings.get('Favorite_Rooms');
const isDiscussion = (rid) => {
const room = ChatRoom.findOne({ _id: rid });
return !!(room && room.prid);
};
this.autorun(() => {
const { _id: rid } = Template.currentData();
this.state.set({
rid,
discussion: isDiscussion(rid),
});
if (!this.state.get('discussion') && isFavoritesEnabled()) {
const subscription = ChatSubscription.findOne({ rid }, { fields: { f: 1 } });
this.state.set('favorite', !!(subscription && subscription.f));
} else {
this.state.set('favorite', null);
}
});
this.currentChannel = (this.data && this.data._id && Rooms.findOne(this.data._id)) || undefined;
this.hasTokenpass = new ReactiveVar(false);

61
package-lock.json generated

@ -752,7 +752,7 @@
"msgpack-lite": "^0.1.26",
"node-fetch": "^2.2.1",
"node-fetch-polyfill": "^2.0.6",
"paho-mqtt": "github:eclipse/paho.mqtt.javascript#master",
"paho-mqtt": "github:eclipse/paho.mqtt.javascript#f5859463aba9a9b7c19f99ab7c4849a723f8d832",
"protobufjs": "^6.8.8",
"sha256": "^0.2.0",
"tiny-events": "^1.0.1",
@ -4479,7 +4479,7 @@
"chromedriver": "^2.35",
"colors": "1.1.2",
"commander": "^2.9.0",
"cucumber": "github:xolvio/cucumber-js#v1.3.0-chimp.6",
"cucumber": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c",
"deep-extend": "^0.4.1",
"exit": "^0.1.2",
"fibers": "^1.0.14",
@ -4904,7 +4904,7 @@
},
"colors": {
"version": "1.1.2",
"resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
"integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
"dev": true
},
@ -7781,8 +7781,7 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"aproba": {
"version": "1.2.0",
@ -7803,14 +7802,12 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -7825,20 +7822,17 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"core-util-is": {
"version": "1.0.2",
@ -7955,8 +7949,7 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"ini": {
"version": "1.3.5",
@ -7968,7 +7961,6 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@ -7983,7 +7975,6 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -7991,14 +7982,12 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@ -8017,7 +8006,6 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -8105,8 +8093,7 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"object-assign": {
"version": "4.1.1",
@ -8118,7 +8105,6 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@ -8204,8 +8190,7 @@
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
@ -8241,7 +8226,6 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@ -8261,7 +8245,6 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@ -8305,14 +8288,12 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
"dev": true,
"optional": true
"dev": true
}
}
},
@ -8393,7 +8374,7 @@
},
"get-stream": {
"version": "3.0.0",
"resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
},
"get-value": {
@ -12528,7 +12509,7 @@
},
"readable-stream": {
"version": "2.3.6",
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
"core-util-is": "~1.0.0",
@ -12550,7 +12531,7 @@
},
"string_decoder": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
@ -12699,7 +12680,7 @@
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
"brace-expansion": "^1.1.7"
}
@ -13500,7 +13481,7 @@
"dev": true,
"requires": {
"is-stream": "^1.1.0",
"web-streams-polyfill": "git://github.com/gwicke/web-streams-polyfill.git#spec_performance_improvements"
"web-streams-polyfill": "git://github.com/gwicke/web-streams-polyfill.git#42c488428adea1dc0c0245014e4896ad456b1ded"
}
},
"nodejieba": {
@ -13616,7 +13597,7 @@
"npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"requires": {
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
@ -14309,7 +14290,7 @@
},
"tough-cookie": {
"version": "2.3.4",
"resolved": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
"dev": true,
"requires": {

@ -4,9 +4,9 @@ class MainContent extends Page {
get mainContent() { return browser.element('.main-content'); }
// Main Content Header (Channel Title Area)
get emptyFavoriteStar() { return browser.element('.rc-header__toggle-favorite.empty'); }
get emptyFavoriteStar() { return browser.element('.js-favorite .rc-header__icon--star'); }
get favoriteStar() { return browser.element('.rc-header__toggle-favorite.favorite-room'); }
get favoriteStar() { return browser.element('.js-favorite .rc-header__icon--star-filled'); }
get channelTitle() { return browser.element('.rc-header__name'); }

Loading…
Cancel
Save