Commit graph

200 commits

Author SHA1 Message Date
Henri Sivonen
649a5b63d8 Bug 1701828 - meta charset rewrite. r=smaug
Implements https://github.com/whatwg/html/issues/6962 . Improves performance
when <meta charset> occurs in head but after the first kilobyte and aligns
behavior better with WebKit and Blink.

The main change is to avoid reloads when meta appears within head but
after the first kilobyte. Prior to this change, Gecko reloaded in that
case (in compliance with the spec!) even though WebKit and Blink did not.

Differences from WebKit and Blink:

* WebKit and Blink honor <meta charset> in <noscript>. This implementation
  does not.
* WebKit and Blink look for meta as if the tree builder was unaware of
  foreign content. This implementation is foreign content-aware. This
  makes a difference for CDATA sections that contain a > before the meta
  as well as style and script elements within foreign content. This could
  happen if the CDATA section that has mysteriously been introduced around
  a what looks like a meta tag also contains another prior tag-looking
  run of text.
* This implementation processes rel=preload and speculative loads that are
  seen before <meta charset> has been seen. WebKit and Blink instead first
  look for the meta and rewind before starting speculative parsing.
* Unlike WebKit, if there is neither an honored meta nor syntax resembling
  an XML declaration, detection from content takes place (as in Blink).
* Unlike Blink, if there is neither an honored meta nor syntax resembling
  an XML declaration, the detection from content is not dependent of network
  buffer boundaries.
* Unlike Blink, detection from content can trigger a reload at the end of
  the stream if the guess made at that point differs from the first guess.
  (See below for the definition of the input to the first guess.)

Differences from the old spec and Gecko previously:

* Meta inside script and RCDATA elements is no longer honored.
* Late meta is now ignored and no longer triggers a reload.
* Later meta counts as early enough meta: In addition to the previous
  meta within the first 1024 bytes, now a meta that started within the first
  1024 bytes counts as early enough. Additionally, if by then there hasn't
  been a template start tag and head hasn't ended, meta occurring before the
  earlier of the end of the head or a template start tag counts as early
  enough.
* Meta now counts as not-late even if the encoding label has numeric
  character reference escapes.
* Syntax resembling an XML declaration longer than a kilobyte is honored if
  there is no honored meta.
* If there is neither an honored meta nor syntax resembling an XML declaration,
  the initial chardetng scan is potentially longer than before: the first 1024
  bytes, the token spanning the 1024-byte boundary if there is such a token,
  and, if by then head hasn't ended and there hasn't been a template start tag
  until the end of the template start tag or the end of the token that causes
  head to end, ever comes first. However, if the token implying the end of the
  head is a text token, bytes only to the end of the previous non-text token is
  considered. (This definition avoids depending on network buffer boundaries.)
* XML View Source now uses the code for syntax resembling an XML declaration
  instead of expat for extracting the internal encoding label.

Reftest are added as both WPT and Gecko reftests in order to test both http:
and file: URL scenarios. The Gecko tests retain the WPT <link> tags in order
to use the exact same bytes.

An encoding declaration has been added to a number of old tests that didn't
intend to test the new speculation behavior especially in the context of
https://bugzilla.mozilla.org/show_bug.cgi?id=1727750 .

Differential Revision: https://phabricator.services.mozilla.com/D125808
2021-12-08 11:34:20 +00:00
Norisz Fay
1d6984bc21 Backed out changeset 3dfd3c94a105 (bug 1701828) for causing mochitest failures on browser_hsts_host.js CLOSED TREE 2021-12-07 12:05:44 +02:00
Henri Sivonen
58476d7f17 Bug 1701828 - meta charset rewrite. r=smaug
Implements https://github.com/whatwg/html/issues/6962 . Improves performance
when <meta charset> occurs in head but after the first kilobyte and aligns
behavior better with WebKit and Blink.

The main change is to avoid reloads when meta appears within head but
after the first kilobyte. Prior to this change, Gecko reloaded in that
case (in compliance with the spec!) even though WebKit and Blink did not.

Differences from WebKit and Blink:

* WebKit and Blink honor <meta charset> in <noscript>. This implementation
  does not.
