Граф коммитов

68 Коммитов

Автор SHA1 Сообщение Дата
Miko Mynttinen ddec6eef59 Bug 1714584 - Part 1: Decouple nsDisplayList internal list from nsDisplayItems r=mstange
Differential Revision: https://phabricator.services.mozilla.com/D138152
2022-02-22 23:42:18 +00:00
Norisz Fay 2121660ce9 Backed out 2 changesets (bug 1714584) per devs request for causing crashes a=backout
Backed out changeset 3baead3e079b (bug 1714584)
Backed out changeset a2da895a58ce (bug 1714584)
2022-02-22 16:41:57 +02:00
Miko Mynttinen 28474c7ad2 Bug 1714584 - Part 1: Decouple nsDisplayList internal list from nsDisplayItems r=mstange
Differential Revision: https://phabricator.services.mozilla.com/D138152
2022-02-22 00:44:25 +00:00
Daniel Holbert 080e18fa47 Bug 1663722: Make nsPageSequenceFrame gracefully handle SizeToContent calls. r=emilio
nsPageSequenceFrame does a thing where it grows its desired size to fit the
AvailableISize and ComputedBSize (under the assumption that those are the
actual dimensions of our scrollport, which it wants to make maximal use of).

This behavior causes trouble when it's reflowed under the privileged
'sizeToContent' JS API.  That API makes us reflow with nscoord_MAX as the
viewport's ComputedBSize(), and this nscoord_MAX value gets passed down to be
the nsPageSequenceFrame's ComputedBSize as well.  When we reach the code in
question, we dutifully grow the desired size to that bogus huge value, which is
clearly wrong.

This patch addresses this issue by simply declining to grow the desired size in
the scenario where ComputedBSize() is unconstrained.  This leaves us with
reasonable values for our desired size (which are actually based on the
content, which makes it the right thing to do for the purpose of a
SizeToContent() call).

Differential Revision: https://phabricator.services.mozilla.com/D135762
2022-01-13 06:08:51 +00:00
Greg Tatum d642b72ac3 Bug 1715892 - Unify locale/DateTimeFormat to mozilla::intl::AppDateTimeFormat; r=platform-i18n-reviewers,dminor
I considered removing this class initially, but it's actually a pretty
useful abstraction over the DateTimeFormat interface when used
specifically with Gecko. It applies the OS preferences and provides some
caching behavior.

Differential Revision: https://phabricator.services.mozilla.com/D131671
2021-12-01 17:41:37 +00:00
Marian-Vasile Laza 3bfa529b3e Backed out 6 changesets (bug 1715892, bug 1719735) for causing bc test failures. CLOSED TREE
Backed out changeset 196952bd8c9c (bug 1715892)
Backed out changeset 9105fe01c025 (bug 1715892)
Backed out changeset 4c15d1a24ccd (bug 1715892)
Backed out changeset 2c328b84285f (bug 1715892)
Backed out changeset 8fcdcdf44b62 (bug 1719735)
Backed out changeset c48f398e301f (bug 1719735)
2021-11-30 23:30:59 +02:00
Greg Tatum 9b5497020e Bug 1715892 - Unify locale/DateTimeFormat to mozilla::intl::AppDateTimeFormat; r=platform-i18n-reviewers,dminor
I considered removing this class initially, but it's actually a pretty
useful abstraction over the DateTimeFormat interface when used
specifically with Gecko. It applies the OS preferences and provides some
caching behavior.

Differential Revision: https://phabricator.services.mozilla.com/D131671
2021-11-30 19:05:58 +00:00
Emilio Cobos Álvarez a4e7c9e510 Bug 1722945 - Support break-inside: avoid-{page,column}. r=TYLin
break-before/after: page|column seem harder because you need to deal
with nested breaks, I think, but this should be straight-forward.

Differential Revision: https://phabricator.services.mozilla.com/D121206
2021-08-03 17:56:58 +00:00
Noemi Erli 89a565ea85 Backed out changeset 67c33ba5566e (bug 1722945) for causing bustage in nsContainerFrame.cpp 2021-08-03 20:35:10 +03:00
Emilio Cobos Álvarez 3d1b4f252f Bug 1722945 - Support break-inside: avoid-{page,column}. r=TYLin
break-before/after: page|column seem harder because you need to deal
with nested breaks, I think, but this should be straight-forward.

