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

520 Коммитов

Автор SHA1 Сообщение Дата
Ryan Hunt 2feee8e648 Bug 1500257 part 8 - Remove dependency on RenderFrame from nsDisplayRemote. r=aosmond
This commit removes the dependency on RenderFrame from nsDisplayRemote so that
it can work in child processes with remote subframes. Instead nsDisplayRemote
now works with an nsFrameLoader, which will return the LayerId from either
the RenderFrame (for top-level remote browsers), or from RemoteFrameChild
(for remote subframes).

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

--HG--
extra : source : 1e1b5cd23412a85fad19ab8ec5aacf31b3a9c9b6
extra : intermediate-source : a62c029510315d109faa9edb31216014e7c70367
extra : histedit_source : 3df246e632fbb71f731c856779e0d2201b3673a3
2019-01-23 11:07:57 -06:00
Ryan Hunt a0478b2152 Bug 1500257 part 7 - Modify RenderFrame to hold onto TabParent instead of nsFrameLoader. r=aosmond
A TabParent for a remote subframe will have the same owner content as the top-level
remote browser. This means that 'TabParent::GetFrameLoader()' will return the
frame loader of the top-level remote browser.

This is fine for getting the layer manager and compositor for connecting layer trees,
but the frame loader is also used to acquire a TabParent for its process ID. This
is incorrect in the remote subframe case, and will lead to the compositor rejecting
layer transactions for the remote subframe because it will only accept them from
the top-level remote browser's process.

This commit switches RenderFrame to just hold on to TabParent, and acquire the
nsFrameLoader as necessary.

Another change is to RenderFrame::SetOwnerContent. Previously this method would
take the new owner content and check an assertion. I don't see much value in the
assertion, so I've removed it. Additionally, now that we acquire the owner content,
and therefore the layer manager, from TabParent, we need to ensure that
RenderFrame::SetOwnerContent is ran after the TabParent has had it's owner content
updated. So the callsite has been moved into TabParent. This resolved a test failure
with frame loader swapping.

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

--HG--
extra : source : 4c85fb68f2ed297828bf4646301c2d80d1c8e0a1
extra : intermediate-source : 62ad54fb95eb76f88865f43da1a5d556421e7884
extra : histedit_source : 6b7085118bca83433b26fcec3983a385bd536672
2019-01-23 09:52:30 -06:00
Ryan Hunt 17b0dd2cd6 Bug 1500257 part 6 - Update documentation for RenderFrame and nsDisplayRemote. r=aosmond
The documentation for these pieces are a bit out of date.

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

--HG--
extra : source : ba62cc27c32f4d8a3fefff8eee5bf47d270130bc
extra : intermediate-source : caafb04b7dd44d607adfa1f5f5cabcd42e367cf4
2019-01-23 09:34:29 -06:00
Alex Gaynor 0f01791ffc Bug 1512990 - Part 4 - remove declarations of Recv/Answer methods from IPDL protocol base class; r=froydnj
For cases where the class has direct calls (that is, we cast `this` to the
subclass before making the call) no longer declare Recv/Answer methods on the
base class at all. This should ensure that slots for them are not generated in
vtables, and also allow the derived class to choose the method signature (e.g.
whether it wants to take something by reference or by value).

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

--HG--
extra : moz-landing-system : lando
2019-02-06 15:58:43 +00:00
Alex Gaynor 75c7d1fa76 Bug 1512990 - Part 2 - implement direct calls in the IPDL compiler; r=froydnj
When calling a Recv/Alloc/Dealloc method on most types, cast `this` to the
derived class.

There is a heuristic to figure out what the correct derived type is. There is a
blacklist of types which we can't do direct calls on for the moment, as well as
an override for types that do work with direct calls but which don't match the
heuristic.

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

--HG--
extra : moz-landing-system : lando
2019-02-06 15:57:37 +00:00
Doug Thayer a848222b53 Bug 1441308 - Split out document pieces of WebRenderLayerManager r=jrmuizel
Per our discussion, this patch splits out the state management bits of
WebRenderLayerManager, allowing for them to be maintained per-document.

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