* WebKit and Blink look for meta as if the tree builder was unaware of
  foreign content. This implementation is foreign content-aware. This
  makes a difference for CDATA sections that contain a > before the meta
  as well as style and script elements within foreign content. This could
  happen if the CDATA section that has mysteriously been introduced around
  a what looks like a meta tag also contains another prior tag-looking
  run of text.
* This implementation processes rel=preload and speculative loads that are
  seen before <meta charset> has been seen. WebKit and Blink instead first
  look for the meta and rewind before starting speculative parsing.
* Unlike WebKit, if there is neither an honored meta nor syntax resembling
  an XML declaration, detection from content takes place (as in Blink).
* Unlike Blink, if there is neither an honored meta nor syntax resembling
  an XML declaration, the detection from content is not dependent of network
  buffer boundaries.
* Unlike Blink, detection from content can trigger a reload at the end of
  the stream if the guess made at that point differs from the first guess.
  (See below for the definition of the input to the first guess.)

Differences from the old spec and Gecko previously:

* Meta inside script and RCDATA elements is no longer honored.
* Late meta is now ignored and no longer triggers a reload.
* Later meta counts as early enough meta: In addition to the previous
  meta within the first 1024 bytes, now a meta that started within the first
  1024 bytes counts as early enough. Additionally, if by then there hasn't
  been a template start tag and head hasn't ended, meta occurring before the
  earlier of the end of the head or a template start tag counts as early
  enough.
* Meta now counts as not-late even if the encoding label has numeric
  character reference escapes.
* Syntax resembling an XML declaration longer than a kilobyte is honored if
  there is no honored meta.
* If there is neither an honored meta nor syntax resembling an XML declaration,
  the initial chardetng scan is potentially longer than before: the first 1024
  bytes, the token spanning the 1024-byte boundary if there is such a token,
  and, if by then head hasn't ended and there hasn't been a template start tag
  until the end of the template start tag or the end of the token that causes
  head to end, ever comes first. However, if the token implying the end of the
  head is a text token, bytes only to the end of the previous non-text token is
  considered. (This definition avoids depending on network buffer boundaries.)
* XML View Source now uses the code for syntax resembling an XML declaration
  instead of expat for extracting the internal encoding label.

Reftest are added as both WPT and Gecko reftests in order to test both http:
and file: URL scenarios. The Gecko tests retain the WPT <link> tags in order
to use the exact same bytes.

An encoding declaration has been added to a number of old tests that didn't
intend to test the new speculation behavior especially in the context of
https://bugzilla.mozilla.org/show_bug.cgi?id=1727750 .

Differential Revision: https://phabricator.services.mozilla.com/D125808
2021-12-07 07:35:32 +00:00
Henri Sivonen
7588a257ed Bug 1724243 - Make text/plain and MediaDocuments use the Standards Mode. r=smaug,emilio
Differential Revision: https://phabricator.services.mozilla.com/D123318
2021-10-01 12:55:28 +00:00
Michael[tm] Smith
d76dfd530f Bug 1541846 - Ensure namespace-aware “clear the stack” handling r=smaug
This change ensures that for all cases with spec requirements in the
form “clear the stack back to a foo context” — which involves checking
for elements with particular names — we only look for elements in the
HTML namespace, rather than additionally looking for elements which
aren’t in the HTML namespace but that also have those particular names.

Otherwise, without this change, we aren’t in conformance with the spec
requirements, and we fail several cases in the html5lib-tests suite.

Fixes https://github.com/validator/htmlparser/issues/33

Differential Revision: https://phabricator.services.mozilla.com/D122722
2021-08-17 12:02:13 +00:00
Michael[tm] Smith
2a15667bbd Bug 1725946 - Conform tokenizer-only U+0000 NUL handling to spec r=smaug
This change brings the tokenizer’s handling of U+0000 NUL characters in
the DATA state and the CDATA section state into conformance with the
requirements in the HTML spec — for the case where only tokenization is
being performed, without tree construction; that is, the case where the
tokenizer() method is called, rather than parse() or parseFragment().

Specifically, the tokenization steps defined in the spec require that
when a U+0000 NUL is consumed in the DATA state or in the CDATA section
state, the parser must then emit a U+0000 NUL. But when performing tree
construction, the spec requires that when a U+0000 NUL is consumed, the
parser must instead emit a U+FFFD REPLACEMENT CHARACTER.