Differential Revision: https://phabricator.services.mozilla.com/D121206
2021-08-03 13:59:47 +00:00
Jonathan Kew 63f05b6d5a Bug 454059 - Add a new PaintForPrinting display list builder mode, and only create a Linkifier when printing. r=mstange
Differential Revision: https://phabricator.services.mozilla.com/D114474
2021-05-11 17:00:30 +00:00
Emilio Cobos Álvarez 3aa2544989 Bug 1700379 - Move code dealing with transform getters to the frame that we actually wrap its contents around. r=miko
This shouldn't change behavior, but simplifies the setup quite a bit, I
think.

Differential Revision: https://phabricator.services.mozilla.com/D109510
2021-05-04 18:46:44 +00:00
Alexandru Michis 6641f79c95 Backed out changeset 0229f8dc291a (bug 1700379) for causing failures in test_printpreview.xhtml
CLOSED TREE
2021-05-03 22:10:12 +03:00
Emilio Cobos Álvarez baca44f241 Bug 1700379 - Move code dealing with transform getters to the frame that we actually wrap its contents around. r=miko
This shouldn't change behavior, but simplifies the setup quite a bit, I
think.

Differential Revision: https://phabricator.services.mozilla.com/D109510
2021-05-03 17:59:47 +00:00
Emilio Cobos Álvarez 51a69dce6a Bug 1700379 - Remove unused nsDisplayListBuilder::IsInPageSequence. r=miko
Differential Revision: https://phabricator.services.mozilla.com/D109509
2021-03-23 18:02:49 +00:00
Mats Palmgren 6adb31f151 Bug 1698235 - Add some error handling when using RemotePrintJobChild which may be destroyed. r=TYLin
Differential Revision: https://phabricator.services.mozilla.com/D108711
2021-03-18 19:39:09 +00:00
Emilio Cobos Álvarez 5a6d8228c8 Bug 1691858 - Minor cleanup of our @page rule setup. r=AlaskanEmily
Actually, there's not so much we can improve right now, in the sense
that:

 * We need the ::-moz-page-content pseudo-element to be able to set
 `display` on the page, since that's a style rule rather than a @page
 rule. We could get away without it.

 * Keeping the current code-path (slightly cleaned up) is less code, for
 now at least. We can have a separate code-path or what not that
 actually performs the @page rule selector-matching and what not if
 needed when we get to named pages or other page selectors. Selectors
 like :first should be pretty trivial to implement, actually.

We make some paged mode anon boxes non-inheriting anon boxes. This
allows us to share the styles and is generally nicer. They don't need to
inherit from anywhere.

We could remove the origin handling and don't look at UA rules or what
not, but it seems pretty harmless to do that.

We also fix the name of the pseudo-elements to match the capitalization.

Differential Revision: https://phabricator.services.mozilla.com/D104772
2021-02-12 15:42:38 +00:00
Daniel Holbert 741687aeee Bug 1686494 part 2: When gathering printed canvas elements for PDF.js, skip canvases on pages that aren't in the user's custom print range. r=TYLin
This code currently does a recursive tree-traversal to get a list of all canvas
elements that might be used for PDF.js content, so that we can invoke the
appropriate callbacks on them to let PDF.js prepare for printing.

In this patch, I'm adjusting the outermost level of that traversal to make it
aware of the fact that PrintedSheetFrames may now contain many skipped
nsPageFrames whose content we don't want to render.

Depends on D101941

Differential Revision: https://phabricator.services.mozilla.com/D101942
2021-01-15 19:39:09 +00:00
Daniel Holbert 1ad8b7a2ee Bug 1686494 part 1: Change return type of nsPageSequence::GetCurrentSheetFrame to the actual concrete type, PrintedSheetFrame*, instead of nsIFrame*. r=TYLin
This patch doesn't change behavior; it just adds a static_cast to a
more-specific type that we know the variable has, and updates the signature and
callsites.

(The next patch will make use of the fact that we know this type.)

