зеркало из https://github.com/mozilla/gecko-dev.git
merge fx-team to mozilla-central a=merge
This commit is contained in:
Коммит
c231a6730a
|
@ -214,10 +214,6 @@ var gFxAccounts = {
|
|||
this.showDoorhanger("sync-start-panel");
|
||||
},
|
||||
|
||||
showSyncFailedDoorhanger: function () {
|
||||
this.showDoorhanger("sync-error-panel");
|
||||
},
|
||||
|
||||
updateUI: function () {
|
||||
this.updateAppMenuItem();
|
||||
this.updateMigrationNotification();
|
||||
|
|
|
@ -449,28 +449,6 @@
|
|||
</hbox>
|
||||
</panel>
|
||||
|
||||
<!-- Sync Error Panel -->
|
||||
<panel id="sync-error-panel" class="sync-panel" type="arrow" hidden="true"
|
||||
noautofocus="true" onclick="this.hidePopup();"
|
||||
flip="slide">
|
||||
<hbox class="sync-panel-outer">
|
||||
<image class="sync-panel-icon"/>
|
||||
<vbox class="sync-panel-inner">
|
||||
<description id="sync-error-panel-title"
|
||||
value="&syncErrorPanel.heading;"/>
|
||||
<description id="sync-error-panel-subtitle"
|
||||
value="&syncErrorPanel.subTitle;"/>
|
||||
<hbox class="sync-panel-button-box">
|
||||
<spacer flex="1"/>
|
||||
<button class="sync-panel-button"
|
||||
label="&syncErrorPanel.signInButton.label;"
|
||||
accesskey="&syncErrorPanel.signInButton.accesskey;"
|
||||
onclick="gFxAccounts.openSignInAgainPage();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
</hbox>
|
||||
</panel>
|
||||
|
||||
<!-- Bookmarks and history tooltip -->
|
||||
<tooltip id="bhTooltip"/>
|
||||
|
||||
|
|
|
@ -607,89 +607,6 @@ html[dir="rtl"] .room-entry-context-actions > .dropdown-menu {
|
|||
width: 16px;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
|
||||
.button-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
padding-top: 6px;
|
||||
}
|
||||
|
||||
.button-group > .button {
|
||||
flex: 1;
|
||||
margin: 0 5px;
|
||||
min-height: 3rem;
|
||||
font-size: 1.2rem;
|
||||
line-height: 1rem;
|
||||
font-weight: 300;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.button-group > .button:first-child {
|
||||
-moz-margin-start: 0;
|
||||
}
|
||||
|
||||
.button-group > .button:last-child {
|
||||
-moz-margin-end: 0;
|
||||
}
|
||||
|
||||
.button {
|
||||
padding: 2px 5px;
|
||||
background-color: #fbfbfb;
|
||||
color: #333;
|
||||
border-radius: 2px;
|
||||
min-height: 26px;
|
||||
font-size: 1.2rem;
|
||||
line-height: 1.2rem;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
background-color: #ebebeb;
|
||||
}
|
||||
|
||||
.button:active {
|
||||
background-color: #ccc;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.button.button-accept {
|
||||
background-color: #00a9dc;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.button.button-accept:hover,
|
||||
.button.button-accept:hover:active {
|
||||
background-color: #5cccee;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.button.button-cancel {
|
||||
background-color: #ebebeb;
|
||||
border: 0;
|
||||
color: #000;
|
||||
width: 105px; /* based on fixed width of Cancel button from mockup */
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.button.button-cancel:hover,
|
||||
.button.button-cancel:hover:active {
|
||||
background-color: #dcd6d6;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.button.button-cancel:disabled {
|
||||
background-color: #ebebeb;
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
.button.button-accept:active {
|
||||
background-color: #3aa689;
|
||||
border-color: #3aa689;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.button-close {
|
||||
background-color: transparent;
|
||||
background-image: url(../shared/img/icons-10x10.svg#close);
|
||||
|
|
|
@ -719,6 +719,7 @@ loop.conversationViews = (function(mozL10n) {
|
|||
mozLoop: this.props.mozLoop,
|
||||
publishStream: this.publishStream,
|
||||
settingsMenuItems: settingsMenuItems,
|
||||
show: true,
|
||||
video: this.props.video})
|
||||
)
|
||||
)
|
||||
|
|
|
@ -719,6 +719,7 @@ loop.conversationViews = (function(mozL10n) {
|
|||
mozLoop={this.props.mozLoop}
|
||||
publishStream={this.publishStream}
|
||||
settingsMenuItems={settingsMenuItems}
|
||||
show={true}
|
||||
video={this.props.video} />
|
||||
</sharedViews.MediaLayoutView>
|
||||
</div>
|
||||
|
|
|
@ -975,7 +975,7 @@ loop.panel = (function(_, mozL10n) {
|
|||
React.createElement("div", {className: "new-room-view"},
|
||||
React.createElement("div", {className: contextClasses},
|
||||
React.createElement(Checkbox, {checked: this.state.checked,
|
||||
label: mozL10n.get("context_inroom_label"),
|
||||
label: mozL10n.get("context_inroom_label2"),
|
||||
onChange: this.onCheckboxChange}),
|
||||
React.createElement(sharedViews.ContextUrlView, {
|
||||
allowClick: false,
|
||||
|
|
|
@ -975,7 +975,7 @@ loop.panel = (function(_, mozL10n) {
|
|||
<div className="new-room-view">
|
||||
<div className={contextClasses}>
|
||||
<Checkbox checked={this.state.checked}
|
||||
label={mozL10n.get("context_inroom_label")}
|
||||
label={mozL10n.get("context_inroom_label2")}
|
||||
onChange={this.onCheckboxChange} />
|
||||
<sharedViews.ContextUrlView
|
||||
allowClick={false}
|
||||
|
|
|
@ -449,25 +449,6 @@ loop.roomViews = (function(mozL10n) {
|
|||
mozLoop.telemetryAddValue("LOOP_ROOM_CONTEXT_CLICK", 1);
|
||||
},
|
||||
|
||||
handleCheckboxChange: function(state) {
|
||||
if (state.checked) {
|
||||
// The checkbox was checked, prefill the fields with the values available
|
||||
// in `availableContext`.
|
||||
var context = this.state.availableContext;
|
||||
this.setState({
|
||||
newRoomURL: context.url,
|
||||
newRoomDescription: context.description,
|
||||
newRoomThumbnail: context.previewImage
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
newRoomURL: "",
|
||||
newRoomDescription: "",
|
||||
newRoomThumbnail: ""
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
handleFormSubmit: function(event) {
|
||||
event && event.preventDefault();
|
||||
|
||||
|
@ -516,27 +497,13 @@ loop.roomViews = (function(mozL10n) {
|
|||
|
||||
var cx = React.addons.classSet;
|
||||
var availableContext = this.state.availableContext;
|
||||
// The checkbox shows as checked when there's already context data
|
||||
// attached to this room.
|
||||
var checked = !!urlDescription;
|
||||
var checkboxLabel = urlDescription || (availableContext && availableContext.url ?
|
||||
availableContext.description : "");
|
||||
|
||||
return (
|
||||
React.createElement("div", {className: "room-context"},
|
||||
React.createElement("p", {className: cx({"error": !!this.props.error,
|
||||
"error-display-area": true})},
|
||||
mozL10n.get("rooms_change_failed_label")
|
||||
),
|
||||
React.createElement("div", {className: "room-context-label"}, mozL10n.get("context_inroom_label")),
|
||||
React.createElement(sharedViews.Checkbox, {
|
||||
additionalClass: cx({ hide: !checkboxLabel }),
|
||||
checked: checked,
|
||||
disabled: checked,
|
||||
label: checkboxLabel,
|
||||
onChange: this.handleCheckboxChange,
|
||||
useEllipsis: true,
|
||||
value: location}),
|
||||
React.createElement("h2", {className: "room-context-header"}, mozL10n.get("context_inroom_header")),
|
||||
React.createElement("form", {onSubmit: this.handleFormSubmit},
|
||||
React.createElement("input", {className: "room-context-name",
|
||||
maxLength: this.maxRoomNameLength,
|
||||
|
@ -554,16 +521,17 @@ loop.roomViews = (function(mozL10n) {
|
|||
onKeyDown: this.handleTextareaKeyDown,
|
||||
placeholder: mozL10n.get("context_edit_comments_placeholder"),
|
||||
rows: "2", type: "text",
|
||||
valueLink: this.linkState("newRoomDescription")})
|
||||
),
|
||||
React.createElement("button", {className: "btn btn-info",
|
||||
disabled: this.props.savingContext,
|
||||
onClick: this.handleFormSubmit},
|
||||
mozL10n.get("context_save_label2")
|
||||
),
|
||||
React.createElement("button", {className: "room-context-btn-close",
|
||||
onClick: this.handleCloseClick,
|
||||
title: mozL10n.get("cancel_button")})
|
||||
valueLink: this.linkState("newRoomDescription")}),
|
||||
React.createElement(sharedViews.ButtonGroup, null,
|
||||
React.createElement(sharedViews.Button, {additionalClass: "button-cancel",
|
||||
caption: mozL10n.get("context_cancel_label"),
|
||||
onClick: this.handleCloseClick}),
|
||||
React.createElement(sharedViews.Button, {additionalClass: "button-accept",
|
||||
caption: mozL10n.get("context_done_label"),
|
||||
disabled: this.props.savingContext,
|
||||
onClick: this.handleFormSubmit})
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
@ -819,6 +787,7 @@ loop.roomViews = (function(mozL10n) {
|
|||
publishStream: this.publishStream,
|
||||
screenShare: screenShareData,
|
||||
settingsMenuItems: settingsMenuItems,
|
||||
show: !shouldRenderEditContextView,
|
||||
video: {enabled: !this.state.videoMuted, visible: true}}),
|
||||
React.createElement(DesktopRoomInvitationView, {
|
||||
dispatcher: this.props.dispatcher,
|
||||
|
|
|
@ -449,25 +449,6 @@ loop.roomViews = (function(mozL10n) {
|
|||
mozLoop.telemetryAddValue("LOOP_ROOM_CONTEXT_CLICK", 1);
|
||||
},
|
||||
|
||||
handleCheckboxChange: function(state) {
|
||||
if (state.checked) {
|
||||
// The checkbox was checked, prefill the fields with the values available
|
||||
// in `availableContext`.
|
||||
var context = this.state.availableContext;
|
||||
this.setState({
|
||||
newRoomURL: context.url,
|
||||
newRoomDescription: context.description,
|
||||
newRoomThumbnail: context.previewImage
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
newRoomURL: "",
|
||||
newRoomDescription: "",
|
||||
newRoomThumbnail: ""
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
handleFormSubmit: function(event) {
|
||||
event && event.preventDefault();
|
||||
|
||||
|
@ -516,27 +497,13 @@ loop.roomViews = (function(mozL10n) {
|
|||
|
||||
var cx = React.addons.classSet;
|
||||
var availableContext = this.state.availableContext;
|
||||
// The checkbox shows as checked when there's already context data
|
||||
// attached to this room.
|
||||
var checked = !!urlDescription;
|
||||
var checkboxLabel = urlDescription || (availableContext && availableContext.url ?
|
||||
availableContext.description : "");
|
||||
|
||||
return (
|
||||
<div className="room-context">
|
||||
<p className={cx({"error": !!this.props.error,
|
||||
"error-display-area": true})}>
|
||||
{mozL10n.get("rooms_change_failed_label")}
|
||||
</p>
|
||||
<div className="room-context-label">{mozL10n.get("context_inroom_label")}</div>
|
||||
<sharedViews.Checkbox
|
||||
additionalClass={cx({ hide: !checkboxLabel })}
|
||||
checked={checked}
|
||||
disabled={checked}
|
||||
label={checkboxLabel}
|
||||
onChange={this.handleCheckboxChange}
|
||||
useEllipsis={true}
|
||||
value={location} />
|
||||
<h2 className="room-context-header">{mozL10n.get("context_inroom_header")}</h2>
|
||||
<form onSubmit={this.handleFormSubmit}>
|
||||
<input className="room-context-name"
|
||||
maxLength={this.maxRoomNameLength}
|
||||
|
@ -555,15 +522,16 @@ loop.roomViews = (function(mozL10n) {
|
|||
placeholder={mozL10n.get("context_edit_comments_placeholder")}
|
||||
rows="2" type="text"
|
||||
valueLink={this.linkState("newRoomDescription")} />
|
||||
<sharedViews.ButtonGroup>
|
||||
<sharedViews.Button additionalClass="button-cancel"
|
||||
caption={mozL10n.get("context_cancel_label")}
|
||||
onClick={this.handleCloseClick} />
|
||||
<sharedViews.Button additionalClass="button-accept"
|
||||
caption={mozL10n.get("context_done_label")}
|
||||
disabled={this.props.savingContext}
|
||||
onClick={this.handleFormSubmit} />
|
||||
</sharedViews.ButtonGroup>
|
||||
</form>
|
||||
<button className="btn btn-info"
|
||||
disabled={this.props.savingContext}
|
||||
onClick={this.handleFormSubmit}>
|
||||
{mozL10n.get("context_save_label2")}
|
||||
</button>
|
||||
<button className="room-context-btn-close"
|
||||
onClick={this.handleCloseClick}
|
||||
title={mozL10n.get("cancel_button")}/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
@ -819,6 +787,7 @@ loop.roomViews = (function(mozL10n) {
|
|||
publishStream={this.publishStream}
|
||||
screenShare={screenShareData}
|
||||
settingsMenuItems={settingsMenuItems}
|
||||
show={!shouldRenderEditContextView}
|
||||
video={{enabled: !this.state.videoMuted, visible: true}} />
|
||||
<DesktopRoomInvitationView
|
||||
dispatcher={this.props.dispatcher}
|
||||
|
|
|
@ -75,6 +75,87 @@ p {
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
|
||||
.button-group {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
padding-top: 6px;
|
||||
}
|
||||
|
||||
.button-group > .button {
|
||||
flex: 1;
|
||||
margin: 0 5px;
|
||||
min-height: 3rem;
|
||||
font-size: 1.2rem;
|
||||
line-height: 1rem;
|
||||
font-weight: 300;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.button-group > .button:first-child {
|
||||
-moz-margin-start: 0;
|
||||
}
|
||||
|
||||
.button-group > .button:last-child {
|
||||
-moz-margin-end: 0;
|
||||
}
|
||||
|
||||
.button {
|
||||
padding: 2px 5px;
|
||||
background-color: #fbfbfb;
|
||||
color: #333;
|
||||
border-radius: 2px;
|
||||
min-height: 26px;
|
||||
font-size: 1.2rem;
|
||||
line-height: 1.2rem;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
background-color: #ebebeb;
|
||||
}
|
||||
|
||||
.button:active {
|
||||
background-color: #ccc;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.button.button-accept {
|
||||
background-color: #00a9dc;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.button.button-accept:hover,
|
||||
.button.button-accept:hover:active {
|
||||
background-color: #5cccee;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.button.button-cancel {
|
||||
background-color: #ebebeb;
|
||||
border: 0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.button.button-cancel:hover,
|
||||
.button.button-cancel:hover:active {
|
||||
background-color: #dcd6d6;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.button.button-cancel:disabled {
|
||||
background-color: #ebebeb;
|
||||
color: #c3c3c3;
|
||||
}
|
||||
|
||||
.button.button-accept:active {
|
||||
background-color: #3aa689;
|
||||
border-color: #3aa689;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* A reset for all button-appearing elements, with the lowest-common
|
||||
* denominator of the needed rules. Intended to be used as a base class
|
||||
* together with .btn-*
|
||||
|
|
|
@ -915,13 +915,6 @@ html[dir="rtl"] .room-conversation-wrapper header a {
|
|||
align-items: center;
|
||||
}
|
||||
|
||||
.room-invitation-overlay input[type="text"] {
|
||||
display: block;
|
||||
background-color: rgba(0,0,0,.5);
|
||||
border-radius: 3px;
|
||||
padding: .5em;
|
||||
}
|
||||
|
||||
.room-invitation-overlay .btn-group {
|
||||
padding: 0 0 5rem 0;
|
||||
}
|
||||
|
@ -999,10 +992,9 @@ body[platform="win"] .share-service-dropdown.overflow > .dropdown-menu-item {
|
|||
}
|
||||
|
||||
.room-context {
|
||||
background: rgba(0,0,0,.8);
|
||||
background: #fff;
|
||||
border-top: 2px solid #444;
|
||||
border-bottom: 2px solid #444;
|
||||
padding: .5rem;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
|
@ -1049,13 +1041,11 @@ body[platform="win"] .share-service-dropdown.overflow > .dropdown-menu-item {
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
.room-context-label {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.room-context-label,
|
||||
.room-context > .checkbox-wrapper > label {
|
||||
color: #fff;
|
||||
.room-context-header {
|
||||
color: #333;
|
||||
font-size: 1.2rem;
|
||||
font-weight: bold;
|
||||
margin: 1rem auto;
|
||||
}
|
||||
|
||||
.room-context-comment {
|
||||
|
@ -1079,71 +1069,40 @@ body[platform="win"] .share-service-dropdown.overflow > .dropdown-menu-item {
|
|||
}
|
||||
|
||||
.room-context > form {
|
||||
margin-bottom: 1rem;
|
||||
padding: .5rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.room-context > form > textarea,
|
||||
.room-context > form > input[type="text"] {
|
||||
display: block;
|
||||
background: rgba(0,0,0,.5);
|
||||
font-family: "Helvetica Neue", Arial, sans;
|
||||
border: 1px solid rgba(255,255,255,.2);
|
||||
width: 100%;
|
||||
padding: .5em;
|
||||
border-radius: 3px;
|
||||
resize: none;
|
||||
color: #fff;
|
||||
outline: none;
|
||||
border-radius: 4px;
|
||||
margin: 10px 0;
|
||||
border: 1px solid #c3c3c3;
|
||||
height: 2.6rem;
|
||||
padding: 6px;
|
||||
font-size: 1.1rem;
|
||||
color: #4a4a4a;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.room-context > form > textarea {
|
||||
font-size: 1em;
|
||||
font-family: inherit;
|
||||
height: 5.2rem;
|
||||
resize: none;
|
||||
}
|
||||
|
||||
.room-context > form > input:not([disabled]).room-context-url {
|
||||
color: #0095dd;
|
||||
.room-context > form > textarea::-moz-placeholder,
|
||||
.room-context > form > input::-moz-placeholder {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.room-context > form > input[disabled] {
|
||||
background-color: rgba(255,255,255,.2);
|
||||
color: rgba(255,255,255,.4);
|
||||
}
|
||||
|
||||
.room-context > form > textarea:not(:last-of-type),
|
||||
.room-context > form > input[type="text"] {
|
||||
margin: 0 0 .5em 0;
|
||||
}
|
||||
|
||||
.room-context > .btn {
|
||||
margin: .5em 0 0;
|
||||
font-size: 1.1em;
|
||||
padding: 0 .5em;
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
.room-context-btn-close {
|
||||
position: absolute;
|
||||
right: 8px;
|
||||
/* 8px offset + 2px border-top */
|
||||
top: 10px;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background-color: transparent;
|
||||
background-image: url("../img/icons-10x10.svg#close-darkergrey");
|
||||
background-size: 8px 8px;
|
||||
background-repeat: no-repeat;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.room-context-btn-close:hover,
|
||||
.room-context-btn-close:hover:active {
|
||||
background-image: url("../img/icons-10x10.svg#close-active");
|
||||
}
|
||||
|
||||
html[dir="rtl"] .room-context-btn-close {
|
||||
right: auto;
|
||||
left: 8px;
|
||||
.room-context > form > textarea:focus,
|
||||
.room-context > form > input:focus {
|
||||
border: 0.1rem solid #5cccee;
|
||||
}
|
||||
|
||||
.media-layout {
|
||||
|
|
|
@ -359,6 +359,7 @@ loop.shared.views = (function(_, mozL10n) {
|
|||
publishStream: React.PropTypes.func.isRequired,
|
||||
screenShare: React.PropTypes.object,
|
||||
settingsMenuItems: React.PropTypes.array,
|
||||
show: React.PropTypes.bool.isRequired,
|
||||
video: React.PropTypes.object.isRequired
|
||||
},
|
||||
|
||||
|
@ -440,6 +441,10 @@ loop.shared.views = (function(_, mozL10n) {
|
|||
},
|
||||
|
||||
render: function() {
|
||||
if (!this.props.show) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var cx = React.addons.classSet;
|
||||
var conversationToolbarCssClasses = cx({
|
||||
"conversation-toolbar": true,
|
||||
|
@ -798,7 +803,7 @@ loop.shared.views = (function(_, mozL10n) {
|
|||
return null;
|
||||
}
|
||||
|
||||
return React.createElement("p", null, mozL10n.get("context_inroom_label"));
|
||||
return React.createElement("p", null, mozL10n.get("context_inroom_label2"));
|
||||
},
|
||||
|
||||
render: function() {
|
||||
|
|
|
@ -359,6 +359,7 @@ loop.shared.views = (function(_, mozL10n) {
|
|||
publishStream: React.PropTypes.func.isRequired,
|
||||
screenShare: React.PropTypes.object,
|
||||
settingsMenuItems: React.PropTypes.array,
|
||||
show: React.PropTypes.bool.isRequired,
|
||||
video: React.PropTypes.object.isRequired
|
||||
},
|
||||
|
||||
|
@ -440,6 +441,10 @@ loop.shared.views = (function(_, mozL10n) {
|
|||
},
|
||||
|
||||
render: function() {
|
||||
if (!this.props.show) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var cx = React.addons.classSet;
|
||||
var conversationToolbarCssClasses = cx({
|
||||
"conversation-toolbar": true,
|
||||
|
@ -798,7 +803,7 @@ loop.shared.views = (function(_, mozL10n) {
|
|||
return null;
|
||||
}
|
||||
|
||||
return <p>{mozL10n.get("context_inroom_label")}</p>;
|
||||
return <p>{mozL10n.get("context_inroom_label2")}</p>;
|
||||
},
|
||||
|
||||
render: function() {
|
||||
|
|
|
@ -582,6 +582,7 @@ loop.standaloneRoomViews = (function(mozL10n) {
|
|||
hangup: this.leaveRoom,
|
||||
hangupButtonLabel: mozL10n.get("rooms_leave_button_label"),
|
||||
publishStream: this.publishStream,
|
||||
show: true,
|
||||
video: {enabled: !this.state.videoMuted,
|
||||
visible: this._roomIsActive()}})
|
||||
),
|
||||
|
|
|
@ -582,6 +582,7 @@ loop.standaloneRoomViews = (function(mozL10n) {
|
|||
hangup={this.leaveRoom}
|
||||
hangupButtonLabel={mozL10n.get("rooms_leave_button_label")}
|
||||
publishStream={this.publishStream}
|
||||
show={true}
|
||||
video={{enabled: !this.state.videoMuted,
|
||||
visible: this._roomIsActive()}} />
|
||||
</sharedViews.MediaLayoutView>
|
||||
|
|
|
@ -84,9 +84,9 @@ status_error=Something went wrong
|
|||
# Text chat strings
|
||||
|
||||
chat_textbox_placeholder=Type here…
|
||||
# LOCALIZATION NOTE (context_inroom_label): this string is followed by the
|
||||
# LOCALIZATION NOTE (context_inroom_label2): this string is followed by the
|
||||
# title/URL of the website you are having a conversation about, displayed on a
|
||||
# separate line. If this structure doesn't work for your locale, you might want
|
||||
# to consider this as a stand-alone title. See example screenshot:
|
||||
# https://bug1084991.bugzilla.mozilla.org/attachment.cgi?id=8614721
|
||||
context_inroom_label=Let's talk about:
|
||||
context_inroom_label2=Let's Talk About:
|
||||
|
|
|
@ -708,16 +708,13 @@ describe("loop.roomViews", function () {
|
|||
expect(view.getDOMNode().querySelector(".room-context")).to.not.eql(null);
|
||||
});
|
||||
|
||||
it("should hide the form when the edit button is clicked again", function() {
|
||||
it("should not have a settings menu when the edit button is clicked", function() {
|
||||
view = mountTestComponent();
|
||||
|
||||
var editButton = view.getDOMNode().querySelector(".settings-menu > li.entry-settings-edit");
|
||||
React.addons.TestUtils.Simulate.click(editButton);
|
||||
|
||||
// Click again.
|
||||
React.addons.TestUtils.Simulate.click(editButton);
|
||||
|
||||
expect(view.getDOMNode().querySelector(".room-context")).to.eql(null);
|
||||
expect(view.getDOMNode().querySelector(".settings-menu")).to.eql(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -840,12 +837,12 @@ describe("loop.roomViews", function () {
|
|||
expect(view.getDOMNode()).to.eql(null);
|
||||
});
|
||||
|
||||
it("should close the view when the close button is clicked", function() {
|
||||
it("should close the view when the cancel button is clicked", function() {
|
||||
view = mountTestComponent({
|
||||
roomData: { roomContextUrls: [fakeContextURL] }
|
||||
});
|
||||
|
||||
var closeBtn = view.getDOMNode().querySelector(".room-context-btn-close");
|
||||
var closeBtn = view.getDOMNode().querySelector(".button-cancel");
|
||||
React.addons.TestUtils.Simulate.click(closeBtn);
|
||||
expect(view.getDOMNode()).to.eql(null);
|
||||
});
|
||||
|
@ -866,35 +863,6 @@ describe("loop.roomViews", function () {
|
|||
expect(node.querySelector(".room-context-url").value).to.eql(fakeContextURL.location);
|
||||
expect(node.querySelector(".room-context-comments").value).to.eql(fakeContextURL.description);
|
||||
});
|
||||
|
||||
it("should show the checkbox as disabled when context is already set", function() {
|
||||
view = mountTestComponent({
|
||||
roomData: {
|
||||
roomToken: "fakeToken",
|
||||
roomName: "fakeName",
|
||||
roomContextUrls: [fakeContextURL]
|
||||
}
|
||||
});
|
||||
|
||||
var checkbox = view.getDOMNode().querySelector(".checkbox");
|
||||
expect(checkbox.classList.contains("disabled")).to.eql(true);
|
||||
});
|
||||
|
||||
it("should hide the checkbox when no context data is stored or available", function() {
|
||||
view = mountTestComponent({
|
||||
roomData: {
|
||||
roomToken: "fakeToken",
|
||||
roomName: "Hello, is it me you're looking for?"
|
||||
}
|
||||
});
|
||||
|
||||
// First check if availableContext is set correctly.
|
||||
expect(view.state.availableContext).to.not.eql(null);
|
||||
expect(view.state.availableContext.previewImage).to.eql(favicon);
|
||||
|
||||
var node = view.getDOMNode();
|
||||
expect(node.querySelector(".checkbox-wrapper").classList.contains("hide")).to.eql(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Update Room", function() {
|
||||
|
@ -919,7 +887,7 @@ describe("loop.roomViews", function () {
|
|||
value: "reallyFake"
|
||||
}});
|
||||
|
||||
React.addons.TestUtils.Simulate.click(view.getDOMNode().querySelector(".btn-info"));
|
||||
React.addons.TestUtils.Simulate.click(view.getDOMNode().querySelector(".button-accept"));
|
||||
|
||||
sinon.assert.calledOnce(dispatcher.dispatch);
|
||||
sinon.assert.calledWithExactly(dispatcher.dispatch,
|
||||
|
@ -955,7 +923,7 @@ describe("loop.roomViews", function () {
|
|||
view.setProps({ savingContext: true }, function() {
|
||||
var node = view.getDOMNode();
|
||||
// The button should show up as disabled.
|
||||
expect(node.querySelector(".btn-info").hasAttribute("disabled")).to.eql(true);
|
||||
expect(node.querySelector(".button-accept").hasAttribute("disabled")).to.eql(true);
|
||||
|
||||
// Now simulate a successful save.
|
||||
view.setProps({ savingContext: false }, function() {
|
||||
|
@ -967,45 +935,6 @@ describe("loop.roomViews", function () {
|
|||
});
|
||||
});
|
||||
|
||||
describe("#handleCheckboxChange", function() {
|
||||
var node, checkbox;
|
||||
|
||||
beforeEach(function() {
|
||||
fakeMozLoop.getSelectedTabMetadata = sinon.stub().callsArgWith(0, {
|
||||
favicon: fakeContextURL.thumbnail,
|
||||
title: fakeContextURL.description,
|
||||
url: fakeContextURL.location
|
||||
});
|
||||
view = mountTestComponent({
|
||||
roomData: {
|
||||
roomToken: "fakeToken",
|
||||
roomName: "fakeName"
|
||||
}
|
||||
});
|
||||
|
||||
node = view.getDOMNode();
|
||||
checkbox = node.querySelector(".checkbox");
|
||||
});
|
||||
|
||||
it("should prefill the form with available context data when clicked", function() {
|
||||
React.addons.TestUtils.Simulate.click(checkbox);
|
||||
|
||||
expect(node.querySelector(".room-context-name").value).to.eql("fakeName");
|
||||
expect(node.querySelector(".room-context-url").value).to.eql(fakeContextURL.location);
|
||||
expect(node.querySelector(".room-context-comments").value).to.eql(fakeContextURL.description);
|
||||
});
|
||||
|
||||
it("should undo prefill when clicking the checkbox again", function() {
|
||||
React.addons.TestUtils.Simulate.click(checkbox);
|
||||
// Twice.
|
||||
React.addons.TestUtils.Simulate.click(checkbox);
|
||||
|
||||
expect(node.querySelector(".room-context-name").value).to.eql("fakeName");
|
||||
expect(node.querySelector(".room-context-url").value).to.eql("");
|
||||
expect(node.querySelector(".room-context-comments").value).to.eql("");
|
||||
});
|
||||
});
|
||||
|
||||
describe("#handleContextClick", function() {
|
||||
var fakeEvent;
|
||||
|
||||
|
|
|
@ -429,7 +429,8 @@ describe("loop.shared.views", function() {
|
|||
function mountTestComponent(props) {
|
||||
props = _.extend({
|
||||
dispatcher: dispatcher,
|
||||
mozLoop: {}
|
||||
mozLoop: {},
|
||||
show: true
|
||||
}, props || {});
|
||||
return TestUtils.renderIntoDocument(
|
||||
React.createElement(sharedViews.ConversationToolbar, props));
|
||||
|
@ -445,6 +446,16 @@ describe("loop.shared.views", function() {
|
|||
clock.restore();
|
||||
});
|
||||
|
||||
it("should not render the component when 'show' is false", function() {
|
||||
var comp = mountTestComponent({
|
||||
hangup: hangup,
|
||||
publishStream: publishStream,
|
||||
show: false
|
||||
});
|
||||
|
||||
expect(comp.getDOMNode()).to.eql(null);
|
||||
});
|
||||
|
||||
it("should start no idle", function() {
|
||||
var comp = mountTestComponent({
|
||||
hangupButtonLabel: "foo",
|
||||
|
|
|
@ -1118,6 +1118,7 @@
|
|||
publishStream: noop,
|
||||
screenShare: { state: SCREEN_SHARE_STATES.INACTIVE, visible: true},
|
||||
settingsMenuItems: [{ id: "feedback" }],
|
||||
show: true,
|
||||
video: { enabled: true, visible: true}})
|
||||
)
|
||||
),
|
||||
|
@ -1132,6 +1133,7 @@
|
|||
publishStream: noop,
|
||||
screenShare: { state: SCREEN_SHARE_STATES.PENDING, visible: true},
|
||||
settingsMenuItems: [{ id: "feedback" }],
|
||||
show: true,
|
||||
video: { enabled: false, visible: true}})
|
||||
)
|
||||
),
|
||||
|
@ -1146,6 +1148,7 @@
|
|||
publishStream: noop,
|
||||
screenShare: { state: SCREEN_SHARE_STATES.ACTIVE, visible: true},
|
||||
settingsMenuItems: [{ id: "feedback" }],
|
||||
show: true,
|
||||
video: { enabled: true, visible: true}})
|
||||
)
|
||||
)
|
||||
|
|
|
@ -1118,6 +1118,7 @@
|
|||
publishStream={noop}
|
||||
screenShare={{ state: SCREEN_SHARE_STATES.INACTIVE, visible: true }}
|
||||
settingsMenuItems={[{ id: "feedback" }]}
|
||||
show={true}
|
||||
video={{ enabled: true, visible: true }} />
|
||||
</div>
|
||||
</FramedExample>
|
||||
|
@ -1132,6 +1133,7 @@
|
|||
publishStream={noop}
|
||||
screenShare={{ state: SCREEN_SHARE_STATES.PENDING, visible: true }}
|
||||
settingsMenuItems={[{ id: "feedback" }]}
|
||||
show={true}
|
||||
video={{ enabled: false, visible: true }} />
|
||||
</div>
|
||||
</FramedExample>
|
||||
|
@ -1146,6 +1148,7 @@
|
|||
publishStream={noop}
|
||||
screenShare={{ state: SCREEN_SHARE_STATES.ACTIVE, visible: true }}
|
||||
settingsMenuItems={[{ id: "feedback" }]}
|
||||
show={true}
|
||||
video={{ enabled: true, visible: true }} />
|
||||
</div>
|
||||
</FramedExample>
|
||||
|
|
|
@ -70,11 +70,11 @@
|
|||
|
||||
<!-- Passwords -->
|
||||
<groupbox id="passwordsGroup" orient="vertical" data-category="paneSecurity" hidden="true">
|
||||
<caption><label>&passwords.label;</label></caption>
|
||||
<caption><label>&logins.label;</label></caption>
|
||||
|
||||
<hbox id="savePasswordsBox">
|
||||
<checkbox id="savePasswords"
|
||||
label="&rememberPasswords.label;" accesskey="&rememberPasswords.accesskey;"
|
||||
label="&rememberLogins.label;" accesskey="&rememberLogins.accesskey;"
|
||||
preference="signon.rememberSignons"
|
||||
onsyncfrompreference="return gSecurityPane.readSavePasswords();"/>
|
||||
<spacer flex="1"/>
|
||||
|
@ -103,7 +103,7 @@
|
|||
<row id="showPasswordRow">
|
||||
<hbox id="showPasswordsBox"/>
|
||||
<button id="showPasswords"
|
||||
label="&savedPasswords.label;" accesskey="&savedPasswords.accesskey;"
|
||||
label="&savedLogins.label;" accesskey="&savedLogins.accesskey;"
|
||||
preference="pref.privacy.disable_button.view_passwords"/>
|
||||
</row>
|
||||
</rows>
|
||||
|
|
|
@ -22,7 +22,3 @@ BROWSER_CHROME_MANIFESTS += [
|
|||
XPCSHELL_TESTS_MANIFESTS += [
|
||||
'test/unit/xpcshell.ini'
|
||||
]
|
||||
|
||||
EXTRA_PP_COMPONENTS += [
|
||||
'translation.manifest',
|
||||
]
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
#ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
category healthreport-js-provider-default TranslationProvider resource:///modules/translation/Translation.jsm
|
||||
#endif
|
|
@ -386,7 +386,6 @@
|
|||
@RESPATH@/browser/components/webideComponents.manifest
|
||||
@RESPATH@/browser/components/Experiments.manifest
|
||||
@RESPATH@/browser/components/ExperimentsService.js
|
||||
@RESPATH@/browser/components/translation.manifest
|
||||
@RESPATH@/components/Downloads.manifest
|
||||
@RESPATH@/components/DownloadLegacy.js
|
||||
@RESPATH@/components/BrowserPageThumbs.manifest
|
||||
|
|
|
@ -115,10 +115,6 @@ These should match what Safari and other Apple applications use on OS X Lion. --
|
|||
<!ENTITY fxaUnverified.label "Verify Your Account">
|
||||
<!ENTITY syncStartPanel2.heading "&syncBrand.shortName.label; enabled">
|
||||
<!ENTITY syncStartPanel2.subTitle "&brandShortName; will begin syncing momentarily.">
|
||||
<!ENTITY syncErrorPanel.heading "Cannot connect to &syncBrand.shortName.label;">
|
||||
<!ENTITY syncErrorPanel.subTitle "Please sign in to resume syncing.">
|
||||
<!ENTITY syncErrorPanel.signInButton.label "Sign In">
|
||||
<!ENTITY syncErrorPanel.signInButton.accesskey "S">
|
||||
|
||||
|
||||
<!ENTITY fullScreenMinimize.tooltip "Minimize">
|
||||
|
|
|
@ -31,6 +31,15 @@ first_time_experience_button_label=Get Started
|
|||
first_time_experience_subheading=Join the conversation
|
||||
|
||||
invite_header_text=Invite someone to join you.
|
||||
invite_header_text2=Invite a friend to join you
|
||||
invite_facebook_button=share on Facebook
|
||||
invite_facebook_triggered=shared!
|
||||
invite_contacts_button=share with contacts
|
||||
invite_contacts_triggered=shared!
|
||||
invite_copy_button=copy link
|
||||
invite_copy_triggered=copied!
|
||||
invite_email_button=email link
|
||||
invite_email_triggered=emailed!
|
||||
|
||||
# Status text
|
||||
display_name_guest=Guest
|
||||
|
@ -343,12 +352,16 @@ infobar_menuitem_dontshowagain_accesskey=D
|
|||
|
||||
# Context in conversation strings
|
||||
|
||||
# LOCALIZATION NOTE (context_inroom_label): this string is followed by the
|
||||
# title/URL of the website you are having a conversation about, displayed on a
|
||||
# LOCALIZATION NOTE (context_inroom_header): this string is displayed in the
|
||||
# conversation window when the user edits context. It is a header to the edit
|
||||
# section.
|
||||
context_inroom_header=Let's Talk About…
|
||||
# LOCALIZATION NOTE (context_inroom_label2): this string is followed by the
|
||||
# title and domain of the website you are having a conversation about, displayed on a
|
||||
# separate line. If this structure doesn't work for your locale, you might want
|
||||
# to consider this as a stand-alone title. See example screenshot:
|
||||
# https://bug1115342.bugzilla.mozilla.org/attachment.cgi?id=8563677
|
||||
context_inroom_label=Let's talk about:
|
||||
context_inroom_label2=Let's Talk About:
|
||||
## LOCALIZATION_NOTE (context_edit_activate_label): {{title}} will be replaced
|
||||
## by the title of the active tab, also known as the title of an HTML document.
|
||||
## The quotes around the title are intentional.
|
||||
|
@ -357,7 +370,8 @@ context_edit_name_placeholder=Conversation Name
|
|||
context_edit_comments_placeholder=Comments
|
||||
context_add_some_label=Add some context
|
||||
context_show_tooltip=Show Context
|
||||
context_save_label2=Save
|
||||
context_cancel_label=Cancel
|
||||
context_done_label=Done
|
||||
context_link_modified=This link was modified.
|
||||
context_learn_more_link_label=Learn more.
|
||||
conversation_settings_menu_edit_context=Edit Context
|
||||
|
|
|
@ -24,10 +24,10 @@
|
|||
<!ENTITY addonExceptions.accesskey "E">
|
||||
|
||||
|
||||
<!ENTITY passwords.label "Passwords">
|
||||
<!ENTITY logins.label "Logins">
|
||||
|
||||
<!ENTITY rememberPasswords.label "Remember passwords for sites">
|
||||
<!ENTITY rememberPasswords.accesskey "R">
|
||||
<!ENTITY rememberLogins.label "Remember logins for sites">
|
||||
<!ENTITY rememberLogins.accesskey "R">
|
||||
<!ENTITY passwordExceptions.label "Exceptions…">
|
||||
<!ENTITY passwordExceptions.accesskey "x">
|
||||
|
||||
|
@ -36,5 +36,5 @@
|
|||
<!ENTITY changeMasterPassword.label "Change Master Password…">
|
||||
<!ENTITY changeMasterPassword.accesskey "M">
|
||||
|
||||
<!ENTITY savedPasswords.label "Saved Passwords…">
|
||||
<!ENTITY savedPasswords.accesskey "P">
|
||||
<!ENTITY savedLogins.label "Saved Logins…">
|
||||
<!ENTITY savedLogins.accesskey "L">
|
||||
|
|
|
@ -1725,15 +1725,13 @@ toolbarbutton.chevron > .toolbarbutton-icon {
|
|||
margin-top: 1em;
|
||||
}
|
||||
|
||||
#sync-error-panel-title,
|
||||
#sync-start-panel-title {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#sync-start-panel-subtitle,
|
||||
#sync-error-panel-subtitle {
|
||||
#sync-start-panel-subtitle {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -3275,15 +3275,13 @@ notification[value="loop-sharing-notification"] .messageImage {
|
|||
@hudButtonFocused@
|
||||
}
|
||||
|
||||
#sync-error-panel-title,
|
||||
#sync-start-panel-title {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#sync-start-panel-subtitle,
|
||||
#sync-error-panel-subtitle {
|
||||
#sync-start-panel-subtitle {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2473,15 +2473,13 @@ notification[value="loop-sharing-notification"] .messageImage {
|
|||
margin-top: 1em;
|
||||
}
|
||||
|
||||
#sync-error-panel-title,
|
||||
#sync-start-panel-title {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#sync-start-panel-subtitle,
|
||||
#sync-error-panel-subtitle {
|
||||
#sync-start-panel-subtitle {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ function SignonsStartup() {
|
|||
kSignonBundle = document.getElementById("signonBundle");
|
||||
document.getElementById("togglePasswords").label = kSignonBundle.getString("showPasswords");
|
||||
document.getElementById("togglePasswords").accessKey = kSignonBundle.getString("showPasswordsAccessKey");
|
||||
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsSpielAll");
|
||||
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsDescriptionAll");
|
||||
|
||||
let treecols = document.getElementsByTagName("treecols")[0];
|
||||
treecols.addEventListener("click", HandleTreeColumnClick.bind(null, SignonColumnSort));
|
||||
|
@ -314,7 +314,7 @@ function SignonClearFilter() {
|
|||
}
|
||||
signonsTreeView._lastSelectedRanges = [];
|
||||
|
||||
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsSpielAll");
|
||||
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsDescriptionAll");
|
||||
}
|
||||
|
||||
function FocusFilterBox() {
|
||||
|
@ -384,7 +384,7 @@ function _filterPasswords()
|
|||
if (signonsTreeView.rowCount > 0)
|
||||
signonsTreeView.selection.select(0);
|
||||
|
||||
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsSpielFiltered");
|
||||
document.getElementById("signonsIntro").textContent = kSignonBundle.getString("loginsDescriptionFiltered");
|
||||
}
|
||||
|
||||
function CopyPassword() {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
onload="Startup(); SignonsStartup();"
|
||||
onunload="Shutdown();"
|
||||
title="&savedPasswords.title;"
|
||||
title="&savedLogins.title;"
|
||||
persist="width height screenX screenY">
|
||||
|
||||
<script type="application/javascript" src="chrome://passwordmgr/content/passwordManagerCommon.js"/>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
buttonlabelaccept="&closebutton.label;"
|
||||
onload="Startup(); RejectsStartup();"
|
||||
onunload="Shutdown();"
|
||||
title="&savedPasswordsExceptions.title;"
|
||||
title="&savedLoginsExceptions.title;"
|
||||
persist="width height screenX screenY">
|
||||
|
||||
<prefpane id="SignonViewerDialogPane" flex="1">
|
||||
|
@ -23,7 +23,7 @@
|
|||
<script type="application/javascript" src="chrome://passwordmgr/content/passwordManagerExceptions.js"/>
|
||||
|
||||
<vbox id="rejectedsites" flex="1">
|
||||
<description control="rejectsTree">&loginsSpielExceptions.label;</description>
|
||||
<description control="rejectsTree">&savedLoginsExceptions.desc;</description>
|
||||
<separator class="thin"/>
|
||||
<tree id="rejectsTree" flex="1" style="height: 10em;" hidecolumnpicker="true"
|
||||
onkeypress="HandleRejectKeyPress(event)"
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<!ENTITY savedPasswords.title "Saved Passwords">
|
||||
<!ENTITY savedPasswordsExceptions.title "Exceptions - Saved Passwords">
|
||||
<!ENTITY savedLogins.title "Saved Logins">
|
||||
<!ENTITY savedLoginsExceptions.title "Exceptions - Saved Logins">
|
||||
<!ENTITY savedLoginsExceptions.desc "Logins for the following sites will not be saved:">
|
||||
|
||||
<!ENTITY closebutton.label "Close">
|
||||
<!ENTITY closebutton.accesskey "C">
|
||||
|
||||
<!ENTITY loginsSpielExceptions.label "Passwords for the following sites will not be saved:">
|
||||
|
||||
<!ENTITY treehead.site.label "Site">
|
||||
<!ENTITY treehead.username.label "Username">
|
||||
<!ENTITY treehead.password.label "Password">
|
||||
|
|
|
@ -56,8 +56,8 @@ removeAllPasswordsPrompt=Are you sure you wish to remove all passwords?
|
|||
removeAllPasswordsTitle=Remove all passwords
|
||||
removeLoginPrompt=Are you sure you wish to remove this login?
|
||||
removeLoginTitle=Remove login
|
||||
loginsSpielAll=Passwords for the following sites are stored on your computer:
|
||||
loginsSpielFiltered=The following passwords match your search:
|
||||
loginsDescriptionAll=Logins for the following sites are stored on your computer:
|
||||
loginsDescriptionFiltered=The following logins match your search:
|
||||
# LOCALIZATION NOTE (loginHostAge):
|
||||
# This is used to show the context menu login items with their age.
|
||||
# 1st string is the username for the login, 2nd is the login's age.
|
||||
|
|
Загрузка…
Ссылка в новой задаче