Without this change, the parser always emits a U+FFFD REPLACEMENT
CHARACTER — even when only tokenization is being performed. That causes
us to fail a number of tests in html5lib-tests suite.

For more background on the relevant behavior, see the following:

* https://www.w3.org/Bugs/Public/show_bug.cgi?id=9659
* https://github.com/whatwg/html/commit/d98f83e
* https://github.com/validator/htmlparser/commit/9b9c263

Relates to https://github.com/validator/htmlparser/issues/35

Differential Revision: https://phabricator.services.mozilla.com/D122721
2021-08-17 10:09:10 +00:00
Michael[tm] Smith
21de022eae Bug 1650087 - Support “generate all implied end tags thoroughly” r=smaug
When the parser encounters a `</template>` end tag and there are other
open elements, the HTML spec requires the parser to “generate all
implied end tags thoroughly”, which unlike “generate implied end tags”
also includes generating implied end tags for table-parts elements
(caption, colgroup, tbody, thead, tfoot, td, th, and tr).

Differential Revision: https://phabricator.services.mozilla.com/D82020
2021-08-16 11:10:19 +00:00
Michael[tm] Smith
9b06c493c5 Bug 1650066 - Correct error for EOF in “in template” state r=smaug
Doing `errUnclosedElements(eltPos, "template")` for EOF in the “in
template” state results in the error message “End tag `template` seen, but
there were open elements”, which is all wrong because the actual problem is
that though a `template` end tag was expected, EOF was reached without a
`template` end tag being seen.

So let’s instead when we reach this just report the list of open elements.

Differential Revision: https://phabricator.services.mozilla.com/D122598
2021-08-16 05:16:58 +00:00
Henri Sivonen
c037109d37 Bug 1724920 - Sort headers in the generated parts of the HTML parser. r=smaug
Differential Revision: https://phabricator.services.mozilla.com/D122225
2021-08-11 08:08:52 +00:00
Simon Pieters
8932345bb3 Bug 1650329 - Improve message: bad start tag in noscript in head. r=alchen
Differential Revision: https://phabricator.services.mozilla.com/D82152
2020-08-03 12:30:12 +00:00
Michael[tm] Smith
8399e9fd77 Bug 1650320 - Drop parse error for missing </caption> end tag. r=alchen
See https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-incaption:stack-of-open-elements-2
The parse error for this case was dropped from the spec in
https://github.com/whatwg/html/commit/759ee62

Relates to https://github.com/validator/validator/issues/593
and https://bugzilla.mozilla.org/show_bug.cgi?id=1429415

Differential Revision: https://phabricator.services.mozilla.com/D82146
2020-07-06 12:45:48 +00:00
Michael[tm] Smith
c53017c5a8 Bug 1650090 - Stop reporting HTML4-specific parse errors. DONTBUILD NPOTB r=alchen
Differential Revision: https://phabricator.services.mozilla.com/D82021
2020-08-03 11:03:02 +00:00
Henri Sivonen
8f21b214e6 Bug 1636607 - Use prefix match for public identifiers that trigger the Almost Standards Mode. r=alchen
Implements a part of the spec change
https://searchfox.org/whatwg-html/diff/9345b201261c452868a68780ece85370f17644a3/source#42357
that was originally missed.

Differential Revision: https://phabricator.services.mozilla.com/D74658
2020-06-11 13:29:57 +00:00
Henri Sivonen
401466e015 Bug 1602944 - Move setting context to null. r=alchen
Differential Revision: https://phabricator.services.mozilla.com/D57965

--HG--
extra : moz-landing-system : lando
2020-01-03 14:28:37 +00:00
Henri Sivonen
88fc0bbf53 Bug 1603919 - Use [[fallthrough]] instead of MOZ_FALLTHROUGH in generated HTML parser code. r=cpeterson
Differential Revision: https://phabricator.services.mozilla.com/D57451

--HG--
extra : moz-landing-system : lando
2019-12-18 00:00:06 +00:00
Gabriele Svelto
5dc21d568c Bug 1600545 - Remove useless inclusions of header files generated from IDL files in modules/, netwerk/, parser/, security/, startupcache/, storage/, toolkit/, tools/, uriloader/, widget/, xpcom/ and xpfe/ r=Ehsan
The inclusions were removed with the following very crude script and the
resulting breakage was fixed up by hand. The manual fixups did either
revert the changes done by the script, replace a generic header with a more
specific one or replace a header with a forward declaration.