Differential Revision: https://phabricator.services.mozilla.com/D101941
2021-01-15 18:17:47 +00:00
Daniel Holbert af327bde4e Bug 1669905 part 3: Add support for 2 and 6 as options for pages-per-sheet, in the print-related frame classes (and add tests for these values). r=TYLin
Differential Revision: https://phabricator.services.mozilla.com/D99553
2021-01-05 02:13:03 +00:00
Daniel Holbert 345e76ee7a Bug 1681623: Simplify pages-per-sheet data & logic to only store a single track count (either the row or column count), since the other one is implicit. r=TYLin
This patch doesn't change behavior.  It's just a simplification of the data
that we track for our different pages-per-sheet mode (with some minor
refactoring of the logic involved).

This is a necessary step towards implementing support for 2 and 6
pages-per-sheet (which are referenced in comments included in this patch,
and which will be implemented separately in bug 1669905)

Differential Revision: https://phabricator.services.mozilla.com/D99180
2020-12-10 00:58:43 +00:00
Emilio Cobos Álvarez a49800a500 Bug 1679706 - Communicate to the front-end whether there are no visible pages at all. r=jfkthame
This will allow them to react however they want to empty page ranges as
a result of another setting change.

Differential Revision: https://phabricator.services.mozilla.com/D98183
2020-12-02 21:48:03 +00:00
Emilio Cobos Álvarez 771dd03229 Bug 1669854 - Add a single pageRanges print setting. r=nordzilla
... which is an array of pairs of ranges, and use it instead of the
existing printRange / startPage / endPage settings.

Differential Revision: https://phabricator.services.mozilla.com/D96093
2020-11-07 16:01:57 +00:00
Dan Minor c7c8e3f274 Bug 1669573 - Rename kTimeFormatSeconds and kTimeFormatNoSeconds; r=zbraniecki
This renames kTimeFormatSeconds to kTimeFormatLong and kTimeFormatNoSeconds to
kTimeFormatShort. This is consistent with the naming used for date format
selectors.

Differential Revision: https://phabricator.services.mozilla.com/D93011
2020-10-15 12:20:15 +00:00
Daniel Holbert 86836a67bf Bug 1631452 part 2: Add the pages-per-sheet info to nsSharedPageData and use it to control the number of pages that end up on a PrintedSheetFrame. r=TYLin,mattwoodrow
The idea here is that we reflow each page as if it were the only page on its
sheet, and then we transform it as-needed to put it in the right
"pages-per-sheet" cell, at paint time.

LIMITATION: Right now I haven't implemented the values "2" and "6", since those
will involve a bit of extra complexity to rotate the sheet to be orthogonal to
the page sizes (and to only do that if the page's aspect ratio merits it). That
will be covered in followup bug 1669905.

Differential Revision: https://phabricator.services.mozilla.com/D86800
2020-10-13 23:30:42 +00:00
Daniel Holbert fd2a60b29e Bug 1669774 part 1: Rename some nsPageSequenceFrame APIs and vars with s/page/sheet/for accuracy. r=TYLin
Differential Revision: https://phabricator.services.mozilla.com/D92789
2020-10-07 20:59:05 +00:00
Daniel Holbert 06a402acb0 Bug 1661868 part 2: Unify page-range handling logic, to assume all PrintedSheetFrames should be printed (and let them manage page-range-based skipping during layout). r=TYLin
This patch does the following things:

(1) It removes the legacy page-range-handling function
"DetermineWhetherToPrintPage()", and it now will always print every
PrintedSheetFrame.

(2) It activates PrintedSheetFrame's page-range handling function so that it
can take over responsibility for skipping pages during print operations.

(3) It adjusts the nsPrintJob code that kicks off individual asynchronous
"print the next page" operations (which is now really "print the next
PrintedSheetFrame).  This nsPrintJob code used to have page-range-related
handling interwoven into it, and that handling isn't necessary anymore now that
we're handling page-skipping up front at layout time.

(4) It replaces the mPageNum member-var (which tracks which page we're about to
print or are currently printing) with mCurrentSheetIdx, which is now a 0-based
index into the list of PrintedSheetFrame instances.

(5) It removes nsPrintData:mNumPagesPrinted, which was only used for
progress-bar-completion updates & which basically tracked the same information
that I'm tracking in the new mCurrentSheetIdx variable.

There's some additional cleanup that we should do after this lands (e.g. some
s/page/sheet/ renamings) but I'm holding off on that for now, to keep this
patch relatively targeted.

