Merge mozilla-central to mozilla-inbound. a=merge CLOSED TREE

This commit is contained in:
Ciure Andrei 2019-04-24 07:30:32 +03:00
Родитель 29a3f5fe67 43872dedcf
Коммит d753cf6b80
668 изменённых файлов: 6272 добавлений и 9977 удалений

Просмотреть файл

@ -3762,7 +3762,7 @@ var homeButtonObserver = {
},
onDragOver(aEvent) {
if (Services.prefs.prefIsLocked("browser.startup.homepage")) {
if (HomePage.locked) {
return;
}
browserDragAndDrop.dragOver(aEvent);

Просмотреть файл

@ -2543,18 +2543,17 @@ BrowserGlue.prototype = {
if (currentUIVersion < 81) {
// Reset homepage pref for users who have it set to a default from before Firefox 4:
// <locale>.(start|start2|start3).mozilla.(com|org)
const HOMEPAGE_PREF = "browser.startup.homepage";
if (Services.prefs.prefHasUserValue(HOMEPAGE_PREF)) {
const DEFAULT = Services.prefs.getDefaultBranch(HOMEPAGE_PREF).getCharPref("");
let value = Services.prefs.getCharPref(HOMEPAGE_PREF);
if (HomePage.overridden) {
const DEFAULT = HomePage.getDefault();
let value = HomePage.get();
let updated = value.replace(
/https?:\/\/([\w\-]+\.)?start\d*\.mozilla\.(org|com)[^|]*/ig, DEFAULT);
if (updated != value) {
if (updated == DEFAULT) {
Services.prefs.clearUserPref(HOMEPAGE_PREF);
HomePage.reset();
} else {
value = updated;
Services.prefs.setCharPref(HOMEPAGE_PREF, value);
HomePage.set(value);
}
}
}

Просмотреть файл

@ -85,23 +85,15 @@ function templateHTML(options, html) {
if (isPrerendered) {
scripts.unshift(`${options.baseUrl}prerendered/static/activity-stream-initial-state.js`);
}
const scriptTag = `
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of ${JSON.stringify(scripts, null, 2)}) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>`;
// Add spacing and script tags
const scriptRender = `\n${scripts.map(script => ` <script src="${script}"></script>`).join("\n")}`;
return `<!doctype html>
<html lang="${options.locale}" dir="${options.direction}">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>${options.strings.newtab_page_title}</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -109,9 +101,7 @@ for (const src of ${JSON.stringify(scripts, null, 2)}) {
</head>
<body class="activity-stream">
<div id="root">${isPrerendered ? html : "<!-- Regular React Rendering -->"}</div>
<div id="snippets-container">
<div id="snippets"></div>
</div>${options.noscripts ? "" : scriptTag}
<div id="footer-snippets-container" />${options.noscripts ? "" : scriptRender}
</body>
</html>
`;

Просмотреть файл

@ -58,9 +58,6 @@ for (const type of [
"HANDOFF_SEARCH_TO_AWESOMEBAR",
"HIDE_SEARCH",
"INIT",
"MIGRATION_CANCEL",
"MIGRATION_COMPLETED",
"MIGRATION_START",
"NEW_TAB_INIT",
"NEW_TAB_INITIAL_STATE",
"NEW_TAB_LOAD",

Просмотреть файл

@ -74,7 +74,6 @@ class _PrerenderData {
this.PrerenderData = new _PrerenderData({
initialPrefs: {
"migrationExpired": true,
"feeds.topsites": true,
"showSearch": true,
"topSitesRows": 1,

Просмотреть файл

@ -7,12 +7,14 @@ import {LocalizationProvider} from "fluent-react";
import {NEWTAB_DARK_THEME} from "content-src/lib/constants";
import {OnboardingMessage} from "./templates/OnboardingMessage/OnboardingMessage";
import React from "react";
import ReactDOM from "react-dom";
import {ReturnToAMO} from "./templates/ReturnToAMO/ReturnToAMO";
import {SnippetsTemplates} from "./templates/template-manifest";
import {StartupOverlay} from "./templates/StartupOverlay/StartupOverlay";
const INCOMING_MESSAGE_NAME = "ASRouter:parent-to-child";
const OUTGOING_MESSAGE_NAME = "ASRouter:child-to-parent";
const TEMPLATES_BELOW_SEARCH = ["simple_below_search_snippet"];
export const ASRouterUtils = {
addListener(listener) {
@ -93,6 +95,9 @@ export class ASRouterUISurface extends React.PureComponent {
this.sendImpression = this.sendImpression.bind(this);
this.sendUserActionTelemetry = this.sendUserActionTelemetry.bind(this);
this.state = {message: {}, bundle: {}};
if (props.document) {
this.portalContainer = props.document.getElementById("footer-snippets-container");
}
}
sendUserActionTelemetry(extraProps = {}) {
@ -299,14 +304,22 @@ export class ASRouterUISurface extends React.PureComponent {
render() {
const {message, bundle} = this.state;
if (!message.id && !bundle.template) { return null; }
return (
<React.Fragment>
{this.renderPreviewBanner()}
{this.renderFirstRunOverlay()}
{this.renderOnboarding()}
{this.renderSnippets()}
</React.Fragment>
);
const shouldRenderBelowSearch = TEMPLATES_BELOW_SEARCH.includes(message.template);
return shouldRenderBelowSearch ?
// Render special below search snippets in place;
<div className="below-search-snippet">{this.renderSnippets()}</div> :
// For onboarding, regular snippets etc. we should render
// everything in our footer container.
ReactDOM.createPortal(
<>
{this.renderPreviewBanner()}
{this.renderFirstRunOverlay()}
{this.renderOnboarding()}
{this.renderSnippets()}
</>,
this.portalContainer
);
}
}

Просмотреть файл

@ -6,6 +6,36 @@ export class SnippetBase extends React.PureComponent {
super(props);
this.onBlockClicked = this.onBlockClicked.bind(this);
this.onDismissClicked = this.onDismissClicked.bind(this);
this.setBlockButtonRef = this.setBlockButtonRef.bind(this);
this.onBlockButtonMouseEnter = this.onBlockButtonMouseEnter.bind(this);
this.onBlockButtonMouseLeave = this.onBlockButtonMouseLeave.bind(this);
this.state = {blockButtonHover: false};
}
componentDidMount() {
if (this.blockButtonRef) {
this.blockButtonRef.addEventListener("mouseenter", this.onBlockButtonMouseEnter);
this.blockButtonRef.addEventListener("mouseleave", this.onBlockButtonMouseLeave);
}
}
componentWillUnmount() {
if (this.blockButtonRef) {
this.blockButtonRef.removeEventListener("mouseenter", this.onBlockButtonMouseEnter);
this.blockButtonRef.removeEventListener("mouseleave", this.onBlockButtonMouseLeave);
}
}
setBlockButtonRef(element) {
this.blockButtonRef = element;
}
onBlockButtonMouseEnter() {
this.setState({blockButtonHover: true});
}
onBlockButtonMouseLeave() {
this.setState({blockButtonHover: false});
}
onBlockClicked() {
@ -41,14 +71,15 @@ export class SnippetBase extends React.PureComponent {
const defaultTitle = schema.properties.block_button_text.default;
return (
<button className="blockButton" title={this.props.content.block_button_text || defaultTitle} onClick={this.onBlockClicked} />
<button className="blockButton" title={this.props.content.block_button_text || defaultTitle} onClick={this.onBlockClicked} ref={this.setBlockButtonRef} />
);
}
render() {
const {props} = this;
const {blockButtonHover} = this.state;
const containerClassName = `SnippetBaseContainer${props.className ? ` ${props.className}` : ""}`;
const containerClassName = `SnippetBaseContainer${props.className ? ` ${props.className}` : ""}${blockButtonHover ? " active" : ""}`;
return (<div className={containerClassName} style={this.props.textStyle}>
<div className="innerWrapper">

Просмотреть файл

@ -0,0 +1,70 @@
.SimpleBelowSearchSnippet {
background-color: inherit;
border: 0;
box-shadow: none;
position: relative;
z-index: auto;
&.active {
background: var(--newtab-element-hover-color);
border-radius: 4px;
}
.innerWrapper {
flex-direction: column;
padding: 15px;
text-align: center;
width: 100%;
@mixin full-width-styles {
flex-direction: row;
padding: 0;
padding-inline-end: 36px;
text-align: inherit;
}
@media (min-width: $break-point-medium) {
@include full-width-styles;
}
// Disable breakpoints for now if discovery stream is enabled.
.ds-outer-wrapper-breakpoint-override & {
@include full-width-styles;
}
}
.blockButton {
display: block;
inset-inline-end: 15px;
opacity: 1;
top: 20px;
@media (min-width: $break-point-medium) {
top: 50%;
}
// Disable breakpoints for now if discovery stream is enabled.
.ds-outer-wrapper-breakpoint-override & {
top: 50%;
}
}
.icon {
height: 28px;
margin-inline-start: 12px;
width: 28px;
}
.body {
margin: 5px 0 0;
@media (min-width: $break-point-medium) {
margin: 14px 0;
}
// Disable breakpoints for now if discovery stream is enabled.
.ds-outer-wrapper-breakpoint-override & {
margin: 14px 0;
}
}
}

Просмотреть файл

@ -32,14 +32,14 @@ const LAYOUT_VARIANTS = {
"dev-test-feeds": "Stress testing for slow feeds",
};
export class ToggleSpocButton extends React.PureComponent {
export class ToggleStoryButton extends React.PureComponent {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.props.onClick(this.props.spoc);
this.props.onClick(this.props.story);
}
render() {
@ -54,9 +54,9 @@ export class DiscoveryStreamAdmin extends React.PureComponent {
super(props);
this.onEnableToggle = this.onEnableToggle.bind(this);
this.changeEndpointVariant = this.changeEndpointVariant.bind(this);
this.onSpocToggle = this.onSpocToggle.bind(this);
this.onStoryToggle = this.onStoryToggle.bind(this);
this.state = {
toggledSpocs: {},
toggledStories: {},
};
}
@ -101,6 +101,28 @@ export class DiscoveryStreamAdmin extends React.PureComponent {
return isMatch;
}
renderFeedData(url) {
const {feeds} = this.props.state;
const feed = feeds.data[url].data;
return (
<React.Fragment>
<h4>Feed url: {url}</h4>
<table><tbody>
{feed.recommendations.map(story => this.renderStoryData(story))}
</tbody></table>
</React.Fragment>
);
}
renderFeedsData() {
const {feeds} = this.props.state;
return (
<React.Fragment>
{Object.keys(feeds.data).map(url => this.renderFeedData(url))}
</React.Fragment>
);
}
renderSpocs() {
const {spocs} = this.props.state;
let spocsData = [];
@ -122,38 +144,38 @@ export class DiscoveryStreamAdmin extends React.PureComponent {
</tbody></table>
<h4>Spoc data</h4>
<table><tbody>
{spocsData.map(spoc => this.renderSpocData(spoc))}
{spocsData.map(spoc => this.renderStoryData(spoc))}
</tbody></table>
<h4>Spoc frequency caps</h4>
<table><tbody>
{spocs.frequency_caps.map(spoc => this.renderSpocData(spoc))}
{spocs.frequency_caps.map(spoc => this.renderStoryData(spoc))}
</tbody></table>
</React.Fragment>
);
}
onSpocToggle(spoc) {
const {toggledSpocs} = this.state;
onStoryToggle(story) {
const {toggledStories} = this.state;
this.setState({
toggledSpocs: {
...toggledSpocs,
[spoc.id]: !toggledSpocs[spoc.id],
toggledStories: {
...toggledStories,
[story.id]: !toggledStories[story.id],
},
});
}
renderSpocData(spoc) {
let spocData = "";
if (this.state.toggledSpocs[spoc.id]) {
spocData = JSON.stringify(spoc, null, 2);
renderStoryData(story) {
let storyData = "";
if (this.state.toggledStories[story.id]) {
storyData = JSON.stringify(story, null, 2);
}
return (<tr className="message-item" key={spoc.id}>
return (<tr className="message-item" key={story.id}>
<td className="message-id">
<span>{spoc.id} <br /></span>
<ToggleSpocButton spoc={spoc} onClick={this.onSpocToggle} />
<span>{story.id} <br /></span>
<ToggleStoryButton story={story} onClick={this.onStoryToggle} />
</td>
<td className="message-summary">
<pre>{spocData}</pre>
<pre>{storyData}</pre>
</td>
</tr>);
}
@ -212,6 +234,9 @@ export class DiscoveryStreamAdmin extends React.PureComponent {
</div>
))}
<h3>Feeds Data</h3>
{this.renderFeedsData()}
<h3>Spocs</h3>
{this.renderSpocs()}
</div>);
@ -780,9 +805,15 @@ export class CollapseToggle extends React.PureComponent {
render() {
const {props} = this;
const {renderAdmin} = this;
const action = (this.state.collapsed || !renderAdmin) ? "Expand" : "Collapse";
const isCollapsed = this.state.collapsed || !renderAdmin;
const label = `${isCollapsed ? "Expand" : "Collapse"} devtools`;
return (<React.Fragment>
<a href="#devtools" className="asrouter-toggle" onClick={this.renderAdmin ? this.onCollapseToggle : null}>{action} Devtools</a>
<a href="#devtools"
title={label}
className={`asrouter-toggle ${isCollapsed ? "collapsed" : "expanded"}`}
onClick={this.renderAdmin ? this.onCollapseToggle : null}>
<span className="sr-only">{label}</span><span className="icon icon-devtools" />
</a>
{renderAdmin ? <ASRouterAdminInner {...props} collapsed={this.state.collapsed} /> : null}
</React.Fragment>);
}

Просмотреть файл

@ -1,15 +1,25 @@
.asrouter-toggle {
background: $yellow-50;
color: $black;
position: fixed;
top: 0;
left: 43px;
padding: 5px 10px;
border-radius: 0 0 3px 3px;
border: 1px solid $black-10;
border-top: 0;
top: 15px;
right: 48px;
border: 0;
background: none;
z-index: 3000;
border-radius: 2px;
.icon-devtools {
background-image: url('chrome://browser/skin/developer.svg');
padding: 15px;
}
&:hover {
background: var(--newtab-element-hover-color);
}
&.expanded {
background: $black-20;
}
}
.asrouter-admin {

Просмотреть файл

@ -6,7 +6,6 @@ import {ConfirmDialog} from "content-src/components/ConfirmDialog/ConfirmDialog"
import {connect} from "react-redux";
import {DiscoveryStreamBase} from "content-src/components/DiscoveryStreamBase/DiscoveryStreamBase";
import {ErrorBoundary} from "content-src/components/ErrorBoundary/ErrorBoundary";
import {ManualMigration} from "content-src/components/ManualMigration/ManualMigration";
import {PrerenderData} from "common/PrerenderData.jsm";
import React from "react";
import {Search} from "content-src/components/Search/Search";
@ -159,12 +158,8 @@ export class BaseContent extends React.PureComponent {
</ErrorBoundary>
</div>
}
<ASRouterUISurface dispatch={this.props.dispatch} />
<div className={`body-wrapper${(initialized ? " on" : "")}`}>
{!isDiscoveryStream && !prefs.migrationExpired &&
<div className="non-collapsible-section">
<ManualMigration />
</div>
}
{isDiscoveryStream ? (
<ErrorBoundary className="borderless-error">
<DiscoveryStreamBase />
@ -174,7 +169,6 @@ export class BaseContent extends React.PureComponent {
<ConfirmDialog />
</main>
</div>
<ASRouterUISurface dispatch={this.props.dispatch} />
</div>);
}
}

Просмотреть файл

@ -1,49 +0,0 @@
import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
import {connect} from "react-redux";
import {FormattedMessage} from "react-intl";
import React from "react";
/**
* Manual migration component used to start the profile import wizard.
* Message is presented temporarily and will go away if:
* 1. User clicks "No Thanks"
* 2. User completed the data import
* 3. After 3 active days
* 4. User clicks "Cancel" on the import wizard (currently not implemented).
*/
export class _ManualMigration extends React.PureComponent {
constructor(props) {
super(props);
this.onLaunchTour = this.onLaunchTour.bind(this);
this.onCancelTour = this.onCancelTour.bind(this);
}
onLaunchTour() {
this.props.dispatch(ac.AlsoToMain({type: at.MIGRATION_START}));
this.props.dispatch(ac.UserEvent({event: at.MIGRATION_START}));
}
onCancelTour() {
this.props.dispatch(ac.AlsoToMain({type: at.MIGRATION_CANCEL}));
this.props.dispatch(ac.UserEvent({event: at.MIGRATION_CANCEL}));
}
render() {
return (<div className="manual-migration-container">
<p>
<span className="icon icon-import" />
<FormattedMessage id="manual_migration_explanation2" />
</p>
<div className="manual-migration-actions actions">
<button className="dismiss" onClick={this.onCancelTour}>
<FormattedMessage id="manual_migration_cancel_button" />
</button>
<button onClick={this.onLaunchTour}>
<FormattedMessage id="manual_migration_import_button" />
</button>
</div>
</div>);
}
}
export const ManualMigration = connect()(_ManualMigration);

Просмотреть файл

@ -1,53 +0,0 @@
.manual-migration-container {
color: var(--newtab-text-conditional-color);
font-size: 13px;
line-height: 15px;
margin-bottom: $section-spacing;
text-align: center;
@media (min-width: $break-point-medium) {
display: flex;
justify-content: space-between;
text-align: left;
}
p {
margin: 0;
@media (min-width: $break-point-medium) {
align-self: center;
display: flex;
justify-content: space-between;
}
}
.icon {
display: none;
@media (min-width: $break-point-medium) {
align-self: center;
display: block;
fill: var(--newtab-icon-secondary-color);
flex-shrink: 0;
margin-inline-end: 6px;
}
}
}
.manual-migration-actions {
border: 0;
display: block;
flex-wrap: nowrap;
@media (min-width: $break-point-medium) {
display: flex;
justify-content: space-between;
padding: 0;
}
button {
align-self: center;
height: 26px;
margin: 0;
margin-inline-start: 20px;
padding: 0 12px;
}
}

Просмотреть файл

@ -8,12 +8,6 @@ $glyph-forward: url('chrome://browser/skin/forward.svg');
.search-wrapper {
padding: 34px 0 64px;
@media (max-height: 700px) {
& {
padding: 0 0 30px;
}
}
.only-search & {
padding: 0 0 64px;
}
@ -137,6 +131,44 @@ $glyph-forward: url('chrome://browser/skin/forward.svg');
}
}
.below-search-snippet {
margin: 0 auto;
width: $searchbar-width-small;
@media (min-width: $break-point-medium) {
width: $searchbar-width-medium;
}
@media (min-width: $break-point-large) {
width: $searchbar-width-large;
}
// Disable breakpoints for now if discovery stream is enabled.
.ds-outer-wrapper-breakpoint-override & {
width: $searchbar-width-large;
}
}
.non-collapsible-section + .below-search-snippet {
// If search is enabled, we need to invade its large bottom padding.
margin-top: -50px;
}
@media (max-height: 700px) {
.search-wrapper {
padding: 0 0 30px;
}
.non-collapsible-section + .below-search-snippet {
// In shorter windows, search doesn't have such a large padding.
margin-top: -16px;
}
.below-search-snippet {
min-height: 0;
}
}
.search-handoff-button {
background: var(--newtab-textbox-background-color) var(--newtab-search-icon) $search-icon-padding center no-repeat;
background-size: $search-icon-size;

Просмотреть файл

@ -128,11 +128,6 @@ input {
}
}
// Make sure snippets show up above other UI elements
#snippets-container { // sass-lint:disable-line no-ids
z-index: 1;
}
// Components
@import '../components/Base/Base';
@import '../components/ErrorBoundary/ErrorBoundary';
@ -143,7 +138,6 @@ input {
@import '../components/ContextMenu/ContextMenu';
@import '../components/ConfirmDialog/ConfirmDialog';
@import '../components/Card/Card';
@import '../components/ManualMigration/ManualMigration';
@import '../components/CollapsibleSection/CollapsibleSection';
@import '../components/ASRouterAdmin/ASRouterAdmin';
@import '../components/PocketLoggedInCta/PocketLoggedInCta';
@ -170,6 +164,7 @@ input {
@import '../asrouter/components/SnippetBase/SnippetBase';
@import '../asrouter/components/ModalOverlay/ModalOverlay';
@import '../asrouter/templates/ReturnToAMO/ReturnToAMO';
@import '../asrouter/templates/SimpleBelowSearchSnippet/SimpleBelowSearchSnippet';
@import '../asrouter/templates/SimpleSnippet/SimpleSnippet';
@import '../asrouter/templates/SubmitFormSnippet/SubmitFormSnippet';
@import '../asrouter/templates/OnboardingMessage/OnboardingMessage';

Просмотреть файл

@ -54,10 +54,6 @@
background-image: url('#{$image-path}glyph-info-16.svg');
}
&.icon-import {
background-image: url('#{$image-path}glyph-import-16.svg');
}
&.icon-new-window {
@include flip-icon;
background-image: url('#{$image-path}glyph-newWindow-16.svg');

Просмотреть файл

@ -148,8 +148,6 @@ body {
background-image: url("../data/content/assets/glyph-dismiss-16.svg"); }
.icon.icon-info {
background-image: url("../data/content/assets/glyph-info-16.svg"); }
.icon.icon-import {
background-image: url("../data/content/assets/glyph-import-16.svg"); }
.icon.icon-new-window {
background-image: url("../data/content/assets/glyph-newWindow-16.svg"); }
.icon.icon-new-window:dir(rtl) {
@ -326,9 +324,6 @@ a {
input[type='text'], input[type='search'] {
border-radius: 3px; }
#snippets-container {
z-index: 1; }
.outer-wrapper {
color: var(--newtab-text-primary-color);
display: flex;
@ -982,9 +977,6 @@ main {
.search-wrapper {
padding: 34px 0 64px; }
@media (max-height: 700px) {
.search-wrapper {
padding: 0 0 30px; } }
.only-search .search-wrapper {
padding: 0 0 64px; }
.search-wrapper .logo-and-wordmark {
@ -1068,6 +1060,29 @@ main {
.search-wrapper .search-button:dir(rtl) {
transform: scaleX(-1); }
.below-search-snippet {
margin: 0 auto;
width: 224px; }
@media (min-width: 610px) {
.below-search-snippet {
width: 480px; } }
@media (min-width: 866px) {
.below-search-snippet {
width: 736px; } }
.ds-outer-wrapper-breakpoint-override .below-search-snippet {
width: 736px; }
.non-collapsible-section + .below-search-snippet {
margin-top: -50px; }
@media (max-height: 700px) {
.search-wrapper {
padding: 0 0 30px; }
.non-collapsible-section + .below-search-snippet {
margin-top: -16px; }
.below-search-snippet {
min-height: 0; } }
.search-handoff-button {
background: var(--newtab-textbox-background-color) var(--newtab-search-icon) 12px center no-repeat;
background-size: 24px;
@ -1515,50 +1530,6 @@ main {
.compact-cards .hide-for-narrow {
display: none; } }
.manual-migration-container {
color: var(--newtab-text-conditional-color);
font-size: 13px;
line-height: 15px;
margin-bottom: 20px;
text-align: center; }
@media (min-width: 610px) {
.manual-migration-container {
display: flex;
justify-content: space-between;
text-align: left; } }
.manual-migration-container p {
margin: 0; }
@media (min-width: 610px) {
.manual-migration-container p {
align-self: center;
display: flex;
justify-content: space-between; } }
.manual-migration-container .icon {
display: none; }
@media (min-width: 610px) {
.manual-migration-container .icon {
align-self: center;
display: block;
fill: var(--newtab-icon-secondary-color);
flex-shrink: 0;
margin-inline-end: 6px; } }
.manual-migration-actions {
border: 0;
display: block;
flex-wrap: nowrap; }
@media (min-width: 610px) {
.manual-migration-actions {
display: flex;
justify-content: space-between;
padding: 0; } }
.manual-migration-actions button {
align-self: center;
height: 26px;
margin: 0;
margin-inline-start: 20px;
padding: 0 12px; }
.collapsible-section {
padding: 10px 25px;
transition-delay: 100ms;
@ -1649,16 +1620,20 @@ main {
display: none; } }
.asrouter-toggle {
background: #FFE900;
color: #000;
position: fixed;
top: 0;
left: 43px;
padding: 5px 10px;
border-radius: 0 0 3px 3px;
border: 1px solid rgba(0, 0, 0, 0.1);
border-top: 0;
z-index: 3000; }
top: 15px;
right: 48px;
border: 0;
background: none;
z-index: 3000;
border-radius: 2px; }
.asrouter-toggle .icon-devtools {
background-image: url("chrome://browser/skin/developer.svg");
padding: 15px; }
.asrouter-toggle:hover {
background: var(--newtab-element-hover-color); }
.asrouter-toggle.expanded {
background: rgba(0, 0, 0, 0.2); }
.asrouter-admin {
position: fixed;
@ -3006,6 +2981,53 @@ main {
fill: #FFF;
vertical-align: sub; }
.SimpleBelowSearchSnippet {
background-color: inherit;
border: 0;
box-shadow: none;
position: relative;
z-index: auto; }
.SimpleBelowSearchSnippet.active {
background: var(--newtab-element-hover-color);
border-radius: 4px; }
.SimpleBelowSearchSnippet .innerWrapper {
flex-direction: column;
padding: 15px;
text-align: center;
width: 100%; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .innerWrapper {
flex-direction: row;
padding: 0;
padding-inline-end: 36px;
text-align: inherit; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .innerWrapper {
flex-direction: row;
padding: 0;
padding-inline-end: 36px;
text-align: inherit; }
.SimpleBelowSearchSnippet .blockButton {
display: block;
inset-inline-end: 15px;
opacity: 1;
top: 20px; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .blockButton {
top: 50%; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .blockButton {
top: 50%; }
.SimpleBelowSearchSnippet .icon {
height: 28px;
margin-inline-start: 12px;
width: 28px; }
.SimpleBelowSearchSnippet .body {
margin: 5px 0 0; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .body {
margin: 14px 0; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .body {
margin: 14px 0; }
.SimpleSnippet.tall {
padding: 27px 0; }

Просмотреть файл

@ -151,8 +151,6 @@ body {
background-image: url("../data/content/assets/glyph-dismiss-16.svg"); }
.icon.icon-info {
background-image: url("../data/content/assets/glyph-info-16.svg"); }
.icon.icon-import {
background-image: url("../data/content/assets/glyph-import-16.svg"); }
.icon.icon-new-window {
background-image: url("../data/content/assets/glyph-newWindow-16.svg"); }
.icon.icon-new-window:dir(rtl) {
@ -329,9 +327,6 @@ a {
input[type='text'], input[type='search'] {
border-radius: 3px; }
#snippets-container {
z-index: 1; }
.outer-wrapper {
color: var(--newtab-text-primary-color);
display: flex;
@ -985,9 +980,6 @@ main {
.search-wrapper {
padding: 34px 0 64px; }
@media (max-height: 700px) {
.search-wrapper {
padding: 0 0 30px; } }
.only-search .search-wrapper {
padding: 0 0 64px; }
.search-wrapper .logo-and-wordmark {
@ -1071,6 +1063,29 @@ main {
.search-wrapper .search-button:dir(rtl) {
transform: scaleX(-1); }
.below-search-snippet {
margin: 0 auto;
width: 224px; }
@media (min-width: 610px) {
.below-search-snippet {
width: 480px; } }
@media (min-width: 866px) {
.below-search-snippet {
width: 736px; } }
.ds-outer-wrapper-breakpoint-override .below-search-snippet {
width: 736px; }
.non-collapsible-section + .below-search-snippet {
margin-top: -50px; }
@media (max-height: 700px) {
.search-wrapper {
padding: 0 0 30px; }
.non-collapsible-section + .below-search-snippet {
margin-top: -16px; }
.below-search-snippet {
min-height: 0; } }
.search-handoff-button {
background: var(--newtab-textbox-background-color) var(--newtab-search-icon) 12px center no-repeat;
background-size: 24px;
@ -1518,50 +1533,6 @@ main {
.compact-cards .hide-for-narrow {
display: none; } }
.manual-migration-container {
color: var(--newtab-text-conditional-color);
font-size: 13px;
line-height: 15px;
margin-bottom: 20px;
text-align: center; }
@media (min-width: 610px) {
.manual-migration-container {
display: flex;
justify-content: space-between;
text-align: left; } }
.manual-migration-container p {
margin: 0; }
@media (min-width: 610px) {
.manual-migration-container p {
align-self: center;
display: flex;
justify-content: space-between; } }
.manual-migration-container .icon {
display: none; }
@media (min-width: 610px) {
.manual-migration-container .icon {
align-self: center;
display: block;
fill: var(--newtab-icon-secondary-color);
flex-shrink: 0;
margin-inline-end: 6px; } }
.manual-migration-actions {
border: 0;
display: block;
flex-wrap: nowrap; }
@media (min-width: 610px) {
.manual-migration-actions {
display: flex;
justify-content: space-between;
padding: 0; } }
.manual-migration-actions button {
align-self: center;
height: 26px;
margin: 0;
margin-inline-start: 20px;
padding: 0 12px; }
.collapsible-section {
padding: 10px 25px;
transition-delay: 100ms;
@ -1652,16 +1623,20 @@ main {
display: none; } }
.asrouter-toggle {
background: #FFE900;
color: #000;
position: fixed;
top: 0;
left: 43px;
padding: 5px 10px;
border-radius: 0 0 3px 3px;
border: 1px solid rgba(0, 0, 0, 0.1);
border-top: 0;
z-index: 3000; }
top: 15px;
right: 48px;
border: 0;
background: none;
z-index: 3000;
border-radius: 2px; }
.asrouter-toggle .icon-devtools {
background-image: url("chrome://browser/skin/developer.svg");
padding: 15px; }
.asrouter-toggle:hover {
background: var(--newtab-element-hover-color); }
.asrouter-toggle.expanded {
background: rgba(0, 0, 0, 0.2); }
.asrouter-admin {
position: fixed;
@ -3009,6 +2984,53 @@ main {
fill: #FFF;
vertical-align: sub; }
.SimpleBelowSearchSnippet {
background-color: inherit;
border: 0;
box-shadow: none;
position: relative;
z-index: auto; }
.SimpleBelowSearchSnippet.active {
background: var(--newtab-element-hover-color);
border-radius: 4px; }
.SimpleBelowSearchSnippet .innerWrapper {
flex-direction: column;
padding: 15px;
text-align: center;
width: 100%; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .innerWrapper {
flex-direction: row;
padding: 0;
padding-inline-end: 36px;
text-align: inherit; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .innerWrapper {
flex-direction: row;
padding: 0;
padding-inline-end: 36px;
text-align: inherit; }
.SimpleBelowSearchSnippet .blockButton {
display: block;
inset-inline-end: 15px;
opacity: 1;
top: 20px; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .blockButton {
top: 50%; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .blockButton {
top: 50%; }
.SimpleBelowSearchSnippet .icon {
height: 28px;
margin-inline-start: 12px;
width: 28px; }
.SimpleBelowSearchSnippet .body {
margin: 5px 0 0; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .body {
margin: 14px 0; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .body {
margin: 14px 0; }
.SimpleSnippet.tall {
padding: 27px 0; }

Просмотреть файл

@ -148,8 +148,6 @@ body {
background-image: url("../data/content/assets/glyph-dismiss-16.svg"); }
.icon.icon-info {
background-image: url("../data/content/assets/glyph-info-16.svg"); }
.icon.icon-import {
background-image: url("../data/content/assets/glyph-import-16.svg"); }
.icon.icon-new-window {
background-image: url("../data/content/assets/glyph-newWindow-16.svg"); }
.icon.icon-new-window:dir(rtl) {
@ -326,9 +324,6 @@ a {
input[type='text'], input[type='search'] {
border-radius: 3px; }
#snippets-container {
z-index: 1; }
.outer-wrapper {
color: var(--newtab-text-primary-color);
display: flex;
@ -982,9 +977,6 @@ main {
.search-wrapper {
padding: 34px 0 64px; }
@media (max-height: 700px) {
.search-wrapper {
padding: 0 0 30px; } }
.only-search .search-wrapper {
padding: 0 0 64px; }
.search-wrapper .logo-and-wordmark {
@ -1068,6 +1060,29 @@ main {
.search-wrapper .search-button:dir(rtl) {
transform: scaleX(-1); }
.below-search-snippet {
margin: 0 auto;
width: 224px; }
@media (min-width: 610px) {
.below-search-snippet {
width: 480px; } }
@media (min-width: 866px) {
.below-search-snippet {
width: 736px; } }
.ds-outer-wrapper-breakpoint-override .below-search-snippet {
width: 736px; }
.non-collapsible-section + .below-search-snippet {
margin-top: -50px; }
@media (max-height: 700px) {
.search-wrapper {
padding: 0 0 30px; }
.non-collapsible-section + .below-search-snippet {
margin-top: -16px; }
.below-search-snippet {
min-height: 0; } }
.search-handoff-button {
background: var(--newtab-textbox-background-color) var(--newtab-search-icon) 12px center no-repeat;
background-size: 24px;
@ -1515,50 +1530,6 @@ main {
.compact-cards .hide-for-narrow {
display: none; } }
.manual-migration-container {
color: var(--newtab-text-conditional-color);
font-size: 13px;
line-height: 15px;
margin-bottom: 20px;
text-align: center; }
@media (min-width: 610px) {
.manual-migration-container {
display: flex;
justify-content: space-between;
text-align: left; } }
.manual-migration-container p {
margin: 0; }
@media (min-width: 610px) {
.manual-migration-container p {
align-self: center;
display: flex;
justify-content: space-between; } }
.manual-migration-container .icon {
display: none; }
@media (min-width: 610px) {
.manual-migration-container .icon {
align-self: center;
display: block;
fill: var(--newtab-icon-secondary-color);
flex-shrink: 0;
margin-inline-end: 6px; } }
.manual-migration-actions {
border: 0;
display: block;
flex-wrap: nowrap; }
@media (min-width: 610px) {
.manual-migration-actions {
display: flex;
justify-content: space-between;
padding: 0; } }
.manual-migration-actions button {
align-self: center;
height: 26px;
margin: 0;
margin-inline-start: 20px;
padding: 0 12px; }
.collapsible-section {
padding: 10px 25px;
transition-delay: 100ms;
@ -1649,16 +1620,20 @@ main {
display: none; } }
.asrouter-toggle {
background: #FFE900;
color: #000;
position: fixed;
top: 0;
left: 43px;
padding: 5px 10px;
border-radius: 0 0 3px 3px;
border: 1px solid rgba(0, 0, 0, 0.1);
border-top: 0;
z-index: 3000; }
top: 15px;
right: 48px;
border: 0;
background: none;
z-index: 3000;
border-radius: 2px; }
.asrouter-toggle .icon-devtools {
background-image: url("chrome://browser/skin/developer.svg");
padding: 15px; }
.asrouter-toggle:hover {
background: var(--newtab-element-hover-color); }
.asrouter-toggle.expanded {
background: rgba(0, 0, 0, 0.2); }
.asrouter-admin {
position: fixed;
@ -3006,6 +2981,53 @@ main {
fill: #FFF;
vertical-align: sub; }
.SimpleBelowSearchSnippet {
background-color: inherit;
border: 0;
box-shadow: none;
position: relative;
z-index: auto; }
.SimpleBelowSearchSnippet.active {
background: var(--newtab-element-hover-color);
border-radius: 4px; }
.SimpleBelowSearchSnippet .innerWrapper {
flex-direction: column;
padding: 15px;
text-align: center;
width: 100%; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .innerWrapper {
flex-direction: row;
padding: 0;
padding-inline-end: 36px;
text-align: inherit; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .innerWrapper {
flex-direction: row;
padding: 0;
padding-inline-end: 36px;
text-align: inherit; }
.SimpleBelowSearchSnippet .blockButton {
display: block;
inset-inline-end: 15px;
opacity: 1;
top: 20px; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .blockButton {
top: 50%; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .blockButton {
top: 50%; }
.SimpleBelowSearchSnippet .icon {
height: 28px;
margin-inline-start: 12px;
width: 28px; }
.SimpleBelowSearchSnippet .body {
margin: 5px 0 0; }
@media (min-width: 610px) {
.SimpleBelowSearchSnippet .body {
margin: 14px 0; } }
.ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .body {
margin: 14px 0; }
.SimpleSnippet.tall {
padding: 27px 0; }

Просмотреть файл

@ -92,15 +92,15 @@
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var content_src_components_Base_Base__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(51);
/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(50);
/* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(28);
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(16);
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(56);
/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(55);
@ -197,7 +197,7 @@ const globalImportContext = typeof Window === "undefined" ? BACKGROUND_PROCESS :
// }
const actionTypes = {};
for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "AS_ROUTER_TELEMETRY_USER_EVENT", "BLOCK_URL", "BOOKMARK_URL", "COPY_DOWNLOAD_LINK", "DELETE_BOOKMARK_BY_ID", "DELETE_FROM_POCKET", "DELETE_HISTORY_URL", "DIALOG_CANCEL", "DIALOG_OPEN", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_LOADED_CONTENT", "DISCOVERY_STREAM_OPT_OUT", "DISCOVERY_STREAM_SPOCS_CAPS", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_SEARCH", "INIT", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_DOWNLOAD_FILE", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "OPEN_WEBEXT_SETTINGS", "PAGE_PRERENDERED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_CHANGED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PLACES_SAVED_TO_POCKET", "POCKET_CTA", "POCKET_LINK_DELETED_OR_ARCHIVED", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "PREVIEW_REQUEST", "PREVIEW_REQUEST_CANCEL", "PREVIEW_RESPONSE", "REMOVE_DOWNLOAD_FILE", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_MOVE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_DOWNLOAD_FILE", "SHOW_FIREFOX_ACCOUNTS", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "SNIPPETS_RESET", "SNIPPET_BLOCKED", "SUBMIT_EMAIL", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "UPDATE_SECTION_PREFS", "WEBEXT_CLICK", "WEBEXT_DISMISS"]) {
for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "AS_ROUTER_TELEMETRY_USER_EVENT", "BLOCK_URL", "BOOKMARK_URL", "COPY_DOWNLOAD_LINK", "DELETE_BOOKMARK_BY_ID", "DELETE_FROM_POCKET", "DELETE_HISTORY_URL", "DIALOG_CANCEL", "DIALOG_OPEN", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_LOADED_CONTENT", "DISCOVERY_STREAM_OPT_OUT", "DISCOVERY_STREAM_SPOCS_CAPS", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_SEARCH", "INIT", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_DOWNLOAD_FILE", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "OPEN_WEBEXT_SETTINGS", "PAGE_PRERENDERED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_CHANGED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PLACES_SAVED_TO_POCKET", "POCKET_CTA", "POCKET_LINK_DELETED_OR_ARCHIVED", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "PREVIEW_REQUEST", "PREVIEW_REQUEST_CANCEL", "PREVIEW_RESPONSE", "REMOVE_DOWNLOAD_FILE", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_MOVE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_DOWNLOAD_FILE", "SHOW_FIREFOX_ACCOUNTS", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "SNIPPETS_RESET", "SNIPPET_BLOCKED", "SUBMIT_EMAIL", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "UPDATE_SECTION_PREFS", "WEBEXT_CLICK", "WEBEXT_DISMISS"]) {
actionTypes[type] = type;
} // These are acceptable actions for AS Router messages to have. They can show up
// as call-to-action buttons in snippets, onboarding tour, etc.
@ -550,17 +550,16 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);
/* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);
/* harmony import */ var content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(27);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25);
/* harmony import */ var content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(52);
/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(51);
/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(34);
/* harmony import */ var content_src_components_ManualMigration_ManualMigration__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(44);
/* harmony import */ var common_PrerenderData_jsm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(45);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_10__);
/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(46);
/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(47);
/* harmony import */ var common_PrerenderData_jsm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(44);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_9__);
/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(45);
/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(46);
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -575,10 +574,9 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
const PrefsButton = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(props => react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("div", {
const PrefsButton = Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(props => react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("div", {
className: "prefs-button"
}, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("button", {
}, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("button", {
className: "icon icon-settings",
onClick: props.onClick,
title: props.intl.formatMessage({
@ -613,7 +611,7 @@ function debounce(func, wait) {
};
}
class _Base extends react__WEBPACK_IMPORTED_MODULE_10___default.a.PureComponent {
class _Base extends react__WEBPACK_IMPORTED_MODULE_9___default.a.PureComponent {
componentWillMount() {
const {
locale
@ -672,16 +670,16 @@ class _Base extends react__WEBPACK_IMPORTED_MODULE_10___default.a.PureComponent
return null;
}
return react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["IntlProvider"], {
return react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["IntlProvider"], {
locale: locale,
messages: strings
}, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"], {
}, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"], {
className: "base-content-fallback"
}, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_10___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(BaseContent, this.props), isDevtoolsEnabled ? react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__["ASRouterAdmin"], null) : null)));
}, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_9___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(BaseContent, this.props), isDevtoolsEnabled ? react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__["ASRouterAdmin"], null) : null)));
}
}
class BaseContent extends react__WEBPACK_IMPORTED_MODULE_10___default.a.PureComponent {
class BaseContent extends react__WEBPACK_IMPORTED_MODULE_9___default.a.PureComponent {
constructor(props) {
super(props);
this.openPreferences = this.openPreferences.bind(this);
@ -733,29 +731,27 @@ class BaseContent extends react__WEBPACK_IMPORTED_MODULE_10___default.a.PureComp
initialized
} = App;
const prefs = props.Prefs.values;
const shouldBeFixedToTop = common_PrerenderData_jsm__WEBPACK_IMPORTED_MODULE_9__["PrerenderData"].arePrefsValid(name => prefs[name]);
const shouldBeFixedToTop = common_PrerenderData_jsm__WEBPACK_IMPORTED_MODULE_8__["PrerenderData"].arePrefsValid(name => prefs[name]);
const noSectionsEnabled = !prefs["feeds.topsites"] && props.Sections.filter(section => section.enabled).length === 0;
const isDiscoveryStream = props.DiscoveryStream.config && props.DiscoveryStream.config.enabled;
const searchHandoffEnabled = prefs["improvesearch.handoffToAwesomebar"];
const outerClassName = ["outer-wrapper", isDiscoveryStream && "ds-outer-wrapper-search-alignment", isDiscoveryStream && "ds-outer-wrapper-breakpoint-override", shouldBeFixedToTop && "fixed-to-top", prefs.showSearch && this.state.fixedSearch && !noSectionsEnabled && "fixed-search", prefs.showSearch && noSectionsEnabled && "only-search"].filter(v => v).join(" ");
return react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("div", {
return react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("div", {
className: outerClassName
}, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("main", null, prefs.showSearch && react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("div", {
}, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("main", null, prefs.showSearch && react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("div", {
className: "non-collapsible-section"
}, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"], null, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_11__["Search"], _extends({
}, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"], null, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_10__["Search"], _extends({
showLogo: noSectionsEnabled,
handoffEnabled: searchHandoffEnabled
}, props.Search)))), react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("div", {
className: `body-wrapper${initialized ? " on" : ""}`
}, !isDiscoveryStream && !prefs.migrationExpired && react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement("div", {
className: "non-collapsible-section"
}, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ManualMigration_ManualMigration__WEBPACK_IMPORTED_MODULE_8__["ManualMigration"], null)), isDiscoveryStream ? react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"], {
className: "borderless-error"
}, react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__["DiscoveryStreamBase"], null)) : react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_12__["Sections"], null), react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(PrefsButton, {
onClick: this.openPreferences
})), react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_4__["ConfirmDialog"], null))), react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(_asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_3__["ASRouterUISurface"], {
}, props.Search)))), react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(_asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_3__["ASRouterUISurface"], {
dispatch: this.props.dispatch
}));
}), react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("div", {
className: `body-wrapper${initialized ? " on" : ""}`
}, isDiscoveryStream ? react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"], {
className: "borderless-error"
}, react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__["DiscoveryStreamBase"], null)) : react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_11__["Sections"], null), react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(PrefsButton, {
onClick: this.openPreferences
})), react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_4__["ConfirmDialog"], null))));
}
}
@ -780,19 +776,19 @@ module.exports = ReactIntl;
"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ToggleSpocButton", function() { return ToggleSpocButton; });
/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ToggleStoryButton", function() { return ToggleStoryButton; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DiscoveryStreamAdmin", function() { return DiscoveryStreamAdmin; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterAdminInner", function() { return ASRouterAdminInner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CollapseToggle", function() { return CollapseToggle; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterAdmin", function() { return ASRouterAdmin; });
/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(15);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _SimpleHashRouter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26);
/* harmony import */ var _SimpleHashRouter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(27);
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -833,14 +829,14 @@ const LAYOUT_VARIANTS = {
"dev-test-all": "A little bit of everything. Good layout for testing all components",
"dev-test-feeds": "Stress testing for slow feeds"
};
class ToggleSpocButton extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureComponent {
class ToggleStoryButton extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureComponent {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.props.onClick(this.props.spoc);
this.props.onClick(this.props.story);
}
render() {
@ -855,9 +851,9 @@ class DiscoveryStreamAdmin extends react__WEBPACK_IMPORTED_MODULE_4___default.a.
super(props);
this.onEnableToggle = this.onEnableToggle.bind(this);
this.changeEndpointVariant = this.changeEndpointVariant.bind(this);
this.onSpocToggle = this.onSpocToggle.bind(this);
this.onStoryToggle = this.onStoryToggle.bind(this);
this.state = {
toggledSpocs: {}
toggledStories: {}
};
}
@ -901,6 +897,21 @@ class DiscoveryStreamAdmin extends react__WEBPACK_IMPORTED_MODULE_4___default.a.
return isMatch;
}
renderFeedData(url) {
const {
feeds
} = this.props.state;
const feed = feeds.data[url].data;
return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_4___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h4", null, "Feed url: ", url), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("table", null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("tbody", null, feed.recommendations.map(story => this.renderStoryData(story)))));
}
renderFeedsData() {
const {
feeds
} = this.props.state;
return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_4___default.a.Fragment, null, Object.keys(feeds.data).map(url => this.renderFeedData(url)));
}
renderSpocs() {
const {
spocs
@ -915,38 +926,38 @@ class DiscoveryStreamAdmin extends react__WEBPACK_IMPORTED_MODULE_4___default.a.
className: "min"
}, "spocs_endpoint"), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("td", null, spocs.spocs_endpoint)), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(Row, null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("td", {
className: "min"
}, "Data last fetched"), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("td", null, relativeTime(spocs.lastUpdated))))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h4", null, "Spoc data"), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("table", null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("tbody", null, spocsData.map(spoc => this.renderSpocData(spoc)))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h4", null, "Spoc frequency caps"), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("table", null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("tbody", null, spocs.frequency_caps.map(spoc => this.renderSpocData(spoc)))));
}, "Data last fetched"), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("td", null, relativeTime(spocs.lastUpdated))))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h4", null, "Spoc data"), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("table", null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("tbody", null, spocsData.map(spoc => this.renderStoryData(spoc)))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h4", null, "Spoc frequency caps"), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("table", null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("tbody", null, spocs.frequency_caps.map(spoc => this.renderStoryData(spoc)))));
}
onSpocToggle(spoc) {
onStoryToggle(story) {
const {
toggledSpocs
toggledStories
} = this.state;
this.setState({
toggledSpocs: { ...toggledSpocs,
[spoc.id]: !toggledSpocs[spoc.id]
toggledStories: { ...toggledStories,
[story.id]: !toggledStories[story.id]
}
});
}
renderSpocData(spoc) {
let spocData = "";
renderStoryData(story) {
let storyData = "";
if (this.state.toggledSpocs[spoc.id]) {
spocData = JSON.stringify(spoc, null, 2);
if (this.state.toggledStories[story.id]) {
storyData = JSON.stringify(story, null, 2);
}
return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("tr", {
className: "message-item",
key: spoc.id
key: story.id
}, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("td", {
className: "message-id"
}, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", null, spoc.id, " ", react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("br", null)), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ToggleSpocButton, {
spoc: spoc,
onClick: this.onSpocToggle
}, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", null, story.id, " ", react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("br", null)), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ToggleStoryButton, {
story: story,
onClick: this.onStoryToggle
})), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("td", {
className: "message-summary"
}, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("pre", null, spocData)));
}, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("pre", null, storyData)));
}
renderFeed(feed) {
@ -1008,7 +1019,7 @@ class DiscoveryStreamAdmin extends react__WEBPACK_IMPORTED_MODULE_4___default.a.
}, row.components.map((component, componentIndex) => react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", {
key: `component-${componentIndex}`,
className: "ds-component"
}, this.renderComponent(row.width, component))))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h3", null, "Spocs"), this.renderSpocs());
}, this.renderComponent(row.width, component))))), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h3", null, "Feeds Data"), this.renderFeedsData(), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("h3", null, "Spocs"), this.renderSpocs());
}
}
@ -1693,12 +1704,18 @@ class CollapseToggle extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureCo
const {
renderAdmin
} = this;
const action = this.state.collapsed || !renderAdmin ? "Expand" : "Collapse";
const isCollapsed = this.state.collapsed || !renderAdmin;
const label = `${isCollapsed ? "Expand" : "Collapse"} devtools`;
return react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_4___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("a", {
href: "#devtools",
className: "asrouter-toggle",
title: label,
className: `asrouter-toggle ${isCollapsed ? "collapsed" : "expanded"}`,
onClick: this.renderAdmin ? this.onCollapseToggle : null
}, action, " Devtools"), renderAdmin ? react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ASRouterAdminInner, _extends({}, props, {
}, react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", {
className: "sr-only"
}, label), react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("span", {
className: "icon icon-devtools"
})), renderAdmin ? react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ASRouterAdminInner, _extends({}, props, {
collapsed: this.state.collapsed
})) : null);
}
@ -1728,14 +1745,16 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);
/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9);
/* harmony import */ var _components_ImpressionsWrapper_ImpressionsWrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10);
/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(55);
/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(54);
/* harmony import */ var content_src_lib_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(13);
/* harmony import */ var _templates_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(14);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__);
/* harmony import */ var _templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(16);
/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(53);
/* harmony import */ var _templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(24);
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(16);
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_9__);
/* harmony import */ var _templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(17);
/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(52);
/* harmony import */ var _templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(25);
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -1750,8 +1769,10 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
const INCOMING_MESSAGE_NAME = "ASRouter:parent-to-child";
const OUTGOING_MESSAGE_NAME = "ASRouter:child-to-parent";
const TEMPLATES_BELOW_SEARCH = ["simple_below_search_snippet"];
const ASRouterUtils = {
addListener(listener) {
if (global.RPMAddMessageListener) {
@ -1878,6 +1899,10 @@ class ASRouterUISurface extends react__WEBPACK_IMPORTED_MODULE_8___default.a.Pur
message: {},
bundle: {}
};
if (props.document) {
this.portalContainer = props.document.getElementById("footer-snippets-container");
}
}
sendUserActionTelemetry(extraProps = {}) {
@ -2069,7 +2094,7 @@ class ASRouterUISurface extends react__WEBPACK_IMPORTED_MODULE_8___default.a.Pur
return null;
}
const SnippetComponent = _templates_template_manifest__WEBPACK_IMPORTED_MODULE_10__["SnippetsTemplates"][this.state.message.template];
const SnippetComponent = _templates_template_manifest__WEBPACK_IMPORTED_MODULE_11__["SnippetsTemplates"][this.state.message.template];
const {
content
} = this.state.message;
@ -2115,7 +2140,7 @@ class ASRouterUISurface extends react__WEBPACK_IMPORTED_MODULE_8___default.a.Pur
return react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_0__["IntlProvider"], {
locale: global.document.documentElement.lang,
messages: global.gActivityStreamStrings
}, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(_templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_11__["StartupOverlay"], {
}, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(_templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_12__["StartupOverlay"], {
onReady: this.triggerOnboarding,
onBlock: this.onDismissById(message.id),
dispatch: this.props.dispatch
@ -2126,7 +2151,7 @@ class ASRouterUISurface extends react__WEBPACK_IMPORTED_MODULE_8___default.a.Pur
messages: Object(_rich_text_strings__WEBPACK_IMPORTED_MODULE_3__["generateMessages"])({
"amo_html": message.content.text
})
}, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(_templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_9__["ReturnToAMO"], _extends({}, message, {
}, react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(_templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_10__["ReturnToAMO"], _extends({}, message, {
onReady: this.triggerOnboarding,
onBlock: this.onDismissById(message.id),
onAction: ASRouterUtils.executeAction
@ -2158,7 +2183,13 @@ class ASRouterUISurface extends react__WEBPACK_IMPORTED_MODULE_8___default.a.Pur
return null;
}
return react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_8___default.a.Fragment, null, this.renderPreviewBanner(), this.renderFirstRunOverlay(), this.renderOnboarding(), this.renderSnippets());
const shouldRenderBelowSearch = TEMPLATES_BELOW_SEARCH.includes(message.template);
return shouldRenderBelowSearch ? // Render special below search snippets in place;
react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", {
className: "below-search-snippet"
}, this.renderSnippets()) : // For onboarding, regular snippets etc. we should render
// everything in our footer container.
react_dom__WEBPACK_IMPORTED_MODULE_9___default.a.createPortal(react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_8___default.a.Fragment, null, this.renderPreviewBanner(), this.renderFirstRunOverlay(), this.renderOnboarding(), this.renderSnippets()), this.portalContainer);
}
}
@ -2341,7 +2372,7 @@ module.exports = Redux;
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RICH_TEXT_KEYS", function() { return RICH_TEXT_KEYS; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generateMessages", function() { return generateMessages; });
/* harmony import */ var fluent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(54);
/* harmony import */ var fluent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(53);
/**
* Properties that allow rich text MUST be added to this list.
@ -2636,6 +2667,12 @@ class ModalOverlay extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComp
/***/ }),
/* 16 */
/***/ (function(module, exports) {
module.exports = ReactDOM;
/***/ }),
/* 17 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -2643,7 +2680,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReturnToAMO", function() { return ReturnToAMO; });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _components_RichText_RichText__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(17);
/* harmony import */ var _components_RichText_RichText__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(18);
class ReturnToAMO extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
@ -2709,18 +2746,18 @@ class ReturnToAMO extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureCompo
}
/***/ }),
/* 17 */
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertLinks", function() { return convertLinks; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RichText", function() { return RichText; });
/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55);
/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(54);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
/* harmony import */ var _template_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(18);
/* harmony import */ var _template_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19);
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -2779,7 +2816,7 @@ function RichText(props) {
}
/***/ }),
/* 18 */
/* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -2803,37 +2840,37 @@ function safeURI(url) {
}
/***/ }),
/* 19 */
/* 20 */
/***/ (function(module) {
module.exports = {"title":"EOYSnippet","description":"Fundraising Snippet","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"donation_form_url":{"type":"string","description":"Url to the donation form."},"currency_code":{"type":"string","description":"The code for the currency. Examle gbp, cad, usd.","default":"usd"},"locale":{"type":"string","description":"String for the locale code.","default":"en-US"},"text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"text_color":{"type":"string","description":"Modify the text message color"},"background_color":{"type":"string","description":"Snippet background color."},"highlight_color":{"type":"string","description":"Paragraph em highlight color."},"donation_amount_first":{"type":"number","description":"First button amount."},"donation_amount_second":{"type":"number","description":"Second button amount."},"donation_amount_third":{"type":"number","description":"Third button amount."},"donation_amount_fourth":{"type":"number","description":"Fourth button amount."},"selected_button":{"type":"string","description":"Default donation_amount_second. Donation amount button that's selected by default.","default":"donation_amount_second"},"icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Snippet title displayed before snippet text"}]},"title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}]},"button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"block_button_text":{"type":"string","description":"Tooltip text used for dismiss button."},"monthly_checkbox_label_text":{"type":"string","description":"Label text for monthly checkbox.","default":"Make my donation monthly"},"test":{"type":"string","description":"Different styles for the snippet. Options are bold and takeover."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked"},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."},"args":{"type":"string","description":"Additional parameters for link action, example which specific menu the button should open"}}}},"additionalProperties":false,"required":["text","donation_form_url","donation_amount_first","donation_amount_second","donation_amount_third","donation_amount_fourth","button_label","currency_code"],"dependencies":{"button_color":["button_label"],"button_background_color":["button_label"]}};
/***/ }),
/* 20 */
/* 21 */
/***/ (function(module) {
module.exports = {"title":"SimpleSnippet","description":"A simple template with an icon, text, and optional button.","version":"1.1.1","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Snippet title displayed before snippet text"}]},"text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"button_action":{"type":"string","description":"The type of action the button should trigger."},"button_url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"A url, button_label links to this"}]},"button_action_args":{"type":"string","description":"Additional parameters for button action, example which specific menu the button should open"},"button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}]},"button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"block_button_text":{"type":"string","description":"Tooltip text used for dismiss button.","default":"Remove this"},"tall":{"type":"boolean","description":"To be used by fundraising only, increases height to roughly 120px. Defaults to false."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked"},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."},"args":{"type":"string","description":"Additional parameters for link action, example which specific menu the button should open"}}},"section_title_icon":{"type":"string","description":"Section title icon. 16x16px. SVG or PNG preferred. section_title_text must also be specified to display."},"section_title_text":{"type":"string","description":"Section title text. section_title_icon must also be specified to display."},"section_title_url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"A url, section_title_text links to this"}]}},"additionalProperties":false,"required":["text"],"dependencies":{"button_action":["button_label"],"button_url":["button_label"],"button_color":["button_label"],"button_background_color":["button_label"],"section_title_url":["section_title_text"]}};
/***/ }),
/* 21 */
/* 22 */
/***/ (function(module) {
module.exports = {"title":"FXASignupSnippet","description":"A snippet template for FxA sign up/sign in","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"scene1_title":{"allof":[{"$ref":"#/definitions/plainText"},{"description":"snippet title displayed before snippet text"}]},"scene1_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene2_title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Title displayed before text in scene 2. Should be plain text."}]},"scene2_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene1_icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"scene1_title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"scene2_email_placeholder_text":{"type":"string","description":"Value to show while input is empty.","default":"Your email here"},"scene2_button_label":{"type":"string","description":"Label for form submit button","default":"Sign me up"},"scene2_dismiss_button_text":{"type":"string","description":"Label for the dismiss button when the sign-up form is expanded.","default":"Dismiss"},"hidden_inputs":{"type":"object","description":"Each entry represents a hidden input, key is used as value for the name property.","properties":{"action":{"type":"string","enum":["email"]},"context":{"type":"string","enum":["fx_desktop_v3"]},"entrypoint":{"type":"string","enum":["snippets"]},"service":{"type":"string","enum":["sync"]},"utm_content":{"type":"number","description":"Firefox version number"},"utm_source":{"type":"string","enum":["snippet"]},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"additionalProperties":false}},"scene1_button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}],"default":"Learn more"},"scene1_button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"scene1_button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked","default":false},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."}}}},"additionalProperties":false,"required":["scene1_text","scene2_text","scene1_button_label"],"dependencies":{"scene1_button_color":["scene1_button_label"],"scene1_button_background_color":["scene1_button_label"]}};
/***/ }),
/* 22 */
/* 23 */
/***/ (function(module) {
module.exports = {"title":"NewsletterSnippet","description":"A snippet template for send to device mobile download","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"locale":{"type":"string","description":"Two to five character string for the locale code","default":"en-US"},"scene1_title":{"allof":[{"$ref":"#/definitions/plainText"},{"description":"snippet title displayed before snippet text"}]},"scene1_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene2_title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Title displayed before text in scene 2. Should be plain text."}]},"scene2_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene1_icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"scene1_title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"scene2_email_placeholder_text":{"type":"string","description":"Value to show while input is empty.","default":"Your email here"},"scene2_button_label":{"type":"string","description":"Label for form submit button","default":"Sign me up"},"scene2_privacy_html":{"type":"string","description":"(send to device) Html for disclaimer and link underneath input box."},"scene2_dismiss_button_text":{"type":"string","description":"Label for the dismiss button when the sign-up form is expanded.","default":"Dismiss"},"hidden_inputs":{"type":"object","description":"Each entry represents a hidden input, key is used as value for the name property.","properties":{"fmt":{"type":"string","description":"","default":"H"}}},"scene1_button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}],"default":"Learn more"},"scene1_button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"scene1_button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked","default":false},"success_text":{"type":"string","description":"Message shown on successful registration."},"error_text":{"type":"string","description":"Message shown if registration failed."},"scene2_newsletter":{"type":"string","description":"Newsletter/basket id user is subscribing to.","default":"mozilla-foundation"},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."}}}},"additionalProperties":false,"required":["scene1_text","scene2_text","scene1_button_label"],"dependencies":{"scene1_button_color":["scene1_button_label"],"scene1_button_background_color":["scene1_button_label"]}};
/***/ }),
/* 23 */
/* 24 */
/***/ (function(module) {
module.exports = {"title":"SendToDeviceSnippet","description":"A snippet template for send to device mobile download","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"locale":{"type":"string","description":"Two to five character string for the locale code","default":"en-US"},"country":{"type":"string","description":"Two character string for the country code (used for SMS)","default":"us"},"scene1_title":{"allof":[{"$ref":"#/definitions/plainText"},{"description":"snippet title displayed before snippet text"}]},"scene1_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene2_title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Title displayed before text in scene 2. Should be plain text."}]},"scene2_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene1_icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"scene2_icon":{"type":"string","description":"(send to device) Image to display above the form. 98x98px. SVG or PNG preferred."},"scene1_title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"scene2_button_label":{"type":"string","description":"Label for form submit button","default":"Send"},"scene2_input_placeholder":{"type":"string","description":"(send to device) Value to show while input is empty.","default":"Your email here"},"scene2_disclaimer_html":{"type":"string","description":"(send to device) Html for disclaimer and link underneath input box."},"scene2_dismiss_button_text":{"type":"string","description":"Label for the dismiss button when the sign-up form is expanded.","default":"Dismiss"},"hidden_inputs":{"type":"object","description":"Each entry represents a hidden input, key is used as value for the name property.","properties":{"action":{"type":"string","enum":["email"]},"context":{"type":"string","enum":["fx_desktop_v3"]},"entrypoint":{"type":"string","enum":["snippets"]},"service":{"type":"string","enum":["sync"]},"utm_content":{"type":"string","description":"Firefox version number"},"utm_source":{"type":"string","enum":["snippet"]},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"additionalProperties":false}},"scene1_button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}],"default":"Learn more"},"scene1_button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"scene1_button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked","default":false},"success_title":{"type":"string","description":"(send to device) Title shown before text on successful registration."},"success_text":{"type":"string","description":"Message shown on successful registration."},"error_text":{"type":"string","description":"Message shown if registration failed."},"include_sms":{"type":"boolean","description":"(send to device) Allow users to send an SMS message with the form?","default":false},"message_id_sms":{"type":"string","description":"(send to device) Newsletter/basket id representing the SMS message to be sent."},"message_id_email":{"type":"string","description":"(send to device) Newsletter/basket id representing the email message to be sent. Must be a value from the 'Slug' column here: https://basket.mozilla.org/news/."},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."}}}},"additionalProperties":false,"required":["scene1_text","scene2_text","scene1_button_label"],"dependencies":{"scene1_button_color":["scene1_button_label"],"scene1_button_background_color":["scene1_button_label"]}};
/***/ }),
/* 24 */
/* 25 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -2843,7 +2880,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
@ -3124,13 +3161,13 @@ const getState = state => ({
const StartupOverlay = Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(getState)(Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(_StartupOverlay));
/***/ }),
/* 25 */
/* 26 */
/***/ (function(module, exports) {
module.exports = ReactRedux;
/***/ }),
/* 26 */
/* 27 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -3176,7 +3213,7 @@ class SimpleHashRouter extends react__WEBPACK_IMPORTED_MODULE_0___default.a.Pure
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
/***/ }),
/* 27 */
/* 28 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -3184,7 +3221,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ConfirmDialog", function() { return _ConfirmDialog; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConfirmDialog", function() { return ConfirmDialog; });
/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
@ -3282,12 +3319,6 @@ class _ConfirmDialog extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureCo
}
const ConfirmDialog = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])(state => state.Dialog)(_ConfirmDialog);
/***/ }),
/* 28 */
/***/ (function(module, exports) {
module.exports = ReactDOM;
/***/ }),
/* 29 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
@ -3297,7 +3328,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_LinkMenu", function() { return _LinkMenu; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LinkMenu", function() { return LinkMenu; });
/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var content_src_components_ContextMenu_ContextMenu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(30);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);
@ -4633,15 +4664,15 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(38);
/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(33);
/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(39);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var _SearchShortcutsForm__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(41);
/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(56);
/* harmony import */ var _TopSiteForm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(58);
/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(55);
/* harmony import */ var _TopSiteForm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(57);
/* harmony import */ var _TopSite__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(42);
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -5397,7 +5428,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(43);
/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(56);
/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(55);
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -6105,83 +6136,6 @@ const ScreenshotUtils = {
/* 44 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ManualMigration", function() { return _ManualMigration; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ManualMigration", function() { return ManualMigration; });
/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
/**
* Manual migration component used to start the profile import wizard.
* Message is presented temporarily and will go away if:
* 1. User clicks "No Thanks"
* 2. User completed the data import
* 3. After 3 active days
* 4. User clicks "Cancel" on the import wizard (currently not implemented).
*/
class _ManualMigration extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
constructor(props) {
super(props);
this.onLaunchTour = this.onLaunchTour.bind(this);
this.onCancelTour = this.onCancelTour.bind(this);
}
onLaunchTour() {
this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].MIGRATION_START
}));
this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
event: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].MIGRATION_START
}));
}
onCancelTour() {
this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].MIGRATION_CANCEL
}));
this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
event: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].MIGRATION_CANCEL
}));
}
render() {
return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
className: "manual-migration-container"
}, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("p", null, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("span", {
className: "icon icon-import"
}), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
id: "manual_migration_explanation2"
})), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", {
className: "manual-migration-actions actions"
}, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
className: "dismiss",
onClick: this.onCancelTour
}, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
id: "manual_migration_cancel_button"
})), react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("button", {
onClick: this.onLaunchTour
}, react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_2__["FormattedMessage"], {
id: "manual_migration_import_button"
}))));
}
}
const ManualMigration = Object(react_redux__WEBPACK_IMPORTED_MODULE_1__["connect"])()(_ManualMigration);
/***/ }),
/* 45 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_PrerenderData", function() { return _PrerenderData; });
@ -6264,7 +6218,6 @@ class _PrerenderData {
}
var PrerenderData = new _PrerenderData({
initialPrefs: {
"migrationExpired": true,
"feeds.topsites": true,
"showSearch": true,
"topSitesRows": 1,
@ -6318,7 +6271,7 @@ var PrerenderData = new _PrerenderData({
});
/***/ }),
/* 46 */
/* 45 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -6328,7 +6281,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var content_src_lib_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(13);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(11);
@ -6526,7 +6479,7 @@ class _Search extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureComponent
const Search = Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])()(Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(_Search));
/***/ }),
/* 47 */
/* 46 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -6536,18 +6489,18 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Sections", function() { return _Sections; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Sections", function() { return Sections; });
/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var content_src_components_Card_Card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(57);
/* harmony import */ var content_src_components_Card_Card__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var content_src_components_CollapsibleSection_CollapsibleSection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(33);
/* harmony import */ var content_src_components_ComponentPerfTimer_ComponentPerfTimer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(39);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var content_src_components_MoreRecommendations_MoreRecommendations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(48);
/* harmony import */ var content_src_components_PocketLoggedInCta_PocketLoggedInCta__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(49);
/* harmony import */ var content_src_components_MoreRecommendations_MoreRecommendations__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(47);
/* harmony import */ var content_src_components_PocketLoggedInCta_PocketLoggedInCta__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(48);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(11);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__);
/* harmony import */ var content_src_components_Topics_Topics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(50);
/* harmony import */ var content_src_components_Topics_Topics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(49);
/* harmony import */ var content_src_components_TopSites_TopSites__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(37);
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -6897,7 +6850,7 @@ const Sections = Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(sta
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
/***/ }),
/* 48 */
/* 47 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -6930,14 +6883,14 @@ class MoreRecommendations extends react__WEBPACK_IMPORTED_MODULE_1___default.a.P
}
/***/ }),
/* 49 */
/* 48 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_PocketLoggedInCta", function() { return _PocketLoggedInCta; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PocketLoggedInCta", function() { return PocketLoggedInCta; });
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26);
/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
@ -6973,7 +6926,7 @@ const PocketLoggedInCta = Object(react_redux__WEBPACK_IMPORTED_MODULE_0__["conne
}))(_PocketLoggedInCta);
/***/ }),
/* 50 */
/* 49 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -7018,7 +6971,7 @@ class Topics extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent
}
/***/ }),
/* 51 */
/* 50 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -7097,7 +7050,7 @@ class DetectUserSessionStart {
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
/***/ }),
/* 52 */
/* 51 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -7111,7 +7064,7 @@ var external_React_ = __webpack_require__(11);
var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
// EXTERNAL MODULE: external "ReactDOM"
var external_ReactDOM_ = __webpack_require__(28);
var external_ReactDOM_ = __webpack_require__(16);
var external_ReactDOM_default = /*#__PURE__*/__webpack_require__.n(external_ReactDOM_);
// CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSImage/DSImage.jsx
@ -7558,7 +7511,7 @@ CardGrid_CardGrid.defaultProps = {
var CollapsibleSection = __webpack_require__(33);
// EXTERNAL MODULE: external "ReactRedux"
var external_ReactRedux_ = __webpack_require__(25);
var external_ReactRedux_ = __webpack_require__(26);
// CONCATENATED MODULE: ./content-src/components/DiscoveryStreamComponents/DSMessage/DSMessage.jsx
@ -8344,7 +8297,7 @@ const DiscoveryStreamBase = Object(external_ReactRedux_["connect"])(state => ({
}))(DiscoveryStreamBase_DiscoveryStreamBase);
/***/ }),
/* 53 */
/* 52 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -8355,7 +8308,7 @@ var external_React_ = __webpack_require__(11);
var external_React_default = /*#__PURE__*/__webpack_require__.n(external_React_);
// EXTERNAL MODULE: ./content-src/asrouter/templates/EOYSnippet/EOYSnippet.schema.json
var EOYSnippet_schema = __webpack_require__(19);
var EOYSnippet_schema = __webpack_require__(20);
// CONCATENATED MODULE: ./content-src/asrouter/components/Button/Button.jsx
@ -8388,13 +8341,13 @@ const ConditionalWrapper = ({
children
}) => condition ? wrap(children) : children;
// EXTERNAL MODULE: ./content-src/asrouter/components/RichText/RichText.jsx
var RichText = __webpack_require__(17);
var RichText = __webpack_require__(18);
// EXTERNAL MODULE: ./content-src/asrouter/template-utils.js
var template_utils = __webpack_require__(18);
var template_utils = __webpack_require__(19);
// EXTERNAL MODULE: ./content-src/asrouter/templates/SimpleSnippet/SimpleSnippet.schema.json
var SimpleSnippet_schema = __webpack_require__(20);
var SimpleSnippet_schema = __webpack_require__(21);
// CONCATENATED MODULE: ./content-src/asrouter/components/SnippetBase/SnippetBase.jsx
@ -8404,6 +8357,42 @@ class SnippetBase_SnippetBase extends external_React_default.a.PureComponent {
super(props);
this.onBlockClicked = this.onBlockClicked.bind(this);
this.onDismissClicked = this.onDismissClicked.bind(this);
this.setBlockButtonRef = this.setBlockButtonRef.bind(this);
this.onBlockButtonMouseEnter = this.onBlockButtonMouseEnter.bind(this);
this.onBlockButtonMouseLeave = this.onBlockButtonMouseLeave.bind(this);
this.state = {
blockButtonHover: false
};
}
componentDidMount() {
if (this.blockButtonRef) {
this.blockButtonRef.addEventListener("mouseenter", this.onBlockButtonMouseEnter);
this.blockButtonRef.addEventListener("mouseleave", this.onBlockButtonMouseLeave);
}
}
componentWillUnmount() {
if (this.blockButtonRef) {
this.blockButtonRef.removeEventListener("mouseenter", this.onBlockButtonMouseEnter);
this.blockButtonRef.removeEventListener("mouseleave", this.onBlockButtonMouseLeave);
}
}
setBlockButtonRef(element) {
this.blockButtonRef = element;
}
onBlockButtonMouseEnter() {
this.setState({
blockButtonHover: true
});
}
onBlockButtonMouseLeave() {
this.setState({
blockButtonHover: false
});
}
onBlockClicked() {
@ -8444,7 +8433,8 @@ class SnippetBase_SnippetBase extends external_React_default.a.PureComponent {
return external_React_default.a.createElement("button", {
className: "blockButton",
title: this.props.content.block_button_text || defaultTitle,
onClick: this.onBlockClicked
onClick: this.onBlockClicked,
ref: this.setBlockButtonRef
});
}
@ -8452,7 +8442,10 @@ class SnippetBase_SnippetBase extends external_React_default.a.PureComponent {
const {
props
} = this;
const containerClassName = `SnippetBaseContainer${props.className ? ` ${props.className}` : ""}`;
const {
blockButtonHover
} = this.state;
const containerClassName = `SnippetBaseContainer${props.className ? ` ${props.className}` : ""}${blockButtonHover ? " active" : ""}`;
return external_React_default.a.createElement("div", {
className: containerClassName,
style: this.props.textStyle
@ -8777,7 +8770,7 @@ const EOYSnippet = props => {
}));
};
// EXTERNAL MODULE: ./content-src/asrouter/templates/FXASignupSnippet/FXASignupSnippet.schema.json
var FXASignupSnippet_schema = __webpack_require__(21);
var FXASignupSnippet_schema = __webpack_require__(22);
// CONCATENATED MODULE: ./content-src/asrouter/templates/SubmitFormSnippet/SubmitFormSnippet.jsx
function SubmitFormSnippet_extends() { SubmitFormSnippet_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return SubmitFormSnippet_extends.apply(this, arguments); }
@ -9111,7 +9104,7 @@ const FXASignupSnippet = props => {
}));
};
// EXTERNAL MODULE: ./content-src/asrouter/templates/NewsletterSnippet/NewsletterSnippet.schema.json
var NewsletterSnippet_schema = __webpack_require__(22);
var NewsletterSnippet_schema = __webpack_require__(23);
// CONCATENATED MODULE: ./content-src/asrouter/templates/NewsletterSnippet/NewsletterSnippet.jsx
function NewsletterSnippet_extends() { NewsletterSnippet_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return NewsletterSnippet_extends.apply(this, arguments); }
@ -9184,7 +9177,7 @@ function isEmailOrPhoneNumber(val, content) {
return "";
}
// EXTERNAL MODULE: ./content-src/asrouter/templates/SendToDeviceSnippet/SendToDeviceSnippet.schema.json
var SendToDeviceSnippet_schema = __webpack_require__(23);
var SendToDeviceSnippet_schema = __webpack_require__(24);
// CONCATENATED MODULE: ./content-src/asrouter/templates/SendToDeviceSnippet/SendToDeviceSnippet.jsx
function SendToDeviceSnippet_extends() { SendToDeviceSnippet_extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return SendToDeviceSnippet_extends.apply(this, arguments); }
@ -9315,7 +9308,7 @@ const SnippetsTemplates = {
};
/***/ }),
/* 54 */
/* 53 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -11518,7 +11511,7 @@ function ftl(strings) {
/***/ }),
/* 55 */
/* 54 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -11532,7 +11525,7 @@ var external_PropTypes_ = __webpack_require__(12);
var external_PropTypes_default = /*#__PURE__*/__webpack_require__.n(external_PropTypes_);
// EXTERNAL MODULE: ./node_modules/fluent/src/index.js + 8 modules
var src = __webpack_require__(54);
var src = __webpack_require__(53);
// CONCATENATED MODULE: ./node_modules/fluent-react/src/localization.js
@ -12046,7 +12039,7 @@ localized_Localized.propTypes = {
/***/ }),
/* 56 */
/* 55 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -12890,7 +12883,7 @@ var reducers = {
};
/***/ }),
/* 57 */
/* 56 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -12930,7 +12923,7 @@ const cardContextTypes = {
}
};
// EXTERNAL MODULE: external "ReactRedux"
var external_ReactRedux_ = __webpack_require__(25);
var external_ReactRedux_ = __webpack_require__(26);
// EXTERNAL MODULE: ./content-src/lib/link-menu-options.js
var link_menu_options = __webpack_require__(31);
@ -13282,7 +13275,7 @@ const PlaceholderCard = props => external_React_default.a.createElement(Card, {
});
/***/ }),
/* 58 */
/* 57 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";

Просмотреть файл

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g fill="context-fill"><path d="M13.374 1H4.623A2.83 2.83 0 0 0 2 4v4h2V4a.928.928 0 0 1 .833-1h8.333A.928.928 0 0 1 14 4v8a.928.928 0 0 1-.833 1H4.833A.928.928 0 0 1 4 12v-1H2v1a2.833 2.833 0 0 0 2.627 3h9.623A1.888 1.888 0 0 0 16 13V4a2.833 2.833 0 0 0-2.626-3z"/><path d="M7.146 11.146a.5.5 0 1 0 .707.707l2-2a.5.5 0 0 0 0-.707l-2-2a.5.5 0 0 0-.707.707L8.293 9H1.5a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 0-1 0v2A1.5 1.5 0 0 0 1.5 10h6.793z"/></g></svg>

До

Ширина:  |  Высота:  |  Размер: 505 B

Просмотреть файл

@ -15,7 +15,6 @@ ChromeUtils.defineModuleGetter(this, "UpdateUtils",
const {actionCreators: ac, actionTypes: at} = ChromeUtils.import("resource://activity-stream/common/Actions.jsm");
const {AboutPreferences} = ChromeUtils.import("resource://activity-stream/lib/AboutPreferences.jsm");
const {DefaultPrefs} = ChromeUtils.import("resource://activity-stream/lib/ActivityStreamPrefs.jsm");
const {ManualMigration} = ChromeUtils.import("resource://activity-stream/lib/ManualMigration.jsm");
const {NewTabInit} = ChromeUtils.import("resource://activity-stream/lib/NewTabInit.jsm");
const {SectionsFeed} = ChromeUtils.import("resource://activity-stream/lib/SectionsManager.jsm");
const {PlacesFeed} = ChromeUtils.import("resource://activity-stream/lib/PlacesFeed.jsm");
@ -93,18 +92,6 @@ const PREFS_CONFIG = new Map([
title: "Remove adult pages from sites, highlights, etc.",
value: true,
}],
["migrationExpired", {
title: "Boolean flag that decides whether to show the migration message or not.",
value: false,
}],
["migrationLastShownDate", {
title: "Timestamp when migration message was last shown. In seconds.",
value: 0,
}],
["migrationRemainingDays", {
title: "Number of days to show the manual migration message",
value: 4,
}],
["prerender", {
title: "Use the prerendered version of activity-stream.html. This is set automatically by PrefsFeed.jsm.",
value: true,
@ -248,7 +235,7 @@ const PREFS_CONFIG = new Map([
collapsible: true,
enabled: isEnabled,
show_spocs: showSpocs({geo}),
hardcoded_layout: false,
hardcoded_layout: true,
personalized: false,
// This is currently an exmple layout used for dev purposes.
layout_endpoint: "https://getpocket.cdn.mozilla.net/v3/newtab/layout?version=1&consumer_key=$apiKey&layout_variant=basic",
@ -283,12 +270,6 @@ const FEEDS_DATA = [
title: "about:preferences rendering",
value: true,
},
{
name: "migration",
factory: () => new ManualMigration(),
title: "Manual migration wizard",
value: true,
},
{
name: "newtabinit",
factory: () => new NewTabInit(),

Просмотреть файл

@ -413,8 +413,17 @@ this.DiscoveryStreamFeed = class DiscoveryStreamFeed {
}
}
scoreItems(item) {
scoreItems(items) {
return items.map(item => this.scoreItem(item))
// Remove spocs that are scored too low.
.filter(s => s.score >= s.min_score)
// Sort by highest scores.
.sort((a, b) => b.score - a.score);
}
scoreItem(item) {
item.score = item.item_score;
item.min_score = item.min_score || 0;
if (item.score !== 0 && !item.score) {
item.score = 1;
}
@ -445,14 +454,9 @@ this.DiscoveryStreamFeed = class DiscoveryStreamFeed {
const campaignMap = {};
return {
...data,
spocs: data.spocs
// This order of operations is intended.
// scoreItems must be first because it creates this.score.
.map(item => this.scoreItems(item))
// Remove spocs that are scored too low.
.filter(s => s.score >= s.min_score)
// Sort by highest scores.
.sort((a, b) => b.score - a.score)
// This order of operations is intended.
// scoreItems must be first because it creates this.score.
spocs: this.scoreItems(data.spocs)
// This removes campaign dupes.
// We do this only after scoring and sorting because that way
// we can keep the first item we see, and end up keeping the highest scored.
@ -541,10 +545,16 @@ this.DiscoveryStreamFeed = class DiscoveryStreamFeed {
if (this.isExpired({cachedData, key: "feed", url: feedUrl, isStartup})) {
const feedResponse = await this.fetchFromEndpoint(feedUrl);
if (feedResponse) {
const scoredItems = this.scoreItems(feedResponse.recommendations);
const {recsExpireTime} = feedResponse.settings;
const recommendations = this.rotate(scoredItems, recsExpireTime);
this.componentFeedFetched = true;
feed = {
lastUpdated: Date.now(),
data: this.rotate(feedResponse),
data: {
...feedResponse,
recommendations,
},
};
} else {
Cu.reportError("No response for feed");
@ -600,10 +610,8 @@ this.DiscoveryStreamFeed = class DiscoveryStreamFeed {
// We have to rotate stories on the client so that
// active stories are at the front of the list, followed by stories that have expired
// impressions i.e. have been displayed for longer than recsExpireTime.
rotate(feedResponse) {
const {recommendations} = feedResponse;
const maxImpressionAge = Math.max(feedResponse.settings.recsExpireTime * 1000 || DEFAULT_RECS_EXPIRE_TIME, DEFAULT_RECS_EXPIRE_TIME);
rotate(recommendations, recsExpireTime) {
const maxImpressionAge = Math.max(recsExpireTime * 1000 || DEFAULT_RECS_EXPIRE_TIME, DEFAULT_RECS_EXPIRE_TIME);
const impressions = this.readImpressionsPref(PREF_REC_IMPRESSIONS);
const expired = [];
const active = [];
@ -614,7 +622,7 @@ this.DiscoveryStreamFeed = class DiscoveryStreamFeed {
active.push(item);
}
}
return {...feedResponse, recommendations: active.concat(expired)};
return active.concat(expired);
}
/**
@ -856,7 +864,9 @@ this.DiscoveryStreamFeed = class DiscoveryStreamFeed {
// store if the SPOCs are changed.
const {spocs} = this.store.getState().DiscoveryStream;
const newSpocs = this.frequencyCapSpocs(spocs.data);
if (spocs.data.spocs.length !== newSpocs.spocs.length) {
const prevSpocs = spocs.data.spocs || [];
const currentSpocs = newSpocs.spocs || [];
if (prevSpocs.length !== currentSpocs.length) {
this.store.dispatch(ac.AlsoToPreloaded({
type: at.DISCOVERY_STREAM_SPOCS_UPDATE,
data: {
@ -930,38 +940,12 @@ defaultLayoutResp = {
],
},
{
"width": 8,
"components": [
{
"type": "List",
"header": {
"title": "",
},
"feed": {
"embed_reference": null,
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?version=3&consumer_key=$apiKey&locale_lang=en-US",
},
"properties": {
"items": 8,
"has_numbers": false,
"has_images": true,
"border": "no-border",
},
"styles": {
".ds-list": "margin-right: -12px",
},
},
],
},
{
"width": 4,
"width": 12,
"components": [
{
"type": "CardGrid",
"properties": {
"items": 1,
"border": "no-border",
"offset": 8,
"items": 4,
},
"header": {
"title": "",
@ -970,15 +954,11 @@ defaultLayoutResp = {
"embed_reference": null,
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?version=3&consumer_key=$apiKey&locale_lang=en-US",
},
"styles": {
".ds-card": "margin-left: -12px;",
".ds-card .meta .excerpt": "max-height: 100px;",
},
"spocs": {
"probability": 1,
"positions": [
{
"index": 0,
"index": 3,
},
],
},
@ -989,7 +969,7 @@ defaultLayoutResp = {
"width": 12,
"components": [
{
"type": "List",
"type": "CardGrid",
"header": {
"title": "Health & Fitness 💪",
},
@ -998,7 +978,7 @@ defaultLayoutResp = {
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=4&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
},
"properties": {
"items": 6,
"items": 4,
"has_numbers": false,
"has_images": true,
"border": "no-border",
@ -1007,7 +987,7 @@ defaultLayoutResp = {
"probability": 1,
"positions": [
{
"index": 5,
"index": 3,
},
],
},
@ -1018,7 +998,7 @@ defaultLayoutResp = {
"width": 12,
"components": [
{
"type": "List",
"type": "CardGrid",
"header": {
"title": "Tech 🖥",
},
@ -1027,7 +1007,7 @@ defaultLayoutResp = {
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=5&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
},
"properties": {
"items": 6,
"items": 4,
"has_numbers": false,
"has_images": true,
"border": "no-border",
@ -1039,7 +1019,7 @@ defaultLayoutResp = {
"width": 12,
"components": [
{
"type": "List",
"type": "CardGrid",
"header": {
"title": "Entertainment 🍿",
},
@ -1048,7 +1028,7 @@ defaultLayoutResp = {
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=8&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
},
"properties": {
"items": 6,
"items": 4,
"has_numbers": false,
"has_images": true,
"border": "no-border",
@ -1057,7 +1037,7 @@ defaultLayoutResp = {
"probability": 1,
"positions": [
{
"index": 5,
"index": 3,
},
],
},
@ -1068,7 +1048,7 @@ defaultLayoutResp = {
"width": 12,
"components": [
{
"type": "List",
"type": "CardGrid",
"header": {
"title": "Personal Finance 💰",
},
@ -1077,7 +1057,7 @@ defaultLayoutResp = {
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=2&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
},
"properties": {
"items": 6,
"items": 4,
"has_numbers": false,
"has_images": true,
"border": "no-border",
@ -1089,7 +1069,7 @@ defaultLayoutResp = {
"width": 12,
"components": [
{
"type": "List",
"type": "CardGrid",
"header": {
"title": "Business 💼",
},
@ -1098,7 +1078,7 @@ defaultLayoutResp = {
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=1&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
},
"properties": {
"items": 6,
"items": 4,
"has_numbers": false,
"has_images": true,
"border": "no-border",
@ -1110,7 +1090,7 @@ defaultLayoutResp = {
"width": 12,
"components": [
{
"type": "List",
"type": "CardGrid",
"header": {
"title": "Science 🔬",
},
@ -1119,7 +1099,7 @@ defaultLayoutResp = {
"url": "https://getpocket.cdn.mozilla.net/v3/firefox/global-recs?topic_id=7&duration=2592000&end_time_offset=172800&version=3&consumer_key=$apiKey&locale_lang=en-US&feed_variant=OptimalCuratedLinksForLocaleFeed&model_id=external_time_live",
},
"properties": {
"items": 6,
"items": 4,
"has_numbers": false,
"has_images": true,
"border": "no-border",
@ -1128,7 +1108,7 @@ defaultLayoutResp = {
"probability": 1,
"positions": [
{
"index": 5,
"index": 3,
},
],
},

Просмотреть файл

@ -245,7 +245,6 @@ this.HighlightsFeed = class HighlightsFeed {
this.fetchHighlights({broadcast: true});
}
break;
case at.MIGRATION_COMPLETED:
case at.PLACES_HISTORY_CLEARED:
case at.PLACES_LINK_BLOCKED:
case at.DOWNLOAD_CHANGED:

Просмотреть файл

@ -1,114 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
"use strict";
const {actionCreators: ac, actionTypes: at} = ChromeUtils.import("resource://activity-stream/common/Actions.jsm");
const MIGRATION_ENDED_EVENT = "Migration:Ended";
const MS_PER_DAY = 86400000;
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
ChromeUtils.defineModuleGetter(this, "MigrationUtils", "resource:///modules/MigrationUtils.jsm");
ChromeUtils.defineModuleGetter(this, "ProfileAge", "resource://gre/modules/ProfileAge.jsm");
this.ManualMigration = class ManualMigration {
constructor() {
Services.obs.addObserver(this, MIGRATION_ENDED_EVENT);
}
get migrationLastShownDate() {
return this.store.getState().Prefs.values.migrationLastShownDate;
}
set migrationLastShownDate(newDate) {
this.store.dispatch(ac.SetPref("migrationLastShownDate", newDate));
}
get migrationRemainingDays() {
return this.store.getState().Prefs.values.migrationRemainingDays;
}
set migrationRemainingDays(newDate) {
this.store.dispatch(ac.SetPref("migrationRemainingDays", newDate));
}
uninit() {
Services.obs.removeObserver(this, MIGRATION_ENDED_EVENT);
}
async isMigrationMessageExpired() {
let profileAge = await ProfileAge();
let profileCreationDate = await profileAge.created;
let daysSinceProfileCreation = (Date.now() - profileCreationDate) / MS_PER_DAY;
// We don't want to show the migration message to profiles older than 3 days.
if (daysSinceProfileCreation > 3) {
return true;
}
let migrationLastShownDate = new Date(this.migrationLastShownDate * 1000);
let today = new Date();
// Round down to midnight.
today = new Date(today.getFullYear(), today.getMonth(), today.getDate());
if (migrationLastShownDate < today) {
let migrationRemainingDays = this.migrationRemainingDays - 1;
this.migrationRemainingDays = migrationRemainingDays;
// .valueOf returns a value that is too large to store so we need to divide by 1000.
this.migrationLastShownDate = today.valueOf() / 1000;
if (migrationRemainingDays <= 0) {
return true;
}
}
return false;
}
/**
* While alreadyExpired is false the migration message is displayed and we also
* keep checking if we should expire it. Broadcast expiration to store.
*
* @param {bool} alreadyExpired Pref flag that is false for the first 3 active days,
* time in which we display the migration message to the user.
*/
async expireIfNecessary(alreadyExpired) {
if (!alreadyExpired && await this.isMigrationMessageExpired()) {
this.expireMigration();
}
}
expireMigration() {
this.store.dispatch(ac.SetPref("migrationExpired", true));
}
/**
* Event listener for migration wizard completion event.
*/
observe() {
this.expireMigration();
this.store.dispatch({type: at.MIGRATION_COMPLETED});
}
async onAction(action) {
switch (action.type) {
case at.PREFS_INITIAL_VALUES:
await this.expireIfNecessary(action.data.migrationExpired);
break;
case at.MIGRATION_START:
MigrationUtils.showMigrationWizard(action._target.browser.ownerGlobal, [MigrationUtils.MIGRATION_ENTRYPOINT_NEWTAB]);
break;
case at.MIGRATION_CANCEL:
this.expireMigration();
break;
case at.UNINIT:
this.uninit();
break;
}
}
};
const EXPORTED_SYMBOLS = ["ManualMigration"];