find . -name "*.idl" | grep -v web-platform | grep -v third_party | while read path; do
    interfaces=$(grep "^\(class\|interface\).*:.*" "$path" | cut -d' ' -f2)
    if [ -n "$interfaces" ]; then
        if [[ "$interfaces" == *$'\n'* ]]; then
          regexp="\("
          for i in $interfaces; do regexp="$regexp$i\|"; done
          regexp="${regexp%%\\\|}\)"
        else
          regexp="$interfaces"
        fi
        interface=$(basename "$path")
        rg -l "#include.*${interface%%.idl}.h" . | while read path2; do
            hits=$(grep -v "#include.*${interface%%.idl}.h" "$path2" | grep -c "$regexp" )
            if [ $hits -eq 0 ]; then
                echo "Removing ${interface} from ${path2}"
                grep -v "#include.*${interface%%.idl}.h" "$path2" > "$path2".tmp
                mv -f "$path2".tmp "$path2"
            fi
        done
    fi
done

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

--HG--
extra : moz-landing-system : lando
2019-12-06 09:17:57 +00:00
Henri Sivonen
e1d4e7fa2c Bug 1594672 - Add the "as" attribute to the HTML parser. r=alchen
Also makes mozilla/ImportScanner.h part of the translation process.

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

--HG--
extra : moz-landing-system : lando
2019-11-22 16:55:58 +00:00
Henri Sivonen
3623f75636 Bug 1562033. r=alchen
Differential Revision: https://phabricator.services.mozilla.com/D36361

--HG--
extra : moz-landing-system : lando
2019-07-08 07:33:59 +00:00
Jonathan Kingston
a5ba216f93 Bug 1315460 - Removal of keygen element r=keeler,baku,jld,hsivonen
Differential Revision: https://phabricator.services.mozilla.com/D22810

--HG--
extra : moz-landing-system : lando
2019-06-13 08:58:07 +00:00
Henri Sivonen
f09eac321f Bug 1540757 - Mark SVG scripts as malformed when popped by HTML breakout from foreign content. r=alchen
Differential Revision: https://phabricator.services.mozilla.com/D26276
2019-04-15 13:40:14 +03:00
Sylvestre Ledru
03c8e8c2dd Bug 1519636 - clang-format-8: Reformat recent changes to the Google coding style r=Ehsan
clang-format-8 upstream had some improvements wrt macros
See: https://reviews.llvm.org/D33440
This is why the diff is bigger than usual

# ignore-this-changeset

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

--HG--
extra : moz-landing-system : lando
2019-04-05 21:41:42 +00:00
Csoregi Natalia
ba58e936bd Backed out changeset 4ad80127f89f (bug 1519636) for bustage on MarkupMap.h and nsAccessibilityService.cpp. CLOSED TREE 2019-04-05 09:48:19 +03:00
Sylvestre Ledru
d1c1878603 Bug 1519636 - clang-format-8: Reformat recent changes to the Google coding style r=Ehsan
clang-format-8 upstream had some improvements wrt macros
See: https://reviews.llvm.org/D33440
This is why the diff is bigger than usual

# ignore-this-changeset

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

--HG--
extra : moz-landing-system : lando
2019-04-04 21:36:16 +00:00
Narcis Beleuzu
24dbe577a5 Backed out changeset 389b6bbd76db (bug 1519636) for bustages on MarkupMap.h . CLOSED TREE 2019-04-05 00:27:56 +03:00
Sylvestre Ledru
399dbd28fe Bug 1519636 - clang-format-8: Reformat recent changes to the Google coding style r=Ehsan
clang-format-8 upstream had some improvements wrt macros
See: https://reviews.llvm.org/D33440
This is why the diff is bigger than usual

# ignore-this-changeset

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

--HG--
extra : moz-landing-system : lando
2019-04-04 20:12:23 +00:00
Henri Sivonen
c798ef580c Bug 1534346 - Mark malformed SVG scripts as malformed for real. r=alchen
Differential Revision: https://phabricator.services.mozilla.com/D24347