Differential Revision: https://phabricator.services.mozilla.com/D92660
2020-10-07 20:51:56 +00:00
Daniel Holbert 63230729cd Bug 1669375 part 2: Remove code that partially implemented the "print only even/odd pages" feature. r=jwatt
This code looked like it might work, but it seems to have only ever been backed
by per-printer about:config prefs.  I believe we only ever exposed UI for this
feature on Linux, via the native GTK dialog; and even there, the UI doesn't
actually seem to have done anything -- it was never wired up to the actual
implementation of even/odd page-skipping.

Differential Revision: https://phabricator.services.mozilla.com/D92528
2020-10-06 15:33:29 +00:00
Emilio Cobos Álvarez c921f4ff34 Bug 1664227 - The default page margin should be at least the unwriteable section, but not added on top. r=jwatt
We were adding the unwriteable to the default margin. I was going to
consider not painting the headers / footers if they overlapped with the
content box of the page, but turns out our default configuration
overlaps slightly at the bottom, so I just punted on that.

Users can remove the headers / footers quite easily anyhow.

Differential Revision: https://phabricator.services.mozilla.com/D89794
2020-09-10 18:03:04 +00:00
Emilio Cobos Álvarez 61f701951d Bug 1664227 - Grab the print settings in nsPageSequenceFrame::Init. r=jwatt
We should always have sane print settings by then. This avoids other
confusing checks elsewhere.

Depends on D89792

Differential Revision: https://phabricator.services.mozilla.com/D89793
2020-09-10 17:39:59 +00:00
Emilio Cobos Álvarez 5ed9da2bf7 Bug 1664205 - Simplify rect getters in nsIPrintSettings. r=jwatt
Differential Revision: https://phabricator.services.mozilla.com/D89778
2020-09-10 15:25:59 +00:00
Emilio Cobos Álvarez 97ac4d259f Bug 1662456 - Remove HTMLCanvasElement::CountContexts and related code. r=nical
Canvas only has one context, and that assumption is pretty baked into
the code, so having an API that pretends otherwise is silly.

Differential Revision: https://phabricator.services.mozilla.com/D88990
2020-09-02 14:20:50 +00:00
Daniel Holbert f2ab159f03 Bug 1659005 part 2: Make nsPageSequenceFrame determine its page range information earlier on, at the start of reflow. r=TYLin
This patch shouldn't change behavior.

After this change, we'll be able to reason about the page range during reflow
(in a later patch in this series). The old place where we determine the
page-range information -- in nsPageSequenceFrame::StartPrint -- unfortunately
runs *after* reflow.  So that was running too late for the information to be
useful when we're laying out pages on sheets.

Differential Revision: https://phabricator.services.mozilla.com/D88469
2020-08-28 22:27:42 +00:00
Daniel Holbert 2e3917b1b1 Bug 1659005 part 1: Move nsPageSequenceFrame's page-range-specific members into nsSharedPrintData. r=TYLin
This patch shouldn't change behavior at all; it's just moving some member
variables to a new home on a helper-struct (and the struct's lifetime is the
same as the lifetime of the nsPageSequenceFrame where these member variables
lived, prior to this patch).

These members need to move so that PrintedSheetFrame can have access to them.
PrintedSheetFrame is now where pages are generated, and it will handle our
page-range-induced page skipping, as of a later patch in this series.

Differential Revision: https://phabricator.services.mozilla.com/D88468
2020-08-28 22:27:34 +00:00
Daniel Holbert b8192a4fc2 Bug 1660502 part 2: Rename nsSharedPageData::mTotNumPages to mRawNumPages, for consistency. r=TYLin
Differential Revision: https://phabricator.services.mozilla.com/D87887
2020-08-24 23:53:27 +00:00
Emilio Cobos Álvarez b17bb7ed34 Bug 1660251 - After bug 1658173 we need to re-center pages if any dimensions change, not just if width changes. r=dholbert
Differential Revision: https://phabricator.services.mozilla.com/D87757
2020-08-20 16:23:48 +00:00
Daniel Holbert 335b4750cb Bug 1660166 part 3: Remove a redundant member-variable that represents the total number of pages. r=hiro
Before this patch stack, nsPageSequenceFrame and every nsPageFrame each
individually tracked the number of pages.

As of the previous patch, we've coalesced the nsPageFrame variables into a
single variable that lives on nsSharedPageData.  This patch here replaces
nsPageSequenceFrame's member-var with that nsSharedPageData variable, too.