--HG--
extra : moz-landing-system : lando
2019-01-07 21:33:10 +00:00
Emilio Cobos Álvarez d2ed260822 Bug 1517241 - Rename nsIDocument to mozilla::dom::Document. r=smaug
Summary: Really sorry for the size of the patch. It's mostly automatic
s/nsIDocument/Document/ but I had to fix up in a bunch of places manually to
add the right namespacing and such.

Overall it's not a very interesting patch I think.

nsDocument.cpp turns into Document.cpp, nsIDocument.h into Document.h and
nsIDocumentInlines.h into DocumentInlines.h.

I also changed a bunch of nsCOMPtr usage to RefPtr, but not all of it.

While fixing up some of the bits I also removed some unneeded OwnerDoc() null
checks and such, but I didn't do anything riskier than that.
2019-01-03 17:48:33 +01:00
Matt Woodrow e3453844bf Bug 1510853 - Introduce VsyncId and VsyncEvent for identifying vsyncs without timestamp comparisons. r=jrmuizel
MozReview-Commit-ID: 6TO6hYOdJYo

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

--HG--
extra : moz-landing-system : lando
2018-12-07 23:27:28 +00:00
Ciure Andrei 22c96f2cb4 Backed out 4 changesets (bug 1510853) for TelemetryHistogramEnums.h build bustages CLOSED TREE
Backed out changeset 80baa7b09930 (bug 1510853)
Backed out changeset d1ef6db7fc28 (bug 1510853)
Backed out changeset ae190948ad73 (bug 1510853)
Backed out changeset 0ade0aa77b2f (bug 1510853)
2018-12-07 19:38:47 +02:00
Matt Woodrow 6c3cd9bd00 Bug 1510853 - Introduce VsyncId and VsyncEvent for identifying vsyncs without timestamp comparisons. r=jrmuizel
MozReview-Commit-ID: 6TO6hYOdJYo

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

--HG--
extra : moz-landing-system : lando
2018-12-07 17:06:11 +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
Andrea Marchesini 7c7e94be60 Bug 1438945 - Part 8: RemoteWorker IPC. r=asuth
--HG--
extra : rebase_source : 06a8e3a2e60d6ff9596fcbacbd4356368475d3d4
2018-11-19 15:18:32 -08:00
Ryan Hunt 5b463a82c1 Bug 1503655 part 11 - Rename RenderFrameParent to RenderFrame. r=kats
Differential Revision: https://phabricator.services.mozilla.com/D11114

--HG--
rename : layout/ipc/RenderFrameParent.cpp => layout/ipc/RenderFrame.cpp
rename : layout/ipc/RenderFrameParent.h => layout/ipc/RenderFrame.h
extra : rebase_source : d47ebaef909d8705a7d5d9d2eab8ca2053f58054
extra : histedit_source : dc40313790b59161b3df86c09efb7092bcedb5d8
2018-11-06 15:35:37 -06:00
Ryan Hunt 0a96f8f366 Bug 1503655 part 8 - Make RenderFrameParent a direct member of TabParent. r=kats
This gets rid of an unnecessary allocation.

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

--HG--
extra : rebase_source : 138c808d78e666e55242bf142269d77fb065d7a6
extra : histedit_source : de8f5f4566cb886e155bce1a22e36f40af7b26f7
2018-11-05 15:20:55 -06:00
Ryan Hunt 542d6b72a0 Bug 1503655 part 6 - Move all RenderFrameParent destruction logic to TabParent::ActorDestroy. r=kats
This commit removes all destruction code for RenderFrameParent to be handled by
TabParent. It's important that we remove the layer mapping in ActorDestroy to
prevent a race condition where the TabChild isn't fully destroyed yet and
sends a LayerTransaction constructor to the compositor and hits an
assertion.

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

--HG--
extra : rebase_source : 61df2cfa3867617c39805883c06649624fffa518
extra : histedit_source : a810303ec335b4ab064dbd56b4652ea4c66deaad
2018-11-05 14:52:47 -06:00
Ryan Hunt 076d1e73a3 Bug 1503655 part 3 - Remove PRenderFrame protocol without functional changes. r=kats
This commit removes the PRenderFrame protocol, while keeping the same ordering
and semantics of graphics IPC initialization.