--HG--
extra : moz-landing-system : lando
2019-03-21 20:39:22 +00:00
Henri Sivonen
34559b2b59 Bug 256180 parser part - Insert elements as siblings instead of children at the Blink-defined magic depth for compatibility. r=smaug.
MozReview-Commit-ID: K8fgv3rgklt
2019-01-11 09:44:09 +02:00
Andreea Pavel
f5a1a0f098 Backed out 5 changesets (bug 256180) for failing win xpcshell at xpcshell.ini:toolkit/mozapps/extensions/test/xpcshell/test_temporary.js on a CLOSED TREE
Backed out changeset e85e41f84971 (bug 256180)
Backed out changeset 125ebcfac58d (bug 256180)
Backed out changeset bc2e0a89d88e (bug 256180)
Backed out changeset b696df615c8b (bug 256180)
Backed out changeset 2d69841d2eb7 (bug 256180)
2019-01-08 20:35:31 +02:00
Henri Sivonen
7fdbc91b91 Bug 256180 parser part - Insert elements as siblings instead of children at the Blink-defined magic depth for compatibility. r=smaug.
MozReview-Commit-ID: K8fgv3rgklt
2019-01-08 18:08:37 +02:00
Henri Sivonen
feff447597 Bug 1515066 - Mark SVG script without an end tag malformed. r=smaug
Differential Revision: https://phabricator.services.mozilla.com/D15090

--HG--
extra : moz-landing-system : lando
2018-12-20 18:20:04 +00:00
Henri Sivonen
acfba8e927 Bug 1469580 - Ignore charset= in <meta content> if followed by unmatched quote. r=mrbkap
Differential Revision: https://phabricator.services.mozilla.com/D14410

--HG--
extra : moz-landing-system : lando
2018-12-14 17:53:59 +00:00
Coroiu Cristina
3e33183ebf Backed out changeset a145a897c94c (bug 1469580) for lin failure at /builds/worker/checkouts/gecko/tools/lint/wpt.yml 2018-12-14 12:33:15 +02:00
Henri Sivonen
20f693b781 Bug 1469580 - Ignore charset= in <meta content> if followed by unmatched quote. r=mrbkap
Differential Revision: https://phabricator.services.mozilla.com/D14410

--HG--
extra : moz-landing-system : lando
2018-12-13 18:48:09 +00:00
Sylvestre Ledru
265e672179 Bug 1511181 - Reformat everything to the Google coding style r=ehsan a=clang-format
# ignore-this-changeset

--HG--
extra : amend_source : 4d301d3b0b8711c4692392aa76088ba7fd7d1022
2018-11-30 11:46:48 +01:00
Emilio Cobos Álvarez
fe445c3367 Bug 1506133 - More HTML parser cleanup post bug 1392185. r=hsivonen
Differential Revision: https://phabricator.services.mozilla.com/D11480

--HG--
extra : moz-landing-system : lando
2018-11-12 14:37:09 +00:00
Sylvestre Ledru
01abd7ce40 Bug 1447480 - Add a MOZ_ASSERT to make it clear that it can never fall through r=hsivonen
MozReview-Commit-ID: Hq9jG1CVwRK

--HG--
extra : rebase_source : 4c548c1ad0c74b2c810b435701b91bd4f7893cb1
2018-04-03 13:40:59 +02:00
Tiberius Oros
1d7575065c Backed out 2 changesets (bug 1447480) for build bustages at dist/include/mozilla/Assertions.h:60 a=backout on a CLOSED TREE
Backed out changeset 5dfbd42ce515 (bug 1447480)
Backed out changeset a454ed4489f2 (bug 1447480)
2018-04-05 13:36:46 +03:00
Sylvestre Ledru
599ea080ac Bug 1447480 - Add a MOZ_ASSERT to make it clear that it can never fall through r=hsivonen
MozReview-Commit-ID: Hq9jG1CVwRK

--HG--
extra : rebase_source : 4c548c1ad0c74b2c810b435701b91bd4f7893cb1
2018-04-03 13:40:59 +02:00
Margareta Eliza Balazs
a06f511cc5 Backed out changeset fa109105e4ea (bug 1447480) for B failures in /build/build/src/parser/html/nsHtml5TreeBuilder.cpp(402) on a CLOSED TREE 2018-04-04 16:05:06 +03:00
Sylvestre Ledru
40fe59d2a8 Bug 1447480 - Add a MOZ_ASSERT to make it clear that it can never fall through r=hsivonen
MozReview-Commit-ID: Hq9jG1CVwRK