Depends on D87696

Differential Revision: https://phabricator.services.mozilla.com/D87697
2020-08-20 06:16:04 +00:00
Daniel Holbert b39ca4f982 Bug 1660166 part 2: Let nsPageFrame determine its own page number, and store total number of pages in one central spot. r=hiro
Depends on D87695

Differential Revision: https://phabricator.services.mozilla.com/D87696
2020-08-20 06:12:33 +00:00
Emilio Cobos Álvarez 7c7897149c Bug 1414600 - Make media queries and viewport units in print be evaluated against the default page size minus margins. r=dholbert,nordzilla
For that, move the default page margin computation to nsPresContext.

See https://github.com/w3c/csswg-drafts/issues/5437 as to why doing this
and other alternatives.

Differential Revision: https://phabricator.services.mozilla.com/D87311
2020-08-19 10:32:16 +00:00
Csoregi Natalia 9af7b6fe90 Backed out changeset b6d1532f6cd4 (bug 1414600) for failures on mq_print_height.xhtml . CLOSED TREE 2020-08-19 04:58:49 +03:00
Emilio Cobos Álvarez ae622cd8cd Bug 1414600 - Make media queries and viewport units in print be evaluated against the default page size minus margins. r=dholbert,nordzilla
For that, move the default page margin computation to nsPresContext.

See https://github.com/w3c/csswg-drafts/issues/5437 as to why doing this
and other alternatives.

Differential Revision: https://phabricator.services.mozilla.com/D87311
2020-08-19 00:02:34 +00:00
Daniel Holbert 4e78d2ce23 Bug 1658173 part 2: Scale down print-preview so that every sheet fits into the scrollport, in both dimensions (not just the inline axis). r=emilio
Note: Previously we were scaling based on the available ISize (and we were
ignoring the BSize for scaling purposes).  Now we want to consider the BSize as
well, so the obvious next step would be to scale based on the available BSize -
but that doesn't work, because the available BSize is unconstrained here. (It's
unconstrained, even though we're fragmenting, because thankfully we don't
attempt to fragment the nsPageSequenceFrame itself -- we only fragment at a
level further down in the frame tree.)

So: this patch changes us to instead scale down based on the *computed* size
(rather than the available size), such that both dimensions fit.  The computed
size here is the size of the scrollport; and, importantly, it has a finite
value in the block axis (unlike the *available* BSize which is unconstrained
here).

Note that the available ISize and the computed ISize are the same in this case
(they're both the ISize of the scrollport), so there's no behavior-change here
for the computation of the inline-axis-based scale factor.

Differential Revision: https://phabricator.services.mozilla.com/D87021
2020-08-17 21:08:37 +00:00
Bogdan Tara a773454b8e Backed out changeset b21c793d9d52 (bug 1658173) for test_printpreview.xhtml failures CLOSED TREE 2020-08-15 04:25:23 +03:00
Daniel Holbert 3609cf24bc Bug 1658173: Scale down print-preview so that every sheet fits into the scrollport, in both dimensions (not just the inline axis). r=emilio
Note: Previously we were scaling based on the available ISize (and we were
ignoring the BSize for scaling purposes).  Now we want to consider the BSize as
well, so the obvious next step would be to scale based on the available BSize -
but that doesn't work, because the available BSize is unconstrained here. (It's
unconstrained, even though we're fragmenting, because thankfully we don't
attempt to fragment the nsPageSequenceFrame itself -- we only fragment at a
level further down in the frame tree.)

So: this patch changes us to instead scale down based on the *computed* size
(rather than the available size), such that both dimensions fit.  The computed
size here is the size of the scrollport; and, importantly, it has a finite
value in the block axis (unlike the *available* BSize which is unconstrained
here).