To do this, some messages are added to PBrowser to simulate the constructor
and destructor of PRenderFrame. Messages that expected a nullable PRenderFrame
are updated to get a boolean instead.

One tricky area is the destruction of PRenderFrame. I've tried to keep it the
same as much as possible, but it's possible it might be slightly semantically
different than IPDL destruction. Destruction will be touched up in a later
patch, so I'm not too concerned.

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

--HG--
extra : rebase_source : bb8a7896bb4aefb6e9957d8808b755fa76cc00ed
extra : histedit_source : 6377819a946b5b6bc18b15f748229360e42a6f3a
2018-11-05 12:45:06 -06:00
Ryan Hunt 529e74890b Bug 1503655 part 2 - Remove unused and outdated code from RenderFrameParent. r=kats
This commit removes a bunch of cruft from RenderFrameParent that isn't
used and isn't needed. Some functions that have no reason to be in
RenderFrameParent are moved to TabParent in anticipation of the
PRenderFrame protocol being dropped.

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

--HG--
extra : rebase_source : 79f830e0ad48e868480108c3bbb01e3faca5e70a
extra : histedit_source : 4ddb361e4e4acae10ab16124b5d6548490f770ee
2018-10-25 15:23:46 -05:00
Ryan Hunt 535b26ac9c Bug 1503655 part 1 - Remove nested-oop support from RenderFrameParent. r=kats,froydnj
Differential Revision: https://phabricator.services.mozilla.com/D10593

--HG--
extra : rebase_source : c38238f2fa07f7a196ba9c14f745832ef7ad3cd5
extra : histedit_source : 02897684f5400f157973d5aa6bc4a6f6908697a4
2018-11-01 12:23:37 -05:00
Sebastian Hengst 2707fcbd6c Bug 1504521 - rename in-tree mentions of bugzilla metadata for product and component "Core :: Layout: Web Painting" to "Core :: Web Painting" r=kats
Differential Revision: https://phabricator.services.mozilla.com/D10832

--HG--
extra : moz-landing-system : lando
2018-11-04 12:57:04 +00:00
Ryan Hunt 2226bcc8a3 Bug 1504220 - Move ScrollableLayerGuid, ViewID, ZoomConstraints from FrameMetrics.h r=botond
This commit attempts to lower the pain of modifying FrameMetrics.h.

It looks like most includes really only want ViewID or
ScrollableLayerGuid, so this commit factors them out into a separate
header. In the process FrameMetrics::ViewID is changed to
ScrollableLayerGuid::ViewID, which personally seems like a better
place for it now that we have RepaintRequest. Unfortunately that
requires a lot of places to be updated.

After this commit there are still a couple of major places that
FrameMetrics is included.
 * nsDisplayList.h
 * nsIScrollableFrame.h
 * Layers.h

Those are going to be more tricky or impossible to fix so they're
not in this commit.

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

--HG--
rename : gfx/layers/FrameMetrics.h => gfx/layers/ScrollableLayerGuid.h
rename : gfx/layers/FrameMetrics.h => gfx/layers/ZoomConstraints.h
extra : rebase_source : 29ac79f91460a181bf7437af5c371207e22858e2
extra : source : c2e70e531075493fc6e374dcec862827f0bc6e77
2018-11-01 15:15:46 -05:00
Brian Hackett 0ec2f258e7 Bug 1499186 Part 1 - Allow recording/replaying processes to ignore vsyncs, r=nical.
--HG--
extra : rebase_source : e36cb48b5a7ba3b4f2fc46fd68256b46801f0792
2018-10-17 10:18:50 -06:00
Brian Hackett e1cc56fa0f Bug 1488808 Part 17 - Allow paints to happen at the normal time when recording/replaying, r=nical.
--HG--
extra : rebase_source : c9a5536a9eeff96937643fdf7bf68e56e437cef1
2018-10-17 10:16:30 -06:00
Miko Mynttinen 6ddaa66fe8 Bug 1496839 - Avoid dereferencing null frame r=mattwoodrow
Differential Revision: https://phabricator.services.mozilla.com/D8882

