Bug 1483375 - Add tab-able search, search telemetry and bug fixes to Activity Stream r=ursula

Differential Revision: https://phabricator.services.mozilla.com/D3367

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Ed Lee 2018-08-15 00:13:38 +00:00
Родитель 80dafc6927
Коммит 3bb8b396bb
221 изменённых файлов: 356 добавлений и 247 удалений

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

@ -1,6 +1,7 @@
import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
import {FormattedMessage} from "react-intl";
import React from "react";
import {TOP_SITES_SOURCE} from "./TopSitesConstants";
class SelectableSearchShortcut extends React.PureComponent {
render() {
@ -74,7 +75,7 @@ export class SearchShortcutsForm extends React.PureComponent {
if (shortcut.isSelected && !alreadyPinned) {
pinQueue.push(this._searchTopSite(shortcut));
} else if (!shortcut.isSelected && alreadyPinned) {
unpinQueue.push({url: alreadyPinned.url});
unpinQueue.push({url: alreadyPinned.url, searchVendor: shortcut.shortURL});
}
});
@ -97,6 +98,11 @@ export class SearchShortcutsForm extends React.PureComponent {
index: availableSlots.shift()
}
}));
this.props.dispatch(ac.UserEvent({
source: TOP_SITES_SOURCE,
event: "SEARCH_EDIT_ADD",
value: {search_vendor: shortcut.searchVendor}
}));
});
}
@ -106,6 +112,11 @@ export class SearchShortcutsForm extends React.PureComponent {
type: at.TOP_SITES_UNPIN,
data: {site: shortcut}
}));
this.props.dispatch(ac.UserEvent({
source: TOP_SITES_SOURCE,
event: "SEARCH_EDIT_DELETE",
value: {search_vendor: shortcut.searchVendor}
}));
});
this.props.onClose();
@ -115,7 +126,8 @@ export class SearchShortcutsForm extends React.PureComponent {
return {
url: shortcut.url,
searchTopSite: true,
label: shortcut.keyword
label: shortcut.keyword,
searchVendor: shortcut.shortURL
};
}

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

