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

487 Коммитов

Автор SHA1 Сообщение Дата
James Teh a832fc180d Bug 1558369: AccessibleHandler: Don't use HandlerChildEnumerator for iframes. r=yzen
When a client wants to fetch all accessible children, the COM handler uses handlerProvider::get_AllChildren in the content process to optimize cross-process retrieval of all children.
This works fine for iframes rendered in the same content process, just as it does for other accessibles.
However, for out-of-process iframes, HandlerProvider::get_AllChildren will fail.
This is because we only send down an IDispatch COM proxy for the embedded document, but get_AllChildren will try to QueryInterface this to IAccessible2 to reduce QI calls from the parent process.
Because the content process is sandboxed, it can't make the outgoing COM call to QI the proxy from IDispatch to IAccessible2 and so it fails.

Since an iframe only has one child anyway, we don't need the bulk fetch optimization offered by HandlerChildEnumerator or even IEnumVARIANT.
Therefore, we explicitly tell the client this interface is not supported, which will cause the oleacc AccessibleChildren function to fall back to accChild.

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

--HG--
extra : moz-landing-system : lando
2019-06-12 15:08:21 +00:00
James Teh 5fd61516b3 Bug 1554831: For out-of-process iframe documents on Windows, send the a11y emulated window (if any) to the content process. r=eeejay
If window emulation is enabled, an out-of-process iframe document should use the same emulated window as its embedder.
Previously, we were setting this on DocAccessibleParent, but we weren't sending it to content to make it available on DocAccessibleChild.
This meant that accessibles in out-of-process iframe documents were reporting the wrong window handle.

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

--HG--
extra : moz-landing-system : lando
2019-05-29 04:37:28 +00:00
James Teh c0a638e74c Bug 1543313 part 3: For out-of-process iframes on Windows, send the embedder accessible COM proxy to be used as the parent of the embedded document. r=eeejay,yzen
Aside from the parent being needed by the client, this is also important because events from the embedded document are deferred until the parent COM proxy is received.

As part of this, we no longer try to send the parent COM proxy during construction of an OuterDocAccessible in the parent process.
This was previously a no-op anyway, as DocAccessibleParent::SendParentCOMProxy called DocAccessible::GetAccessible for the frame element, which would have returned null because the accessible isn't bound to the document until *after* it is constructed.
Changing this to directly pass the OuterDocAccessible was causing assertions in content processes, since it sometimes meant the parent COM proxy was sent twice, which is precisely what the assertion is protecting against.
Instead, the parent proxy is sent in Browserparent::RecvPDocAccessibleConstructor as it always was.

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

--HG--
extra : moz-landing-system : lando
2019-06-03 14:29:37 +00:00
James Teh 86e3c8af49 Bug 1543313 part 1: Allow identification and retrieval of DocAccessibleParents at the top level of their content process. r=eeejay
DocAccessibleParent already has IsTopLevel(), which identifies a document at the top level of the hierarchy; i.e. it has no parents.
Now that we have out-of-process iframes, we need to be able to identify and retrieve documents at the top level of their content process, even if they are embedded by another remote document.
DocAccessibleParent::IsTopLevelInContentProcess() has been introduced to achieve this.
BrowserParent::GetTopLevelDocAccessible() now uses this instead of IsTopLevel(), since we want to be able to get the top DocAccessibleParent even for a BrowserParent for an out-of-process iframe.

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

--HG--
extra : moz-landing-system : lando
2019-05-31 03:27:26 +00:00
Noemi Erli d831a07840 Backed out 4 changesets (bug 1553706, bug 1543313) for failures in DocAccessibleChild.cpp
Backed out changeset 1a8bea02205d (bug 1553706)
Backed out changeset 15f3e6bb3ba9 (bug 1543313)
Backed out changeset 30b106088985 (bug 1543313)
Backed out changeset 85d11dab6b63 (bug 1543313)
2019-05-31 06:24:44 +03:00
James Teh 381c2b2f93 Bug 1543313 part 3: For out-of-process iframes on Windows, send the embedder accessible COM proxy to be used as the parent of the embedded document. r=eeejay
Aside from the parent being needed by the client, this is also important because events from the embedded document are deferred until the parent COM proxy is received.

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

--HG--
extra : moz-landing-system : lando
2019-05-24 06:14:24 +00:00
James Teh 80e4370a70 Bug 1543313 part 1: Allow identification and retrieval of DocAccessibleParents at the top level of their content process. r=eeejay
DocAccessibleParent already has IsTopLevel(), which identifies a document at the top level of the hierarchy; i.e. it has no parents.
Now that we have out-of-process iframes, we need to be able to identify and retrieve documents at the top level of their content process, even if they are embedded by another remote document.
DocAccessibleParent::IsTopLevelInContentProcess() has been introduced to achieve this.
BrowserParent::GetTopLevelDocAccessible() now uses this instead of IsTopLevel(), since we want to be able to get the top DocAccessibleParent even for a BrowserParent for an out-of-process iframe.

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

--HG--
extra : moz-landing-system : lando
2019-05-23 20:00:31 +00:00
James Teh a23e2db32f Bug 1543298 part 3: For out-of-process iframes, send the embedded document accessible's COM proxy to the embedder. r=eeejay
This will be later exposed as a child of the embedder OuterDocAccessible.

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

--HG--
extra : moz-landing-system : lando
2019-05-24 00:19:51 +00:00
James Teh bfb6c4c160 Bug 1543287: Add embedded out-of-process iframe DocAccessibleParent as a child of its embedder DocAccessibleParent. r=eeejay,nika
For iframes in a different process to their embedder, when the embedded iframe content process tells the parent process about the iframe document, it does not have the actor for the parent document accessible, nor does it know the accessible id of the embedding iframe.
However, the embedder will have previously sendt the actor and id for the embedder accessible to the parent via PBrowserBridge, so we can use that to identify the parent accessible.

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

--HG--
extra : moz-landing-system : lando
2019-05-29 04:36:18 +00:00
James Teh 41261b6bd4 Bug 1543282 part 1: Reference counting for DocAccessibleParent. r=eeejay,nika
Supporting out-of-process iframes requires us to hold onto a DocAccessibleParent in BrowserBridgeParent.
However, we can't guarantee the order of cleanup between the two content processes.
Therefore, we need reference counting to kee the object alive.

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

--HG--
extra : moz-landing-system : lando
2019-05-28 17:42:59 +00:00
Sylvestre Ledru 993c03acb1 Bug 1552795 - Remove all trailing whitespaces in idl files r=Ehsan
Differential Revision: https://phabricator.services.mozilla.com/D31769

--HG--
extra : moz-landing-system : lando
2019-05-22 22:37:14 +00:00
Ryan Hunt 9078c825ec Bug 1525720, part 14 - Move final bits of nsIRemoteTab implementation to BrowserHost. r=nika
This commit moves the actual implementation of nsIRemoteTab from BrowserParent
to BrowserHost, without any functional changes.

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

--HG--
extra : source : d25963c72ff7981990660050182a82ea3e935f53
2019-05-08 15:47:18 -05:00
Gurzau Raul 57f573a6ff Backed out 18 changesets (bug 1525720) for mass failures on Windows platform e.g ProcessPriorityManager.cpp on a CLOSED TREE.
Backed out changeset 1f2e86c2d691 (bug 1525720)
Backed out changeset 9b79caa460a0 (bug 1525720)
Backed out changeset e65cb2d4c5a5 (bug 1525720)
Backed out changeset 99f971a02d87 (bug 1525720)
Backed out changeset d25963c72ff7 (bug 1525720)
Backed out changeset 810b73719871 (bug 1525720)
Backed out changeset ee10a8254481 (bug 1525720)
Backed out changeset 1bcf9f586c55 (bug 1525720)
Backed out changeset d3b2ac8d5ca4 (bug 1525720)
Backed out changeset 697774dd8984 (bug 1525720)
Backed out changeset eadeacbe4483 (bug 1525720)
Backed out changeset 32eeee79d628 (bug 1525720)
Backed out changeset 07678a2fa9e7 (bug 1525720)
Backed out changeset 757b4f595cc4 (bug 1525720)
Backed out changeset b255e0a84e12 (bug 1525720)
Backed out changeset 9a255864f75d (bug 1525720)
Backed out changeset 5f1c1b609ec1 (bug 1525720)
Backed out changeset 00d83f1d02e0 (bug 1525720)
2019-05-23 01:57:16 +03:00
Ryan Hunt 9b1bbaea5b Bug 1525720, part 14 - Move final bits of nsIRemoteTab implementation to BrowserHost. r=nika
This commit moves the actual implementation of nsIRemoteTab from BrowserParent
to BrowserHost, without any functional changes.

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

--HG--
extra : rebase_source : 2e6533dfa69a3278300eb70d5258bcd0a3aba68b
extra : histedit_source : a26ba68b78eb6d16cdffbc630f4410c5dd46a367
2019-05-08 15:47:18 -05:00
Sylvestre Ledru e226046cb8 Bug 1547143 - Format the tree: Be prescriptive with the pointer style (left) r=Ehsan
# ignore-this-changeset

Depends on D28954

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

--HG--
extra : moz-landing-system : lando
2019-05-01 08:47:10 +00:00
Ryan Hunt d6509bb237 Bug 1534395 - Rename TabChild to BrowserChild. r=nika
This commit renames TabChild to BrowserChild.

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

--HG--
rename : dom/base/InProcessTabChildMessageManager.cpp => dom/base/InProcessBrowserChildMessageManager.cpp
rename : dom/base/InProcessTabChildMessageManager.h => dom/base/InProcessBrowserChildMessageManager.h
rename : dom/ipc/TabChild.cpp => dom/ipc/BrowserChild.cpp
rename : dom/ipc/TabChild.h => dom/ipc/BrowserChild.h
extra : rebase_source : e7fcfb845a971a2760e73d517e24da18ce2551b5
extra : histedit_source : d1991334ccb107fe56e478865f22fd97b041a317
2019-04-09 17:39:01 -05:00
Ryan Hunt 0eeced87be Bug 1534395 - Rename TabParent to BrowserParent. r=nika
This commit renames TabParent to BrowserParent.

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

--HG--
rename : dom/ipc/TabParent.cpp => dom/ipc/BrowserParent.cpp
rename : dom/ipc/TabParent.h => dom/ipc/BrowserParent.h
extra : rebase_source : d2706b9f42177d8de16068b7b1d088a44b8720a4
extra : histedit_source : a617ddac45c58050ef799116a67d2d983f2a8f6d%2C1d1dabd8761a32d548a6fbf1027be960698f6a5e
2019-04-09 16:38:15 -05:00
Masayuki Nakano d8d0bcab65 Bug 1543013 - part 2: Make accessible use mozilla::PresShell directly rather than via nsIPresShell r=Jamie
This patch makes accessible module use `mozilla::PresShell` directly rather
than via `nsIPresShell`.  Additionally, renames `DocAccessible::PresShell()`
to `DocAccessible::PresShellPtr()` for avoiding conflict with using
`PresShell` in it and its sub classes.

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

--HG--
extra : moz-landing-system : lando
2019-04-13 12:13:15 +00:00
Masayuki Nakano 09fd54444c Bug 1543013 - part 1: Mark some methods of nsCoreUtils as MOZ_CAN_RUN_SCRIPT r=Jamie
This patch marks some methods of nsCoreUtils which are found at writing the
following patches, as `MOZ_CAN_RUN_SCRIPT`.

Due to bug 1543294, some of them are marked as `MOZ_CAN_RUN_SCRIPT_BOUNDARY`
because `MOZ_CAN_RUN_SCRIPT` requires to change base class, but that's
other licenses header or used in our code too many places.

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

--HG--
extra : moz-landing-system : lando
2019-04-13 12:13:13 +00:00
Mike Hommey b5706992db Bug 1537641 - Make MIDL use clang-cl as a preprocessor. r=dmajor
Using clang-cl as a preprocessor fails with:
```
In file included from z:\build\build\src\accessible\ipc\win\handler\HandlerData.idl:8:
z:\build\build\src\accessible\ipc\win\handler/AccessibleHandler.h(27,8): error: pasting formed 'Accessible2_3.', an invalid preprocessing token [-Winvalid-token-paste]
import NEWEST_IA2_IDL;
       ^
z:\build\build\src\accessible\ipc\win\handler/AccessibleHandler.h(15,24): note: expanded from macro 'NEWEST_IA2_IDL'
                       ^
z:\build\build\src\accessible\ipc\win\handler/AccessibleHandler.h(14,22): note: expanded from macro 'IDLFOR'
                     ^
z:\build\build\src\accessible\ipc\win\handler/AccessibleHandler.h(13,36): note: expanded from macro '__GENIDL'
                                   ^
1 error generated.
midl : command line error MIDL1003 : error returned by the C preprocessor (1)
```

There's only one place using the NEWEST_IA2_IDL and accompanying
macros, we can just avoid the issue altogether by expanding it manually
(and it's not like the macro buys much, the other arm of the __midl ifdef
has a #include "Accessible2_3.h" that doesn't use the macro either,
presumably for the same reason).

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

--HG--
extra : moz-landing-system : lando
2019-03-26 16:29:17 +00:00
Alex Gaynor 177fb00eba Bug 1375863 - fold MOZ_CONTENT_SANDBOX and MOZ_GMP_SANDBOX into MOZ_SANDBOX; r=jld,firefox-build-system-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D22975

--HG--
extra : moz-landing-system : lando
2019-03-18 22:31:59 +00:00
Eitan Isaacson 6d8e53ccd1 Bug 1479042 - Add Android announcement event plumbing. r=yzen
Depends on D21610

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

--HG--
extra : moz-landing-system : lando
2019-03-05 19:36:05 +00:00
Boris Zbarsky 9a4ba73134 Bug 1534370 part 3. Mark InsertFromTransferable as MOZ_CAN_RUN_SCRIPT. r=masayuki
Differential Revision: https://phabricator.services.mozilla.com/D23042

--HG--
extra : moz-landing-system : lando
2019-03-12 01:55:03 +00:00
Ryan Hunt 179b832433 Bug 1523969 part 1 - Move method definition inline comments to new line in accessible/. r=jamie
Differential Revision: https://phabricator.services.mozilla.com/D21101

--HG--
extra : rebase_source : 5b1dc394aba125c9f14977efc1a71b60455d1bf6
2019-02-25 16:02:26 -06:00
Eitan Isaacson bf64f6d78e Bug 1525470 - Include description in accessible hints. r=yzen
Differential Revision: https://phabricator.services.mozilla.com/D19870

--HG--
extra : moz-landing-system : lando
2019-02-21 17:45:17 +00:00
Dorel Luca 0c4863aaf0 Backed out changeset ac4f1b5527fd (bug 1525470) for failures in geckoview in org.mozilla.geckoview.test.AccessibilityTest.testCheckbox. CLOSED TREE 2019-02-20 02:53:14 +02:00
Eitan Isaacson 2ba937125b Bug 1525470 - Include description in accessible hints. r=yzen
Differential Revision: https://phabricator.services.mozilla.com/D19870

--HG--
extra : moz-landing-system : lando
2019-02-19 18:56:30 +00:00
Masatoshi Kimura e25fbce870 Bug 1528651 - Re-enable warnings-as-errors on Windows in some directories. r=dmajor
--HG--
extra : source : ba86ea25070b37f4725834e1c2d9ec4c0783e119
2019-02-17 15:03:02 +09:00
Eitan Isaacson 773b9d611a Bug 1525980 - Make announcement events work over IPC. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D19061

--HG--
extra : moz-landing-system : lando
2019-02-14 17:42:47 +00:00
Alexander Surkov 5d4b4d925d Bug 1448505 - ProxyAccessible::RelationByType fails to return early, r=jamie 2019-01-30 10:06:30 -05:00
Eitan Isaacson c8e72df146 Bug 1511398 - Don't append null proxies to batch list. r=MarcoZ
Differential Revision: https://phabricator.services.mozilla.com/D17845

--HG--
extra : moz-landing-system : lando
2019-01-29 04:30:41 +00:00
Eitan Isaacson e18c6010be Bug 1520611 - Consolidate ProxyAccessible::MustPruneChildren into nsAccUtils. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D16997

--HG--
extra : moz-landing-system : lando
2019-01-24 00:23:30 +00:00
Dorel Luca 207c24c7d2 Backed out 3 changesets (bug 1520611) for Android gv-junit failures in org.mozilla.geckoview.test.AccessibilityTest.testTree
Backed out changeset 0a48519a9ad1 (bug 1520611)
Backed out changeset 1fea939a7e7c (bug 1520611)
Backed out changeset c9e244ccc88d (bug 1520611)

--HG--
extra : rebase_source : 448bfe14fbb8741251064da295e036a93a376145
2019-01-23 12:09:29 +02:00
Eitan Isaacson 112ac1fb11 Bug 1520611 - Consolidate ProxyAccessible::MustPruneChildren into nsAccUtils. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D16997

--HG--
extra : moz-landing-system : lando
2019-01-22 19:49:15 +00:00
Ehsan Akhgari e5e885ae31 Bug 1521000 - Part 2: Adjust our clang-format rules to include spaces after the hash for nested preprocessor directives r=sylvestre
# ignore-this-changeset

--HG--
extra : amend_source : 7221c8d15a765df71171099468e7c7faa648f37c
extra : histedit_source : a0cce6015636202bff09e35a13f72e03257a7695
2019-01-18 10:16:18 +01:00
James Teh 487948a690 Bug 1514093 part 2: Marshal the result from IAccessible::get_accSelection as IEnumVARIANT. r=MarcoZ
Our accSelection implementation always returns an IUnknown which clients QI to IEnumVARIANT.
Marshaling as IUnknown works fine in this case, but it's more efficient and correct to marshal the correct interface.
Also, without this, we'd hit an assertion.

Depends on D16662

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

--HG--
extra : moz-landing-system : lando
2019-01-16 08:13:20 +00:00
James Teh 27ee39f62b Bug 1514093 part 1: A11y HandlerProvider: Don't write any payload at all (even an empty one) if the handler isn't used for the target interface. r=aklotz
We only use the handler for specific interfaces such as IAccessible* and IAccessibleHyperlink.
For interfaces which don't use the handler, we currently write an empty payload, but this still adds bytes to the stream.
This seems to break marshaling such an interface in a VT_UNKNOWN in a VARIANT.
To fix this, just don't write any payload at all when we aren't using the handler for the target interface.

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

--HG--
extra : moz-landing-system : lando
2019-01-16 08:08:05 +00:00
Eitan Isaacson 7c31734192 Bug 1519922 - Call ProxyEvent for scrolling events on non-Android. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D16484

--HG--
extra : moz-landing-system : lando
2019-01-14 23:46:57 +00:00
James Teh 850ee9ea2b Bug 1515294: Only use SendSyncTextChangeEvent for live regions. r=MarcoZ
In order to support IA2 live regions with e10s (bug 1322532), text change events sent from the child process to the parent process use sync IPC.
That comes at a slight performance cost: the content process is blocked until the parent returns from sending and handling the event.
However, there is no reason to do this if the event is not for an accessible inside a live region; current clients don't need the sync behaviour outside of live regions.

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

--HG--
extra : source : 415f827cb9ce211c48b0c6625e917582bc81fd3a
2018-12-21 09:16:38 +00:00
Jacek Caban 8409db9e3c Bug 1430149 - Don't define INITGUID when not needed. r=aklotz
On mingw this causes IIDs to be defined in headers. Those definitions conflict with _i.c files that are included as well. Since we include _i.c anyway, INITGUID is simply not needed.
2018-12-25 18:49:39 +01:00
Jacek Caban 2957a4743d Bug 1430149 - widl compatibility fixes. r=aklotz
widl can't handle generating the typelib without explicit importlib() in this case. This should be fixed in widl as well, but using importlib() in this case looks right anyway.
2018-12-25 18:49:23 +01:00
arthur.iakab 70a4778dd8 Backed out changeset 415f827cb9ce (bug 1515294) on suspicion of causing content process hangs a=backout CLOSED TREE 2018-12-23 00:04:39 +02:00
James Teh f9cba89c57 Bug 1515294: Only use SendSyncTextChangeEvent for live regions. r=MarcoZ
In order to support IA2 live regions with e10s (bug 1322532), text change events sent from the child process to the parent process use sync IPC.
That comes at a slight performance cost: the content process is blocked until the parent returns from sending and handling the event.
However, there is no reason to do this if the event is not for an accessible inside a live region; current clients don't need the sync behaviour outside of live regions.

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

--HG--
extra : moz-landing-system : lando
2018-12-21 09:16:38 +00:00
Eitan Isaacson 8e0b1240c1 Bug 1510791 - Add action count to BatchData and set isClickable correctly in Android. r=yzen
Differential Revision: https://phabricator.services.mozilla.com/D13320

--HG--
extra : moz-landing-system : lando
2018-12-05 15:37:24 +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
Marco Zehe ccd63db4b3 Bug 1508870 - Make a distinction between an empty returned string versus a null pointer, r=Jamie
When determining if an author provided an empty alt attribute versus no alt attribute at all, our image accessible name is either an empty string or a null string. Screen readers can then choose to guess the name from the source if the author did not explicitly provide an empty alt text and thus marked the image as decorative.

The accessible handler for the Windows remote processes did not account for this distinction, always returning what appeared to be an empty string. This was found while determining why NVDA wasn't guessing the SRC from a non-labelled graphical link. NVDA checks to see if the name returned by the link accessible is null, and then decides to look for the graphical children if that is the case.

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

--HG--
extra : moz-landing-system : lando
2018-11-22 06:09:31 +00:00
Eitan Isaacson 970933ad81 Bug 1479039 - Extend BatchData struct and added focus path cache. r=yzen
Differential Revision: https://phabricator.services.mozilla.com/D11214

--HG--
extra : moz-landing-system : lando
2018-11-12 16:41:38 +00:00
Eitan Isaacson 3e98aa79f5 Bug 1479039 - Move PersistentPropertiesToArray to nsAccUtils. r=Jamie
In order to send send attributes in BatchData we will need to convert
them to an array. Here we factor out the private function that does that
and put it in nsAccUtils.

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

--HG--
extra : moz-landing-system : lando
2018-11-12 16:41:31 +00:00
Eitan Isaacson 82efc98977 Bug 1502187 - Add Batch protocol to PDocAccessible. r=Jamie
This protocol is meant to be used by platform wrappers to push bulk data
to the chrome process.

Depends on D9689

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

--HG--
extra : moz-landing-system : lando
2018-11-06 04:22:08 +00:00
Sylvestre Ledru dd5741407b Bug 1498586 - Add clang-format off to avoid the reformatting of the data structures r=Ehsan
Too hard/impossible for the tool to format correctly these structs

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

--HG--
extra : moz-landing-system : lando
2018-10-12 20:48:24 +00:00