Note that the available ISize and the computed ISize are the same in this case
(they're both the ISize of the scrollport), so there's no behavior-change here
for the computation of the inline-axis-based scale factor.

Differential Revision: https://phabricator.services.mozilla.com/D87021
2020-08-14 22:10:48 +00:00
Emilio Cobos Álvarez 31a5cfa91b Bug 1659084 - Clean up some nsPageSequenceFrame. r=jfkthame
Differential Revision: https://phabricator.services.mozilla.com/D87061
2020-08-14 12:23:39 +00:00
Daniel Holbert 96d67c6eb3 Bug 1652278 part 2: Flesh out PrintedSheetFrame implementation so that it serves as the container for nsPageFrame. r=TYLin
This patch:
- Creates an anon-box pseudo-style for PrintedSheetFrame, in part so that it
  can co-opt the styles that we formerly gave to page-frames in ua.css, to draw
  the sheet of paper and the shadow in Print Preview.
- Adjusts nsCSSFrameConstructor to create a PrintedSheetFrame as the parent of
  nsPageFrame (inserting between it and its nsPageSequenceFrame container, in
  the frame tree).
- Fleshes out out a simple BuildDisplayList() implementation for
  PrintedSheetFrame (taking the responsibility for "paper"-drawing from
  nsPageFrame).
- Fleshes out a simple Reflow implementation for PrintedSheetFrame, just
  placing the child page (assuming there's only one for now) at the origin.
- Adjusts nsPageFrame and nsPageSequenceFrame to account for the fact that
  there's another layer between them now.

Note that PrintedSheetFrame needs to implement AppendDirectlyOwnedAnonBoxes()
(just as nsSimplePageSequence and nsPageFrame do), since it owns anonymous
nsPageFrame instances. This implementation only needs to append the first
child, as explained in the code-comment and in
https://bugzilla.mozilla.org/show_bug.cgi?id=1374761#c9 (and of course, for
now, PrintedSheetFrame only has one child at a time anyway.)

Differential Revision: https://phabricator.services.mozilla.com/D83457
2020-08-05 03:28:32 +00:00
Daniel Holbert ab6826ce32 Bug 1655608 part 3: Fix ReflowOutput/ReflowInput mismatch in nsPageSequenceFrame. r=TYLin
For a given ::Reflow call, we have an expectation that the ReflowInput and
ReflowOutput should be "matching".  In particular: we should use the
ReflowInput to initialize the ReflowOutput, and we should pass both of these to
the frame's Reflow method.

In current mozilla-central (prior to this patch), nsPageSequenceFrame violates
this expectation when it prepares to reflow its children, in the following
ways:
1) It passes in the wrong ReflowInput as an arg when constructing a
   ReflowOutput struct for its children. (It passes *its own* ReflowInput arg,
   rather than the ReflowInput for the child that it's about to reflow.)
2) It *reuses* that single ReflowOutput structure *for all of its children*,
   which means that sizing information from one child will end up improperly
   influencing later children by "leaking through".

This results in overflow areas that are artificially too large on nsPageFrames,
because ReflowOutput populates its overflow areas via "union()" operations. So
the improperly-reused ReflowOutput produces a strictly larger overflow area
on each subsequent page (even if the page doesn't actually have any overflow).

This patch fixes these problems by creating a new ReflowOutput for each child,
and initializing it with the correct ReflowInput instance.

Notably, this patch *is* a behavior-change (in the direction of correctness).
In particular, we won't have artificially-inflated overflow areas on later
nsPageFrame instances anymore, and so now some of our automated testcases
trigger assertion-failures that they were getting around before. These all
seem to be versions of https://bugzilla.mozilla.org/show_bug.cgi?id=1655630
which, "fortunately", is already reproducible (under certain paper sizes)
even in a build from current mozilla-central, without this here patch.

Differential Revision: https://phabricator.services.mozilla.com/D85098
2020-07-28 22:43:46 +00:00
Daniel Holbert 9afcc22e25 Bug 1655608 part 2: Modernize naming of ReflowOutput variables/parameters, throughout nsPage*Frame classes. r=TYLin
Differential Revision: https://phabricator.services.mozilla.com/D85097
2020-07-28 22:11:26 +00:00
Daniel Holbert 172b12cd5c Bug 1654452 part 3: Misc cleanup in nsPageSequenceFrame: reorder stray include, drop unused define, use 'auto', remove unnecessary 'rv' var. r=TYLin
Depends on D84534

Differential Revision: https://phabricator.services.mozilla.com/D84535
2020-07-22 18:40:51 +00:00
Daniel Holbert 6552a848b7 Bug 1654452 part 2: Use range-based for loops to iterate nsPageSequenceFrame children. r=TYLin
Depends on D84463

Differential Revision: https://phabricator.services.mozilla.com/D84534
2020-07-22 20:19:09 +00:00