@ -17,6 +17,7 @@ export class TopSiteLink extends React.PureComponent {
super(props);
this.state = {screenshotImage: null};
this.onDragEvent = this.onDragEvent.bind(this);
this.onKeyPress = this.onKeyPress.bind(this);
}
/*
@ -112,6 +113,15 @@ export class TopSiteLink extends React.PureComponent {
ScreenshotUtils.maybeRevokeBlobObjectURL(this.state.screenshotImage);
}
onKeyPress(event) {
// If we have tabbed to a search shortcut top site, and we click 'enter',
// we should execute the onClick function. This needs to be added because
// search top sites are anchor tags without an href. See bug 1483135
if (this.props.link.searchTopSite && event.key === "Enter") {
this.props.onClick(event);
}
}
render() {
const {children, className, defaultStyle, isDraggable, link, onClick, title} = this.props;
const topSiteOuterClassName = `top-site-outer${className ? ` ${className}` : ""}${link.isDragged ? " dragged" : ""}${link.searchTopSite ? " search-shortcut" : ""}`;
@ -173,7 +183,7 @@ export class TopSiteLink extends React.PureComponent {
}
return (<li className={topSiteOuterClassName} onDrop={this.onDragEvent} onDragOver={this.onDragEvent} onDragEnter={this.onDragEvent} onDragLeave={this.onDragEvent} {...draggableProps}>
<div className="top-site-inner">
<a href={!link.searchTopSite && link.url} onClick={onClick} draggable={true}>
<a href={!link.searchTopSite && link.url} tabIndex="0" onKeyPress={this.onKeyPress} onClick={onClick} draggable={true}>
<div className="tile" aria-hidden={true} data-fallback={letterFallback}>
<div className={imageClassName} style={imageStyle} />
{link.searchTopSite && <div className="top-site-icon search-topsite" />}

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

@ -64,10 +64,15 @@ export class _TopSites extends React.PureComponent {
const topSites = this._getVisibleTopSites();
const topSitesIconsStats = countTopSitesIconsTypes(topSites);
const topSitesPinned = topSites.filter(site => !!site.isPinned).length;
const searchShortcuts = topSites.filter(site => !!site.searchTopSite).length;
// Dispatch telemetry event with the count of TopSites images types.
this.props.dispatch(ac.AlsoToMain({
type: at.SAVE_SESSION_PERF_DATA,
data: {topsites_icon_stats: topSitesIconsStats, topsites_pinned: topSitesPinned}
data: {
topsites_icon_stats: topSitesIconsStats,
topsites_pinned: topSitesPinned,
topsites_search_shortcuts: searchShortcuts
}
}));
}

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

@ -4065,10 +4065,15 @@ class _TopSites extends react__WEBPACK_IMPORTED_MODULE_6___default.a.PureCompone
const topSites = this._getVisibleTopSites();
const topSitesIconsStats = countTopSitesIconsTypes(topSites);
const topSitesPinned = topSites.filter(site => !!site.isPinned).length;
const searchShortcuts = topSites.filter(site => !!site.searchTopSite).length;
// Dispatch telemetry event with the count of TopSites images types.
this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({
type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SAVE_SESSION_PERF_DATA,
data: { topsites_icon_stats: topSitesIconsStats, topsites_pinned: topSitesPinned }
data: {
topsites_icon_stats: topSitesIconsStats,
topsites_pinned: topSitesPinned,
topsites_search_shortcuts: searchShortcuts
}
}));
}
@ -4211,6 +4216,8 @@ __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 react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _TopSitesConstants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34);
@ -4300,7 +4307,7 @@ class SearchShortcutsForm extends react__WEBPACK_IMPORTED_MODULE_2___default.a.P
if (shortcut.isSelected && !alreadyPinned) {
pinQueue.push(this._searchTopSite(shortcut));
} else if (!shortcut.isSelected && alreadyPinned) {
unpinQueue.push({ url: alreadyPinned.url });
unpinQueue.push({ url: alreadyPinned.url, searchVendor: shortcut.shortURL });
}
});
@ -4323,6 +4330,11 @@ class SearchShortcutsForm extends react__WEBPACK_IMPORTED_MODULE_2___default.a.P
index: availableSlots.shift()
}
}));
this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_3__["TOP_SITES_SOURCE"],
event: "SEARCH_EDIT_ADD",
value: { search_vendor: shortcut.searchVendor }
}));
});
}
@ -4332,6 +4344,11 @@ class SearchShortcutsForm extends react__WEBPACK_IMPORTED_MODULE_2___default.a.P
type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TOP_SITES_UNPIN,
data: { site: shortcut }
}));
this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent({
source: _TopSitesConstants__WEBPACK_IMPORTED_MODULE_3__["TOP_SITES_SOURCE"],
event: "SEARCH_EDIT_DELETE",
value: { search_vendor: shortcut.searchVendor }
}));
});
this.props.onClose();
@ -4341,7 +4358,8 @@ class SearchShortcutsForm extends react__WEBPACK_IMPORTED_MODULE_2___default.a.P
return {
url: shortcut.url,
searchTopSite: true,
label: shortcut.keyword
label: shortcut.keyword,
searchVendor: shortcut.shortURL
};
}
@ -4416,6 +4434,7 @@ class TopSiteLink extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureCompo
super(props);
this.state = { screenshotImage: null };
this.onDragEvent = this.onDragEvent.bind(this);
this.onKeyPress = this.onKeyPress.bind(this);
}
/*
@ -4511,6 +4530,15 @@ class TopSiteLink extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureCompo
content_src_lib_screenshot_utils__WEBPACK_IMPORTED_MODULE_5__["ScreenshotUtils"].maybeRevokeBlobObjectURL(this.state.screenshotImage);
}
onKeyPress(event) {
// If we have tabbed to a search shortcut top site, and we click 'enter',
// we should execute the onClick function. This needs to be added because
// search top sites are anchor tags without an href. See bug 1483135
if (this.props.link.searchTopSite && event.key === "Enter") {
this.props.onClick(event);
}
}
render() {
const { children, className, defaultStyle, isDraggable, link, onClick, title } = this.props;
const topSiteOuterClassName = `top-site-outer${className ? ` ${className}` : ""}${link.isDragged ? " dragged" : ""}${link.searchTopSite ? " search-shortcut" : ""}`;
@ -4579,7 +4607,7 @@ class TopSiteLink extends react__WEBPACK_IMPORTED_MODULE_4___default.a.PureCompo
{ className: "top-site-inner" },
react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(
"a",
{ href: !link.searchTopSite && link.url, onClick: onClick, draggable: true },
{ href: !link.searchTopSite && link.url, tabIndex: "0", onKeyPress: this.onKeyPress, onClick: onClick, draggable: true },
react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(
"div",
{ className: "tile", "aria-hidden": true, "data-fallback": letterFallback },

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

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

@ -223,6 +223,7 @@ and losing focus. | :one:
| `rich_icon` | [Optional] Number of topsites that display a high quality favicon. | :one:
| `no_image` | [Optional] Number of topsites that have no screenshot. | :one:
| `topsites_pinned` | [Optional] Number of topsites that are pinned. | :one:
| `topsites_search_shortcuts` | [Optional] Number of search shortcut topsites. | :one:
| `visibility_event_rcvd_ts` | [Optional][Server Counter][Server Alert for too many omissions] DOMHighResTimeStamp of when the page itself receives an event that document.visibilityState == visible. | :one:
| `tiles` | [Required] A list of tile objects for the Pocket articles. Each tile object mush have a ID, and optionally a "pos" property to indicate the tile position | :one:
| `click` | [Optional] An integer to record the 0-based index when user clicks on a Pocket tile. | :one:

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

@ -110,11 +110,10 @@ A user event ping includes some basic metadata (tab id, addon version, etc.) as
#### Adding a search shortcut
```js
{
  "event": "ADD_SEARCH_SHORTCUT",
  "event": "SEARCH_EDIT_ADD",
"source": "TOP_SITES",
  "action_position": 2,
"value": {
"card_type": "search",
"search_vendor": "google"
}
@ -129,14 +128,13 @@ A user event ping includes some basic metadata (tab id, addon version, etc.) as
}
```
#### Editing a search shortcut
#### Deleting a search shortcut
```js
{
  "event": "EDIT_SEARCH_SHORTCUT",
  "event": "SEARCH_EDIT_DELETE",
"source": "TOP_SITES",
  "action_position": 2,
"value": {
"card_type": "search",
"search_vendor": "google"
}
@ -441,6 +439,9 @@ perf: {
// The number of Top Sites that are pinned.
"topsites_pinned": 3,
// The number of search shortcut Top Sites.
"topsites_search_shortcuts": 2,
// How much longer the data took, in milliseconds, to be ready for display
// than it would have been in the ideal case. The user currently sees placeholder
// cards instead of real cards for approximately this length of time. This is

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

@ -648,7 +648,9 @@ this.TopSitesFeed = class TopSitesFeed {
this.refresh({broadcast: true});
break;
case SEARCH_SHORTCUTS_EXPERIMENT:
if (!action.data.value) {
if (action.data.value) {
this.updateCustomSearchShortcuts();
} else {
this.disableSearchImprovements();
}
this.refresh({broadcast: true});

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Επέκταση ενότητας
section_menu_action_manage_section=Διαχείριση ενότητας
section_menu_action_manage_webext=Διαχείριση επέκτασης
section_menu_action_add_topsite=Προσθήκη κορυφαίας ιστοσελίδας
section_menu_action_add_search_engine=Προσθήκη μηχανής αναζήτησης
section_menu_action_move_up=Μετακίνηση επάνω
section_menu_action_move_down=Μετακίνηση κάτω
section_menu_action_privacy_notice=Σημείωση απορρήτου
@ -201,4 +202,3 @@ firstrun_privacy_notice=Σημείωση Απορρήτου
firstrun_continue_to_login=Συνέχεια
firstrun_skip_login=Παράλειψη βήματος
section_menu_action_add_search_engine=Προσθήκη μηχανής αναζήτησης

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Expand Section
section_menu_action_manage_section=Manage Section
section_menu_action_manage_webext=Manage Extension
section_menu_action_add_topsite=Add Top Site
section_menu_action_add_search_engine=Add Search Engine
section_menu_action_move_up=Move Up
section_menu_action_move_down=Move Down
section_menu_action_privacy_notice=Privacy Notice
@ -201,4 +202,3 @@ firstrun_privacy_notice=Privacy Notice
firstrun_continue_to_login=Continue
firstrun_skip_login=Skip this step
section_menu_action_add_search_engine=Add Search Engine

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Expandir sección
section_menu_action_manage_section=Administrar sección
section_menu_action_manage_webext=Administrar extensión
section_menu_action_add_topsite=Agregar Sitio más visitado
section_menu_action_add_search_engine=Agregar buscador
section_menu_action_move_up=Subir
section_menu_action_move_down=Bajar
section_menu_action_privacy_notice=Nota de privacidad
@ -201,4 +202,3 @@ firstrun_privacy_notice=Anuncio de privacidad
firstrun_continue_to_login=Continuar
firstrun_skip_login=Saltear este paso
section_menu_action_add_search_engine=Agregar buscador

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Szakasz lenyitása
section_menu_action_manage_section=Szakasz kezelése
section_menu_action_manage_webext=Kiterjesztés kezelése
section_menu_action_add_topsite=Hozzáadás a népszerű oldalakhoz
section_menu_action_add_search_engine=Keresőszolgáltatás hozzáadása
section_menu_action_move_up=Mozgatás felfelé
section_menu_action_move_down=Mozgatás lefelé
section_menu_action_privacy_notice=Adatvédelmi nyilatkozat
@ -201,4 +202,3 @@ firstrun_privacy_notice=Adatvédelmi nyilatkozatot
firstrun_continue_to_login=Folytatás
firstrun_skip_login=Lépés kihagyása
section_menu_action_add_search_engine=Keresőszolgáltatás hozzáadása

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Bentangkan Bagian
section_menu_action_manage_section=Kelola Bagian
section_menu_action_manage_webext=Kelola Ekstensi
section_menu_action_add_topsite=Tambah Situs Pilihan
section_menu_action_add_search_engine=Tambahkan Mesin Pencari
section_menu_action_move_up=Naikkan
section_menu_action_move_down=Turunkan
section_menu_action_privacy_notice=Kebijakan Privasi
@ -201,4 +202,3 @@ firstrun_privacy_notice=Pernyataan Privasi
firstrun_continue_to_login=Lanjutkan
firstrun_skip_login=Lewati langkah ini
section_menu_action_add_search_engine=Tambahkan Mesin Pencari

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

@ -201,4 +201,3 @@ firstrun_privacy_notice=informativa sulla privacy
firstrun_continue_to_login=Continua
firstrun_skip_login=Ignora questo passaggio
section_menu_action_add_search_engine=Aggiungi motore di ricerca

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

@ -19,6 +19,8 @@ header_recommended_by={provider} ശുപാർശ ചെയ്തത്
type_label_visited=സന്ദർശിച്ചത്‌
type_label_bookmarked=അടയാളപ്പെടുത്തിയത്
type_label_recommended=ട്രെൻഡിംഗ്
type_label_pocket=പോക്കറ്റിലേക്ക് സംരക്ഷിച്ചു
type_label_downloaded=ഡൗൺലോഡ് ചെയ്തവ
# LOCALIZATION NOTE (menu_action_*): These strings are displayed in a context
# menu and are meant as a call to action for a given page.
@ -29,10 +31,10 @@ menu_action_remove_bookmark=അടയാളം മാറ്റുക
menu_action_open_new_window=പുതിയ ജാലകത്തിൽ തുറക്കുക
menu_action_open_private_window=പുതിയ രസഹ്യജാലകത്തിൽ തുറക്കുക
menu_action_dismiss=പുറത്താക്കുക
menu_action_delete=ചരിത്രത്തിൽ നിന്ന് ഒഴിവാക്കുക
menu_action_delete=നാള്‍വഴിയിൽ നിന്ന് ഒഴിവാക്കുക
menu_action_pin=പിൻ ചെയ്യുക
menu_action_unpin=അൺപിൻ ചെയ്യുക
confirm_history_delete_p1=നിങ്ങളുടെ ചരിത്രത്തിൽ നിന്ന് ഈ പേജിന്റെ എല്ലാ ഉദാഹരണങ്ങളും ഇല്ലാതാക്കാൻ നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നുവെന്ന് തീർച്ചയാണോ?
confirm_history_delete_p1=നിങ്ങളുടെ നാള്‍വഴിയിൽ നിന്ന് ഈ പേജിന്റെ എല്ലാ ഉദാഹരണങ്ങളും ഇല്ലാതാക്കാൻ നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നുവെന്ന് തീർച്ചയാണോ?
# LOCALIZATION NOTE (confirm_history_delete_notice_p2): this string is displayed in
# the same dialog as confirm_history_delete_p1. "This action" refers to deleting a
# page from history.
@ -119,7 +121,7 @@ topstories_empty_state=നിങ്ങൾ ഇവിടെ വരെ എത്ത
# 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=മറ്റൊരു ബ്രൗസറിൽ നിന്നുള്ള ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ എന്നിവ ഉപയോഗിച്ച് ഫയർഫോക്സ് പരീക്ഷിക്കുക.
manual_migration_explanation2=മറ്റൊരു ബ്രൗസറിൽ നിന്നുള്ള ബുക്ക്മാർക്കുകൾ, നാൾവഴികൾ, പാസ്വേഡുകൾ എന്നിവ ഉപയോഗിച്ച് ഫയർഫോക്സ് പരീക്ഷിക്കുക.
# 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=വേണ്ട, നന്ദി
@ -141,6 +143,7 @@ manual_migration_import_button=ഇപ്പോൾ ഇറക്കുമതി
# firstrun_form_header is displayed more boldly as the call to action.
# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Utvid seksjon
section_menu_action_manage_section=Handter seksjon
section_menu_action_manage_webext=Handter utviding
section_menu_action_add_topsite=Legg til mest besøkte
section_menu_action_add_search_engine=Legg til søkjemotor
section_menu_action_move_up=Flytt opp
section_menu_action_move_down=Flytt ned
section_menu_action_privacy_notice=Personvernmerknad
@ -201,4 +202,3 @@ firstrun_privacy_notice=Personvernpraksis
firstrun_continue_to_login=Fortset
firstrun_skip_login=Hopp over dette steget
section_menu_action_add_search_engine=Legg til søkjemotor

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Expandir secção
section_menu_action_manage_section=Gerir secção
section_menu_action_manage_webext=Gerir extensão
section_menu_action_add_topsite=Adicionar site mais visitado
section_menu_action_add_search_engine=Adicionar motor de pesquisa
section_menu_action_move_up=Mover para cima
section_menu_action_move_down=Mover para baixo
section_menu_action_privacy_notice=Aviso de privacidade
@ -201,4 +202,3 @@ firstrun_privacy_notice=Aviso de privacidade
firstrun_continue_to_login=Continuar
firstrun_skip_login=Saltar este passo
section_menu_action_add_search_engine=Adicionar motor de pesquisa

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=Expandera sektion
section_menu_action_manage_section=Hantera sektion
section_menu_action_manage_webext=Hantera tillägg
section_menu_action_add_topsite=Lägg till mest besökta
section_menu_action_add_search_engine=Lägg till sökmotor
section_menu_action_move_up=Flytta upp
section_menu_action_move_down=Flytta ner
section_menu_action_privacy_notice=Sekretesspolicy
@ -201,4 +202,3 @@ firstrun_privacy_notice=Sekretesspolicy
firstrun_continue_to_login=Fortsätt
firstrun_skip_login=Hoppa över det här steget
section_menu_action_add_search_engine=Lägg till sökmotor

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

@ -173,6 +173,7 @@ section_menu_action_expand_section=展开板块
section_menu_action_manage_section=管理板块
section_menu_action_manage_webext=管理扩展
section_menu_action_add_topsite=添加常用网站
section_menu_action_add_search_engine=添加搜索引擎
section_menu_action_move_up=上移
section_menu_action_move_down=下移
section_menu_action_privacy_notice=隐私声明
@ -201,4 +202,3 @@ firstrun_privacy_notice=隐私声明
firstrun_continue_to_login=继续
firstrun_skip_login=跳过此步骤
section_menu_action_add_search_engine=添加搜索引擎

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

@ -13,11 +13,12 @@ cd /activity-stream && npm install . && npm run buildmc
# Build latest m-c with Activity Stream changes
cd /mozilla-central && ./mach build \
&& ./mach test browser_parsable_css \
&& ./mach lint -l codespell browser/components/newtab \
&& ./mach test browser/components/newtab/test/browser --headless \
&& ./mach test browser/components/newtab/test/xpcshell \
&& ./mach test browser/components/preferences/in-content/tests/browser_hometab_restore_defaults.js --headless \
&& ./mach test browser/components/preferences/in-content/tests/browser_newtab_menu.js --headless \
&& ./mach test browser/components/enterprisepolicies/tests/browser/browser_policy_set_homepage.js --headless \
&& ./mach test browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_1.js --headless
&& ./mach test --log-tbpl test_run_log \
browser_parsable_css \
browser/components/newtab \
browser/components/preferences/in-content/tests/browser_hometab_restore_defaults.js \
browser/components/preferences/in-content/tests/browser_newtab_menu.js \
browser/components/enterprisepolicies/tests/browser/browser_policy_set_homepage.js \
browser/components/preferences/in-content/tests/browser_search_subdialogs_within_preferences_1.js \
&& ! grep -q TEST-UNEXPECTED test_run_log

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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