--HG--
extra : moz-landing-system : lando
2018-10-18 02:26:59 +00:00
Ryan Hunt f1dc235e14 Bug 1475139 part 9 - Use DrawDependentSurface in nsDisplayRemote when painting to a temp layer manager with a recording. r=mattwoodrow
Differential Revision: https://phabricator.services.mozilla.com/D6788

--HG--
extra : rebase_source : be90e03c9db768ecbc1b7f419f5ab9eda36e9ae4
2018-09-24 21:45:54 -05:00
Ryan Hunt 0548fffa40 Bug 1475139 part 8 - Remove unused mContainer from RenderFrameParent. r=mattwoodrow
mContainer is only ever read, and never written to. This commit removes it.

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

--HG--
extra : rebase_source : b106b1c898dd1d1523e9747b9b2f33d42470f4b6
2018-09-24 21:44:50 -05:00
Gerald Squelart b099eab802 Bug 1488684 - Made nsIFrame-derived classes and some others 'final' where possible - r=dbaron
All classes deriving from nsIFrame that did not have any subclasses themselves
(at the time of writing this patch) have been marked with `final`.
Some other Layout classes have also been made final, but this was opportunistic
while working on nsIFrame subclasses, and is definitely not exhaustive, further
patches welcome; refer to bug 1332680.

Advantages of marking a class final include:
- Allowing the compiler to devirtualize some method calls (i.e., calling
  virtual functions directly instead of going through the vtable),
- Indicating that the class is not currently subclassed,
- Preventing subclassing without being aware that this would remove the
  finalization benefits of the parent class.
`final` does not signify that these classes should *never* be subclassed, this
is left for developers to decide.

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

--HG--
extra : moz-landing-system : lando
2018-09-06 01:23:14 +00:00
Sebastian Hengst bcdcf7554b Bug 1487190 - Update bugzilla metadata in moz.build files to reflect Layout components reorganization in bug 1484408. r=heycam
Differential Revision: https://phabricator.services.mozilla.com/D4642

--HG--
extra : moz-landing-system : lando
2018-09-05 11:16:02 +00:00
Sebastian Hengst 0003a3ce96 Backed out changeset 834a75789c0a (bug 1487190) for bustage due to unused file pattern 2018-09-05 14:11:04 +03:00
Sebastian Hengst 38d937a7c0 Bug 1487190 - Update bugzilla metadata in moz.build files to reflect Layout components reorganization in bug 1484408. r=heycam
Differential Revision: https://phabricator.services.mozilla.com/D4642

--HG--
extra : moz-landing-system : lando
2018-09-05 10:54:03 +00:00
Dorel Luca b9abf01ee1 Backed out changeset 9e0481c2413d (bug 1487190) for breaking Gecko Decision Task. CLOSED TREE 2018-09-05 13:43:09 +03:00
Sebastian Hengst 447d464a1a Bug 1487190 - Update bugzilla metadata in moz.build files to reflect Layout components reorganization in bug 1484408. r=heycam
Differential Revision: https://phabricator.services.mozilla.com/D4642

--HG--
extra : moz-landing-system : lando
2018-09-05 10:00:39 +00:00
Miko Mynttinen 9cafe14554 Bug 1487020 - Do not reuse nsDisplayRemote if RenderFrameParent has been destroyed r=mattwoodrow
Reviewers: mattwoodrow

Tags: #secure-revision

Bug #: 1487020

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

--HG--
extra : rebase_source : 3b98453d0b273fbf858e2736e531108a8f1732ed
extra : amend_source : 1a3ebfe814a13c7e386d61cb0cf0601388439e83
extra : source : f0594eca7bd49c18c84c88da920bdf69e1a4dc11
2018-08-31 21:08:01 +02:00
Xidorn Quan 33b8a6dacd Bug 1483090 - Rename StyleUserInterface to StyleUI. r=emilio
Differential Revision: https://phabricator.services.mozilla.com/D3276

--HG--
extra : moz-landing-system : lando
2018-08-14 08:37:37 +00:00
Brian Hackett 562987ce84 Bug 1465466 Part 3 - When recording/replaying, composite in the main thread's event loop instead of waiting for vsyncs, r=nical.
--HG--
extra : rebase_source : 0dbdcb4698e349ceb53e0621d5fa453bb1f17357
2018-07-23 21:47:28 +00:00
Kartikaya Gupta 2ee83dd552 Bug 1467867 - Ensure we populate the event regions overrides properly. r=botond
The event regions override flags are needed whenever APZ is doing
hit-testing off the layer tree. This can happen even if
IsBuildingLayerEventRegions() returns false, because we can instead be
building nsDisplayCompositorHitTestInfo items from which we populate the
layer tree's EventRegions objects. So the guard condition here is wrong,
and we can just remove it to ensure the flags are always put on the
layer tree. If APZ isn't enabled on this layer tree then they won't be
used, and there might be a slight perf hit, but it should be negligible.

Differential Revision: https://phabricator.services.mozilla.com/D1599
2018-06-08 21:16:43 +00:00
Kartikaya Gupta 8e7e2dbdb4 Bug 1454042 - Allow missing pipeline information for cross-process iframes. r=sotaro
We should always have the pipeline information for in-process things like
async images, but for cross-process iframes we might not have the information
right away if the content process doesn't get around to sending it for a while.

MozReview-Commit-ID: 18F5nqilXoV

--HG--
extra : rebase_source : 610046cbaaefb38b8e11bda857fd64a00722df27
2018-05-18 10:31:18 -04:00
Boris Zbarsky 8a0b50bea8 Bug 1456588 part 1. Change nsIFocusManager::SetFocus to take Element. r=enndeakin 2018-04-26 10:37:46 -04:00
Jeff Muizelaar 7bd5060424 Bug 1450134. Replace ToRelativeLayoutRect() with ToRoundedLayoutRect(). r=kats
This function doesn't use any StackingContextHelper state anymore.
We should make what it does clearer and move it to a better place.

--HG--
extra : rebase_source : 1727be9657169547d842ec9b6887837abedbefdf
2018-03-29 17:57:43 -04:00
Kartikaya Gupta 395eaf8c66 Bug 1448490 - Make the layers id a struct instead of a uint64_t. r=mattwoodrow
The new struct is in LayersTypes.h, all the rest of the changes are just
replacing existing uint64_t instances with the new LayersId struct.

Note that there is one functional change, in
CompositorBridgeParent::DeallocPWebRenderBridgeParent, where we now
correctly convert the PipelineId to a LayersId before using it to index
into sIndirectLayerTrees, whereas before we were incorrectly just using
the mHandle part of the PipelineId.

MozReview-Commit-ID: GFHZSZiwMrP

--HG--
extra : rebase_source : d2b274f63aaee2ee9bba030297e0a37a19af0d6c
2018-03-24 19:06:01 -04:00
Kartikaya Gupta 45d31fa895 Bug 1442627 - Stop exporting APZCTreeManager.h in mozilla/layers/. r=botond
MozReview-Commit-ID: GC5fSWOYtF5