--HG--
extra : rebase_source : 4c548c1ad0c74b2c810b435701b91bd4f7893cb1
2018-04-03 13:40:59 +02:00
Boris Zbarsky
4e402f9b99 Bug 1445983. <bdi> should be an HTMLElement, not HTMLUnknownElement. r=hsivonen
MozReview-Commit-ID: 9eJ45uXRDfR
2018-03-16 11:26:09 -04:00
Boris Zbarsky
46fc331568 Bug 1446097. Switch to "set" as the canonical nsGkAtoms name of the string "set", so it matches the actual tag name "set" in SVG. r=hsivonen,njn
Most of the noise is from the fact that clang-format on parser/html/*.{h,cpp}
reformatted all sorts of stuff.  Not running it caused lots of format changes
from the generator... I guess we changed the format rules since the last time
this got run?

MozReview-Commit-ID: IA2G87zUIKN
2018-03-16 11:26:06 -04:00
Sylvestre Ledru
9e661550b7 Bug 1426997 - Add MOZ_FALLTHROUGH_ASSERT to make it clear that it can never fall through r=hsivonen
MozReview-Commit-ID: KZvVGnlJZtr

--HG--
extra : rebase_source : 0596528de97d4ae42c13f56d264099c7654d90f1
2018-01-29 09:11:08 +01:00
Henri Sivonen
71f07dccfb Bug 1424220 - Set mCurrentHtmlScriptIsAsyncOrDefer to false when restoring tree builder state. r=smaug
MozReview-Commit-ID: 9gsFme52mOG

--HG--
extra : rebase_source : d71040069ff4b3db476bf4cf3c08258def019f5a
2018-01-15 20:07:28 +02:00
Chris Peterson
5b8dabf526 Bug 1424548 - Part 11: Regenerate HTML parser code with MOZ_FALLTHROUGH annotations. r=hsivonen
And stop suppressing -Wimplicit-fallthrough warnings. We no longer need to suppress these clang warnings because the generated parser code now includes MOZ_FALLTHROUGH annotations.

--HG--
extra : rebase_source : d766c9b17de878138df6d949ee720dfaf0ed370a
2017-12-01 01:05:26 -08:00
Chris Peterson
946cc287a2 Bug 1424548 - Part 9a: clang-format generated HTML parser code. r=hsivonen
--HG--
extra : rebase_source : 67a0555475dbce49c689d27510dca252089a4a7b
2017-12-21 00:02:43 -08:00
Nicholas Nethercote
d225f7151b Bug 1400460 - Rename nsIAtom as nsAtom. r=hiro.
(Path is actually r=froydnj.)

Bug 1400459 devirtualized nsIAtom so that it is no longer a subclass of
nsISupports. This means that nsAtom is now a better name for it than nsIAtom.

MozReview-Commit-ID: 91U22X2NydP

--HG--
rename : xpcom/ds/nsIAtom.h => xpcom/ds/nsAtom.h
extra : rebase_source : ac3e904a21b8b48e74534fff964f1623ee937c67
2017-10-03 09:05:19 +11:00
Sebastian Hengst
5573e8270f Backed out changeset 0ce8d073a16e (bug 256180) 2017-09-28 11:30:33 +02:00
Henri Sivonen
b245e01efe Bug 256180 parser part - Insert elements as siblings instead of children at the Blink-defined magic depth for compatibility. r=smaug
MozReview-Commit-ID: K8fgv3rgklt

--HG--
extra : rebase_source : 3ad91a01805afcd1aeac89a5f2d5ac38dac1797b
2017-09-12 16:57:05 +03:00
Henri Sivonen
2607c163b1 Bug 1375701 - Atomize class attribute value in the parser in the innerHTML case. r=Ehsan
MozReview-Commit-ID: CKyGlzYS15e

--HG--
extra : rebase_source : 9ece88d9c85d98665413a7f9d730d7ff149d8486
2017-08-11 09:22:57 +03:00