Просмотреть файл

@ -650,7 +650,6 @@ this.TopSitesFeed = class TopSitesFeed {
this.refresh({broadcast: false});
break;
// All these actions mean we need new top sites
case at.MIGRATION_COMPLETED:
case at.PLACES_HISTORY_CLEARED:
case at.PLACES_LINK_DELETED:
this.frecentCache.expire();

Просмотреть файл

@ -93,6 +93,8 @@ prefs_home_header=Περιεχόμενο αρχικής σελίδας Firefox
prefs_home_description=Επιλέξτε τι περιεχόμενο θέλετε στην αρχική σελίδα του Firefox σας.
prefs_content_discovery_header=Αρχική Firefox
prefs_content_discovery_description=Η ανακάλυψη περιεχομένου στην Αρχική Firefox σάς επιτρέπει να ανακαλύψετε υψηλής ποιότητας, σχετικά άρθρα από όλο τον ιστό.
prefs_content_discovery_button=Απενεργοποίηση ανακάλυψης περιεχομένου
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of

Просмотреть файл

@ -157,16 +157,6 @@ highlights_empty_state=Start browsing, and well show some of the great articl
# {provider} is replaced by the name of the content provider for this section.
topstories_empty_state=Youve caught up. Check back later for more top stories from {provider}. Cant wait? Select a popular topic to find more great stories from around the web.
# LOCALIZATION NOTE (manual_migration_explanation2): This message is shown to encourage users to
# import their browser profile from another browser they might be using.
manual_migration_explanation2=Try Firefox with the bookmarks, history and passwords from another browser.
# LOCALIZATION NOTE (manual_migration_cancel_button): This message is shown on a button that cancels the
# process of importing another browsers profile into Firefox.
manual_migration_cancel_button=No Thanks
# LOCALIZATION NOTE (manual_migration_import_button): This message is shown on a button that starts the process
# of importing another browsers profile profile into Firefox.
manual_migration_import_button=Import Now
# LOCALIZATION NOTE (error_fallback_default_*): This message and suggested
# action link are shown in each section of UI that fails to render
error_fallback_default_info=Oops, something went wrong loading this content.

Просмотреть файл

@ -4,7 +4,7 @@ header_top_sites=Trang web hàng đầu
header_highlights=Nổi bật
# LOCALIZATION NOTE(header_recommended_by): This is followed by the name
# of the corresponding content provider.
header_recommended_by=Được đề nghị bởi {provider}
header_recommended_by=Được đề xuất bởi {provider}
# LOCALIZATION NOTE(context_menu_button_sr): This is for screen readers when
# the context menu button is focused/active. Title is the label or hostname of
@ -93,6 +93,7 @@ prefs_home_header=Nội dung trang chủ của Firefox
prefs_home_description=Chọn nội dung mà bạn muốn thêm vào trang chủ của Firefox.
prefs_content_discovery_header=Trang chủ Firefox
prefs_content_discovery_description=Khám phá nội dung trong trang chủ Firefox cho phép bạn khám phá các bài viết chất lượng cao, có liên quan trên web.
prefs_content_discovery_button=Tắt khám phá nội dung

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ach" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Dirica matidi manyen</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Gwok lok ma imaro ii Pocket, ka i pik wii ki jami me akwana ma mako wii.",
"highlights_empty_state": "Cak yeny, ka wa binyuto coc akwana mabeco, video, ki potbuk mukene ma ilimo cokcokki onyo ma kiketo alamabuk kany.",
"topstories_empty_state": "Ityeko weng. Rot doki lacen pi lok madito mapol ki bot {provider}. Pe itwero kuro? Yer lok macuke lamal me nongo lok mabeco mapol ki i but kakube.",
"manual_migration_explanation2": "Tem Firefox ki alamabuk, gin mukato ki mung me donyo ki ii layeny mukene.",
"manual_migration_cancel_button": "Pe Apwoyo",
"manual_migration_import_button": "Kel kombedi",
"error_fallback_default_info": "Aii, gin mo otime marac i cano jami man.",
"error_fallback_default_refresh_suggestion": "Nwo cano potbuk me temo odoco.",
"section_menu_action_remove_section": "Kwany bute",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ach" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Dirica matidi manyen</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/ach/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/ach/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="an" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Nueva Pestanya</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Save the stories you love in Pocket, and fuel your mind with fascinating reads.",
"highlights_empty_state": "Empecipia a navegar, y t'iremos amostrando aquí grans articlos, videos y atras pachinas que has vesitau u marcau en zagueras.",
"topstories_empty_state": "Ya ye tot per agora. Torna mas ta debant pa veyer mas articlos populars de {provider}. No i puetz aguardar? Tría un tema popular pa descubrir los articlos mas interesants de tot lo web.",
"manual_migration_explanation2": "Preba lo Firefox con as adrezas d'interés, l'historial y las claus de belatro navegador.",
"manual_migration_cancel_button": "No, gracias",
"manual_migration_import_button": "Importar-lo agora",
"error_fallback_default_info": "Oi, ha fallau bella cosa en a carga d'este conteniu.",
"error_fallback_default_refresh_suggestion": "Refrescar la pachina pa tornar-lo a intentar.",
"section_menu_action_remove_section": "Borrar la sección",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="an" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Nueva Pestanya</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/an/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/an/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ar" dir="rtl">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>لسان جديد</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "احفظ القصص التي تحبّها في بوكِت، وزوّد عقلك بمقالات رائعة.",
"highlights_empty_state": "ابدأ التصفح وسنعرض أمامك بعض المقالات والفيديوهات والمواقع الأخرى التي زرتها حديثا أو أضفتها إلى العلامات هنا.",
"topstories_empty_state": "لا جديد. تحقق لاحقًا للحصول على مزيد من أهم الأخبار من {provider}. لا يمكنك الانتظار؟ اختر موضوعًا شائعًا للعثور على المزيد من القصص الرائعة من جميع أنحاء الوِب.",
"manual_migration_explanation2": "جرب فَيَرفُكس مع العلامات، و التأريخ، و كلمات السر من متصفح آخر.",
"manual_migration_cancel_button": "لا شكرًا",
"manual_migration_import_button": "استورد الآن",
"error_fallback_default_info": "أخ! حدث خطب ما أثناء تحميل المحتوى.",
"error_fallback_default_refresh_suggestion": "أنعِش الصفحة لإعادة المحاولة.",
"section_menu_action_remove_section": "أزِل القسم",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ar" dir="rtl">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>لسان جديد</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/ar/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/ar/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ast" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Llingüeta nueva</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Save the stories you love in Pocket, and fuel your mind with fascinating reads.",
"highlights_empty_state": "Start browsing, and well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant wait? Select a popular topic to find more great stories from around the web.",
"manual_migration_explanation2": "Prueba Firefox colos marcadores, hestorial y contraseñes d'otru restolador.",
"manual_migration_cancel_button": "Non, gracies",
"manual_migration_import_button": "Importar agora",
"error_fallback_default_info": "Oops, something went wrong loading this content.",
"error_fallback_default_refresh_suggestion": "Refresh page to try again.",
"section_menu_action_remove_section": "Remove Section",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ast" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Llingüeta nueva</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/ast/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/ast/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="az" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Yeni Vərəq</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Sevdiyiniz məqalələri Pocket-də saxlayın və möhtəşəm yeni yazıları kəşf edin.",
"highlights_empty_state": "İnternetdə gəzməyə başlayın, burada ziyarət edəcəyiniz və ya əlfəcinləyəcəyiniz məqalə, video və digər səhifələri göstərəcəyik.",
"topstories_empty_state": "Hamısını oxudunuz. Yeni {provider} məqalələri üçün daha sonra təkrar yoxlayın. Gözləyə bilmirsiz? Məşhur mövzu seçərək internetdən daha çox gözəl məqalələr tapın.",
"manual_migration_explanation2": "Firefox səyyahını digər səyyahlardan olan əlfəcin, tarixçə və parollar ilə yoxlayın.",
"manual_migration_cancel_button": "Xeyr, Təşəkkürlər",
"manual_migration_import_button": "İndi idxal et",
"error_fallback_default_info": "Uups, bu məzmunu yüklərkən nəsə səhv getdi.",
"error_fallback_default_refresh_suggestion": "Təkrar yoxlamaq üçün səhifəni yeniləyin.",
"section_menu_action_remove_section": "Bölməni Sil",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="az" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Yeni Vərəq</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/az/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/az/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="be" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Новая картка</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Захоўвайце ўлюбёныя гісторыі ў Pocket, і сілкуйце свой розум добрай чытанкай.",
"highlights_empty_state": "Пачніце агляданне, і мы пакажам вам тут некаторыя з найлепшых артыкулаў, відэаролікаў і іншых старонак, якія вы нядаўна наведалі або дадалі ў закладкі.",
"topstories_empty_state": "Гатова. Праверце пазней, каб убачыць больш матэрыялаў ад {provider}. Не жадаеце чакаць? Выберыце папулярную тэму, каб знайсці больш цікавых матэрыялаў з усяго Інтэрнэту.",
"manual_migration_explanation2": "Паспрабуйце Firefox з закладкамі, гісторыяй і паролямі з іншага браўзера.",
"manual_migration_cancel_button": "Не, дзякуй",
"manual_migration_import_button": "Імпартаваць зараз",
"error_fallback_default_info": "Ох, нешта пайшло не так пры загрузцы гэтага змесціва.",
"error_fallback_default_refresh_suggestion": "Абнавіць старонку, каб паўтарыць спробу.",
"section_menu_action_remove_section": "Выдаліць раздзел",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="be" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Новая картка</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/be/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/be/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="bg" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Нов раздел</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Запазете статиите, които харесвате в Pocket и заредете ума си с увлекателни четива.",
"highlights_empty_state": "Разглеждайте и тук ще ви покажем някои от най-добрите статии, видео и други страници, които сте посетили или отметнали наскоро.",
"topstories_empty_state": "Разгледахте всичко. Проверете по-късно за повече истории от {provider}. Нямате търпение? Изберете популярна тема, за да откриете повече истории от цялата Мрежа.",
"manual_migration_explanation2": "Опитайте Firefox с отметките, историята и паролите от друг мрежови четец.",
"manual_migration_cancel_button": "Не, благодаря",
"manual_migration_import_button": "Внасяне",
"error_fallback_default_info": "Ааах, нещо се обърка и съдържанието не е заредено.",
"error_fallback_default_refresh_suggestion": "Презаредете страницата за повторен опит.",
"section_menu_action_remove_section": "Премахване на раздела",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="bg" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Нов раздел</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/bg/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/bg/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="bn" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>নতুন ট্যাব</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Pocket এ আপনার পছন্দের গল্পগুলো সংরক্ষণ করুন, এবং চমৎকার সব লেখা পড়ে আপনার মনের ইন্ধন যোগান।",
"highlights_empty_state": "ব্রাউজি করা শুরু করুন, এবং কিছু গুরুত্বপূর্ণ নিবন্ধ, ভিডিও, এবং আপনি সম্প্রতি পরিদর্শন বা বুকমার্ক করেছেন এমন কিছু পৃষ্ঠা আমরা এখানে প্রদর্শন করব।",
"topstories_empty_state": "কিছু একটা ঠিক নেই। {provider} এর শীর্ষ গল্পগুলো পেতে কিছুক্ষণ পর আবার দেখুন। অপেক্ষা করতে চান না? বিশ্বের সেরা গল্পগুলো পেতে কোন জনপ্রিয় বিষয় নির্বাচন করুন।",
"manual_migration_explanation2": "অন্য ব্রাউজার থেকে আনা বুকমার্ক, ইতিহাস এবং পাসওয়ার্ডগুলির সাথে ফায়ারফক্স ব্যবহার করে দেখুন।",
"manual_migration_cancel_button": "প্রয়োজন নেই",
"manual_migration_import_button": "এখনই ইম্পোর্ট করুন",
"error_fallback_default_info": "ওহো, কনটেন্টটি লোড করতে কিছু ভুল হয়েছে।",
"error_fallback_default_refresh_suggestion": "পুনরায় চেস্টা করার জন্য পেজটি রিফ্রেশ করুন।",
"section_menu_action_remove_section": "সেকশনটি সরান",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="bn" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>নতুন ট্যাব</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/bn/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/bn/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="br" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Ivinell nevez</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Enrollit pennadoù a-zoare e Pocket ha magit ho spered gant lennadennoù boemus.",
"highlights_empty_state": "Krogit da verdeiñ hag e tiskouezimp deoch pennadoù, videoioù ha pajennoù all gweladennet pe lakaet er sinedoù nevez zo.",
"topstories_empty_state": "Aet oc'h betek penn. Distroit diwezhatoc'h evit muioch a istorioù digant {provider}. Noc'h ket evit gortoz? Dibabit un danvez brudet evit klask muioch a bennadoù dedennus eus pep lech er web.",
"manual_migration_explanation2": "Amprouit Firefox gant sinedoù, roll istor ha gerioù-tremen ur merdeer all.",
"manual_migration_cancel_button": "N'am bo ket",
"manual_migration_import_button": "Enporzhiañ bremañ",
"error_fallback_default_info": "Chaous, un dra bennak a zo a-dreuz en ur gargañ an endalc'had.",
"error_fallback_default_refresh_suggestion": "Adkargit ar bajenn evit klask en-dro.",
"section_menu_action_remove_section": "Dilemel ar gevrenn",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="br" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Ivinell nevez</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/br/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/br/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="bs" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Novi tab</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Save the stories you love in Pocket, and fuel your mind with fascinating reads.",
"highlights_empty_state": "Započnite pretraživati i pokazat ćemo vam neke od izvrsnih članaka, videa i drugih web stranica prema vašim nedavno posjećenim stranicama ili zabilješkama.",
"topstories_empty_state": "Provjerite kasnije za više najpopularnijih priča od {provider}. Ne možete čekati? Odaberite popularne teme kako biste pronašli više kvalitetnih priča s cijelog weba.",
"manual_migration_explanation2": "Probajte Firefox s zabilješkama, historijom i lozinkama iz drugog pretraživača.",
"manual_migration_cancel_button": "Ne, hvala",
"manual_migration_import_button": "Uvezi sada",
"error_fallback_default_info": "Ups, došlo je do greške pri učitavanju ovog sadržaja.",
"error_fallback_default_refresh_suggestion": "Osvježite stranicu da biste pokušali ponovo.",
"section_menu_action_remove_section": "Ukloni sekciju",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="bs" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Novi tab</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/bs/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/bs/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ca" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Pestanya nova</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Deseu els vostres articles preferits al Pocket i gaudiu d'altres recomanacions fascinants.",
"highlights_empty_state": "Comenceu a navegar i aquí us mostrarem els millors articles, vídeos i altres pàgines que hàgiu visitat o afegit a les adreces d'interès recentment.",
"topstories_empty_state": "Ja esteu al dia. Torneu més tard per veure més articles populars de {provider}. No podeu esperar? Trieu un tema popular per descobrir els articles més interessants de tot el web.",
"manual_migration_explanation2": "Proveu el Firefox amb les adreces d'interès, l'historial i les contrasenyes d'un altre navegador.",
"manual_migration_cancel_button": "No, gràcies",
"manual_migration_import_button": "Importa-ho ara",
"error_fallback_default_info": "Vaja, s'ha produït un error en carregar aquest contingut.",
"error_fallback_default_refresh_suggestion": "Actualitzeu la pàgina per tornar-ho a provar.",
"section_menu_action_remove_section": "Elimina la secció",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="ca" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Pestanya nova</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/ca/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/ca/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="cak" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>K'ak'a' ruwi'</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Ke'ayaka' ri taq b'anob'äl ye'awajo' pa Pocket, chuqa' taya' ruchuq'a' ajolom kik'in jeb'ël taq sik'inïk.",
"highlights_empty_state": "Katok pa k'amaya'l richin niqak'üt chawäch jeb'ël taq cholna'oj, taq silowachib'äl, chuqa' ch'aqa' chik taq ruxaq k'a b'a' ke'atz'ët o aya'on kan ketal wawe'.",
"topstories_empty_state": "Xaq'i'. Katzolin chik pe richin ye'ak'ül ri utziläj taq rub'anob'al {provider}. ¿La man noyob'en ta? Tacha' jun ütz na'oj richin nawïl ch'aqa' chik taq b'anob'äl e k'o chi rij ri ajk'amaya'l.",
"manual_migration_explanation2": "Tatojtob'ej Firefox kik'in ri taq ruyaketal, runatab'äl chuqa' taq ewan rutzij jun chik okik'amaya'l.",
"manual_migration_cancel_button": "Mani matyox",
"manual_migration_import_button": "Tijik' pe",
"error_fallback_default_info": "Uy, k'o jun itzel xel toq nisamajib'ëx re rupam re'.",
"error_fallback_default_refresh_suggestion": "Titzolïx ruxaq richin nitojtob'ëx chik.",
"section_menu_action_remove_section": "Tiyuj Tanaj",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="cak" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>K'ak'a' ruwi'</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/cak/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/cak/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="crh" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Yañı İlmek</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Save the stories you love in Pocket, and fuel your mind with fascinating reads.",
"highlights_empty_state": "Start browsing, and well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant wait? Select a popular topic to find more great stories from around the web.",
"manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.",
"manual_migration_cancel_button": "Hayır, Teşekkürler",
"manual_migration_import_button": "Import Now",
"error_fallback_default_info": "Oops, something went wrong loading this content.",
"error_fallback_default_refresh_suggestion": "Refresh page to try again.",
"section_menu_action_remove_section": "Kesimni Çetleştir",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="crh" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Yañı İlmek</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/crh/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/crh/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="cs" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Nový panel</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -81,9 +81,6 @@ window.gActivityStreamStrings = {
"pocket_cta_text": "Ukládejte si články do služby Pocket a užívejte si skvělé čtení.",
"highlights_empty_state": "Začněte prohlížet a my vám zde ukážeme některé skvělé články, videa a další stránky, které jste nedávno viděli nebo uložili do záložek.",
"topstories_empty_state": "Už jste všechno přečetli. Další články ze služby {provider} tu najdete zase později. Ale pokud se nemůžete dočkat, vyberte své oblíbené téma a podívejte se na další velké články z celého webu.",
"manual_migration_explanation2": "Vyzkoušejte Firefox se záložkami, historií a hesly z jiného vašeho prohlížeče.",
"manual_migration_cancel_button": "Ne, děkuji",
"manual_migration_import_button": "Importovat nyní",
"error_fallback_default_info": "Jejda, při načítání tohoto obsahu se něco pokazilo.",
"error_fallback_default_refresh_suggestion": "Obnovte prosím stránku a zkuste to znovu.",
"section_menu_action_remove_section": "Odebrat sekci",

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="cs" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Nový panel</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,30 +10,16 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of [
"chrome://browser/content/contentSearchUI.js",
"chrome://browser/content/contentTheme.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/cs/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
<div id="footer-snippets-container" />
<script src="chrome://browser/content/contentSearchUI.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
<script src="resource://activity-stream/vendor/react.js"></script>
<script src="resource://activity-stream/vendor/react-dom.js"></script>
<script src="resource://activity-stream/vendor/prop-types.js"></script>
<script src="resource://activity-stream/vendor/react-intl.js"></script>
<script src="resource://activity-stream/vendor/redux.js"></script>
<script src="resource://activity-stream/vendor/react-redux.js"></script>
<script src="resource://activity-stream/prerendered/cs/activity-stream-strings.js"></script>
<script src="resource://activity-stream/data/content/activity-stream.bundle.js"></script>
</body>
</html>

Просмотреть файл

@ -2,7 +2,7 @@
<html lang="cy" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; object-src 'none'; script-src resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Tab Newydd</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
@ -10,8 +10,6 @@
</head>
<body class="activity-stream">
<div id="root"><!-- Regular React Rendering --></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<div id="footer-snippets-container" />
</body>
</html>

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше