From 58ae94661e6d628611d1a1cd53b3e76db29916b8 Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Fri, 14 Aug 2020 19:33:00 +0000 Subject: [PATCH] Bug 1657765 - Add IPDL interface for platform-specific mac API. r=morgan,Jamie,nika Differential Revision: https://phabricator.services.mozilla.com/D86606 --- .../mac/DocAccessiblePlatformExtChild.cpp | 127 ++++++++++++++++++ .../mac/DocAccessiblePlatformExtChild.h | 50 +++++++ .../mac/DocAccessiblePlatformExtParent.h | 19 +++ .../mac/PDocAccessiblePlatformExt.ipdl | 37 +++++ accessible/ipc/extension/mac/moz.build | 28 ++++ accessible/ipc/extension/moz.build | 6 +- ipc/ipdl/sync-messages.ini | 16 +++ 7 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.cpp create mode 100644 accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.h create mode 100644 accessible/ipc/extension/mac/DocAccessiblePlatformExtParent.h create mode 100644 accessible/ipc/extension/mac/PDocAccessiblePlatformExt.ipdl create mode 100644 accessible/ipc/extension/mac/moz.build diff --git a/accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.cpp b/accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.cpp new file mode 100644 index 000000000000..2ddd8f74e0e9 --- /dev/null +++ b/accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.cpp @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "DocAccessiblePlatformExtChild.h" + +#include "DocAccessibleChild.h" +#include "HyperTextAccessibleWrap.h" + +#define UNIQUE_ID(acc) \ + !acc || acc->Document() == acc ? 0 \ + : reinterpret_cast(acc->UniqueID()) + +namespace mozilla { +namespace a11y { + +mozilla::ipc::IPCResult DocAccessiblePlatformExtChild::RecvLeftWordAt( + const uint64_t& aID, const int32_t& aOffset, uint64_t* aStartContainer, + int32_t* aStartOffset, uint64_t* aEndContainer, int32_t* aEndOffset) { + HyperTextAccessibleWrap* acc = IdToHyperTextAccessibleWrap(aID); + if (!acc) { + return IPC_OK(); + } + + HyperTextAccessible* startContainer = nullptr; + HyperTextAccessible* endContainer = nullptr; + + acc->LeftWordAt(aOffset, &startContainer, aStartOffset, &endContainer, + aEndOffset); + + MOZ_ASSERT(!startContainer || startContainer->Document() == acc->Document()); + MOZ_ASSERT(!endContainer || endContainer->Document() == acc->Document()); + + *aStartContainer = UNIQUE_ID(startContainer); + *aEndContainer = UNIQUE_ID(endContainer); + + return IPC_OK(); +} + +mozilla::ipc::IPCResult DocAccessiblePlatformExtChild::RecvRightWordAt( + const uint64_t& aID, const int32_t& aOffset, uint64_t* aStartContainer, + int32_t* aStartOffset, uint64_t* aEndContainer, int32_t* aEndOffset) { + HyperTextAccessibleWrap* acc = IdToHyperTextAccessibleWrap(aID); + if (!acc) { + return IPC_OK(); + } + + HyperTextAccessible* startContainer = nullptr; + HyperTextAccessible* endContainer = nullptr; + + acc->RightWordAt(aOffset, &startContainer, aStartOffset, &endContainer, + aEndOffset); + + MOZ_ASSERT(!startContainer || startContainer->Document() == acc->Document()); + MOZ_ASSERT(!endContainer || endContainer->Document() == acc->Document()); + + *aStartContainer = UNIQUE_ID(startContainer); + *aEndContainer = UNIQUE_ID(endContainer); + + return IPC_OK(); +} + +mozilla::ipc::IPCResult DocAccessiblePlatformExtChild::RecvNextClusterAt( + const uint64_t& aID, const int32_t& aOffset, uint64_t* aNextContainer, + int32_t* aNextOffset) { + HyperTextAccessibleWrap* acc = IdToHyperTextAccessibleWrap(aID); + if (!acc) { + return IPC_OK(); + } + + HyperTextAccessible* nextContainer = nullptr; + + acc->NextClusterAt(aOffset, &nextContainer, aNextOffset); + + MOZ_ASSERT(!nextContainer || nextContainer->Document() == acc->Document()); + + *aNextContainer = UNIQUE_ID(nextContainer); + + return IPC_OK(); +} + +mozilla::ipc::IPCResult DocAccessiblePlatformExtChild::RecvPreviousClusterAt( + const uint64_t& aID, const int32_t& aOffset, uint64_t* aPrevContainer, + int32_t* aPrevOffset) { + HyperTextAccessibleWrap* acc = IdToHyperTextAccessibleWrap(aID); + if (!acc) { + return IPC_OK(); + } + + HyperTextAccessible* prevContainer = nullptr; + + acc->PreviousClusterAt(aOffset, &prevContainer, aPrevOffset); + + MOZ_ASSERT(!prevContainer || prevContainer->Document() == acc->Document()); + + *aPrevContainer = UNIQUE_ID(prevContainer); + + return IPC_OK(); +} + +mozilla::ipc::IPCResult DocAccessiblePlatformExtChild::RecvTextForRange( + const uint64_t& aID, const int32_t& aStartOffset, + const uint64_t& aEndContainer, const int32_t& aEndOffset, nsString* aText) { + HyperTextAccessibleWrap* acc = IdToHyperTextAccessibleWrap(aID); + HyperTextAccessibleWrap* endContainer = + IdToHyperTextAccessibleWrap(aEndContainer); + if (!acc || !endContainer) { + return IPC_OK(); + } + + acc->TextForRange(*aText, aStartOffset, endContainer, aEndOffset); + + return IPC_OK(); +} + +HyperTextAccessibleWrap* +DocAccessiblePlatformExtChild::IdToHyperTextAccessibleWrap( + const uint64_t& aID) const { + return static_cast( + static_cast(Manager())->IdToHyperTextAccessible( + aID)); +} + +} // namespace a11y +} // namespace mozilla diff --git a/accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.h b/accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.h new file mode 100644 index 000000000000..d9ea0d6ee766 --- /dev/null +++ b/accessible/ipc/extension/mac/DocAccessiblePlatformExtChild.h @@ -0,0 +1,50 @@ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_a11y_DocAccessiblePlatformExtChild_h +#define mozilla_a11y_DocAccessiblePlatformExtChild_h + +#include "mozilla/a11y/PDocAccessiblePlatformExtChild.h" + +namespace mozilla { +namespace a11y { + +class HyperTextAccessibleWrap; +class DocAccessibleChild; + +class DocAccessiblePlatformExtChild : public PDocAccessiblePlatformExtChild { + public: + mozilla::ipc::IPCResult RecvLeftWordAt( + const uint64_t& aID, const int32_t& aOffset, uint64_t* aStartContainer, + int32_t* aStartOffset, uint64_t* aEndContainer, int32_t* aEndOffset); + + mozilla::ipc::IPCResult RecvRightWordAt( + const uint64_t& aID, const int32_t& aOffset, uint64_t* aStartContainer, + int32_t* aStartOffset, uint64_t* aEndContainer, int32_t* aEndOffset); + + mozilla::ipc::IPCResult RecvNextClusterAt(const uint64_t& aID, + const int32_t& aOffset, + uint64_t* aNextContainer, + int32_t* aNextOffset); + + mozilla::ipc::IPCResult RecvPreviousClusterAt(const uint64_t& aID, + const int32_t& aOffset, + uint64_t* aPrevContainer, + int32_t* aPrevOffset); + + mozilla::ipc::IPCResult RecvTextForRange(const uint64_t& aID, + const int32_t& aStartOffset, + const uint64_t& aEndContainer, + const int32_t& aEndOffset, + nsString* aText); + + private: + HyperTextAccessibleWrap* IdToHyperTextAccessibleWrap( + const uint64_t& aID) const; +}; +} // namespace a11y +} // namespace mozilla + +#endif diff --git a/accessible/ipc/extension/mac/DocAccessiblePlatformExtParent.h b/accessible/ipc/extension/mac/DocAccessiblePlatformExtParent.h new file mode 100644 index 000000000000..07e65c6e2d20 --- /dev/null +++ b/accessible/ipc/extension/mac/DocAccessiblePlatformExtParent.h @@ -0,0 +1,19 @@ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_a11y_DocAccessiblePlatformExtParent_h +#define mozilla_a11y_DocAccessiblePlatformExtParent_h + +#include "mozilla/a11y/PDocAccessiblePlatformExtParent.h" + +namespace mozilla { +namespace a11y { +class DocAccessiblePlatformExtParent : public PDocAccessiblePlatformExtParent { + +}; +} // namespace a11y +} // namespace mozilla + +#endif diff --git a/accessible/ipc/extension/mac/PDocAccessiblePlatformExt.ipdl b/accessible/ipc/extension/mac/PDocAccessiblePlatformExt.ipdl new file mode 100644 index 000000000000..232c1ef0d622 --- /dev/null +++ b/accessible/ipc/extension/mac/PDocAccessiblePlatformExt.ipdl @@ -0,0 +1,37 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +include protocol PDocAccessible; + +namespace mozilla { +namespace a11y { + +nested(upto inside_sync) sync protocol PDocAccessiblePlatformExt { + manager PDocAccessible; + +child: + async __delete__(); + + nested(inside_sync) sync LeftWordAt(uint64_t aID, int32_t aOffset) + returns(uint64_t aStartContainer, int32_t aStartOffset, + uint64_t aEndContainer, int32_t aEndOffset); + + nested(inside_sync) sync RightWordAt(uint64_t aID, int32_t aOffset) + returns(uint64_t aStartContainer, int32_t aStartOffset, + uint64_t aEndContainer, int32_t aEndOffset); + + nested(inside_sync) sync NextClusterAt(uint64_t aID, int32_t aOffset) + returns(uint64_t aNextContainer, int32_t aNextOffset); + + nested(inside_sync) sync PreviousClusterAt(uint64_t aID, int32_t aOffset) + returns(uint64_t aNextContainer, int32_t aNextOffset); + + nested(inside_sync) sync TextForRange(uint64_t aID, int32_t aStartOffset, uint64_t aEndContainer, int32_t aEndOffset) + returns(nsString aText); +}; + +} // namespace a11y +} // namespace mozilla diff --git a/accessible/ipc/extension/mac/moz.build b/accessible/ipc/extension/mac/moz.build new file mode 100644 index 000000000000..b3b75e12474f --- /dev/null +++ b/accessible/ipc/extension/mac/moz.build @@ -0,0 +1,28 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +if CONFIG['ACCESSIBILITY']: + IPDL_SOURCES += ['PDocAccessiblePlatformExt.ipdl'] + + EXPORTS.mozilla.a11y += [ + 'DocAccessiblePlatformExtChild.h', + 'DocAccessiblePlatformExtParent.h', + ] + + SOURCES += [ + 'DocAccessiblePlatformExtChild.cpp', + ] + + LOCAL_INCLUDES += [ + '/accessible/base', + '/accessible/generic', + '/accessible/ipc/other', + '/accessible/mac', + ] + +include('/ipc/chromium/chromium-config.mozbuild') + +FINAL_LIBRARY = 'xul' diff --git a/accessible/ipc/extension/moz.build b/accessible/ipc/extension/moz.build index 34c6784a839c..c532dfc83be8 100644 --- a/accessible/ipc/extension/moz.build +++ b/accessible/ipc/extension/moz.build @@ -4,7 +4,11 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': +toolkit = CONFIG['MOZ_WIDGET_TOOLKIT'] + +if toolkit == 'android': DIRS += ['android'] +elif toolkit == 'cocoa': + DIRS += ['mac'] else: DIRS += ['other'] diff --git a/ipc/ipdl/sync-messages.ini b/ipc/ipdl/sync-messages.ini index 7f53607a10d9..a0bd3ddd29e6 100644 --- a/ipc/ipdl/sync-messages.ini +++ b/ipc/ipdl/sync-messages.ini @@ -614,6 +614,22 @@ platform = win description = Legacy a11y IPC platform = win +[PDocAccessiblePlatformExt::LeftWordAt] +description = Retrieve left word range from offset. Platform API is synchronous, so this needs to be too. +platform = mac +[PDocAccessiblePlatformExt::RightWordAt] +description = Retrieve left word range from offset. Platform API is synchronous, so this needs to be too. +platform = mac +[PDocAccessiblePlatformExt::NextClusterAt] +description = Retrieve next character from offset. Platform API is synchronous, so this needs to be too. +platform = mac +[PDocAccessiblePlatformExt::PreviousClusterAt] +description = Retrieve previous character from offset. Platform API is synchronous, so this needs to be too. +platform = mac +[PDocAccessiblePlatformExt::TextForRange] +description = Retrieve flattened string for text range. Platform API is synchronous, so this needs to be too. +platform = mac + # Plugins [PPluginWidget::Create] description = Legacy NPAPI IPC