--HG--
extra : rebase_source : e2dfe679595bf9208e082699a99375cd509b66e3
2018-03-06 10:25:39 -05:00
Chris Peterson 73675ec9f2 Bug 1443402 - Fix some -Wmissing-prototypes warnings in layout. r=dholbert
-Wmissing-prototypes is a new optional warning available in clang ToT. It warns about global functions that have no previous function declaration (e.g. from an #included header file). These functions can probably be made static (allowing the compiler to better optimize them) or they may be unused.

Confusingly, clang's -Wmissing-prototypes is equivalent to gcc's -Wmissing-declarations, not gcc's -Wmissing-prototypes. A function prototype is a function declaration that specifies the function's argument types. C++ requires that all function declarations specify their argument types, but C does not. As such, gcc's -Wmissing-prototypes is a C-only warning about C functions that have no previous function *prototypes* (with argument types), even if a previous function *declaration* (without argument types) was seen.

MozReview-Commit-ID: FGKVLzeQ2oK

--HG--
extra : rebase_source : 81e62163bf41a5d5dd87abf5397e6e8c62ed4096
extra : source : 653a9fc279e2f6a6d066474a94a70d65ac703d6b
2018-02-22 21:03:45 -08:00
Matt Woodrow 4183152e2d Bug 1436904 - Part 1: Add a static constructor function for display items. r=Bas 2018-02-13 13:43:28 +13:00
Dorel Luca bd05e3853c Backed out 3 changesets (bug 1436904) for many crashes see bugs: 1440281, 1440302, 1440303, 1440313. a=backout
Backed out changeset 27f0762d4472 (bug 1436904)
Backed out changeset 27640f52e188 (bug 1436904)
Backed out changeset 2b4d117c27dc (bug 1436904)
2018-02-22 17:28:59 +02:00
Matt Woodrow e485bba27f Bug 1436904 - Part 1: Add a static constructor function for display items. r=Bas 2018-02-13 13:43:28 +13:00
Kartikaya Gupta 3c76c8128a Bug 1415225 - Move the EventRegionsOverride field to be on RefLayers only. r=botond
We now set EventRegionsOverride flags on ref layers only, so
there's no need to have the APIs to set it on container layers in
general.

MozReview-Commit-ID: JKU4UXvdR2e

--HG--
extra : rebase_source : 77f49787e8953520dc56ea4a8f9286b35d6942b8
2017-11-09 09:03:52 -05:00
Mats Palmgren 1c2b8c222e Bug 1414666 part 1 - Add nsIFrame::PresShell() for convenient access to the shell. r=emilio
MozReview-Commit-ID: 8FPTPKWyVtY
2017-11-09 03:00:48 +01:00
Daniel Holbert 680815cd6e Bug 1412346 part 5: (automated patch) Switch a bunch of C++ files in layout to use our standard mode lines. r=jfkthame
This patch was generated automatically by the "modeline.py" script, available
here: https://github.com/amccreight/moz-source-tools/blob/master/modeline.py

For every file that is modified in this patch, the changes are as follows:
 (1) The patch changes the file to use the exact C++ mode lines from the
     Mozilla coding style guide, available here:
https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style#Mode_Line

 (2) The patch deletes any blank lines between the mode line & the MPL
     boilerplate comment.

 (3) If the file previously had the mode lines and MPL boilerplate in a
     single contiguous C++ comment, then the patch splits them into
     separate C++ comments, to match the boilerplate in the coding style.

MozReview-Commit-ID: EuRsDue63tK

--HG--
extra : rebase_source : 3356d4b80ff6213935192e87cdbc9103fec6084c
2017-10-27 10:33:53 -07:00
Markus Stange 015854956a Bug 1406715 - Use the RenderFrameParent's content rect as the bounds of the webrender iframe display item. r=kats
It was using the visible rect of the display item before, which can be larger
than the frame for various reasons. But the bounds we pass for the webrender
iframe item determines the iframe's position, so it needs to be informed by the
layout position of the frame, not by circumstances of the paint.

MozReview-Commit-ID: JSmFGLmAm0h

--HG--
extra : rebase_source : ba85778fe1fe509dd593afaac9bf7a4ff9952b49
2017-10-22 00:48:01 -04:00
Kartikaya Gupta dbe077b3f1 Bug 1403915 - Remove the IsLayersFreeTransaction() machinery and assume it's always true. r=jrmuizel
MozReview-Commit-ID: 7FYVirQ5pal

--HG--
extra : rebase_source : 4b33fba54776003b4f0d45b89be07916db1f2340
2017-10-03 16:31:07 -04:00
Morris Tseng ce9b629335 Bug 1392200 - Add backface-visibility support for layers-free mode. r=kats
For layers-full mode, we set the backface-visibility to visible because
visibility would be handled by FLB and layers.

MozReview-Commit-ID: CUbeUabfC7K
2017-09-21 14:41:38 +08:00