Bug 1351783 part 6 - Create and send KeyboardMap to APZCTreeManager. r=kats
This commit makes it so we initialize, send, and store a KeyboardMap for every
APZCTreeManager for later keyboard event processing.
This is a naive approach so it may be worth improving.
MozReview-Commit-ID: CYTbLL3wRlC
--- a/dom/xbl/moz.build
+++ b/dom/xbl/moz.build
@@ -8,16 +8,17 @@ with Files("**"):
BUG_COMPONENT = ("Core", "XBL")
DIRS += ['builtin']
EXPORTS += [
'nsBindingManager.h',
'nsXBLBinding.h',
'nsXBLService.h',
+ 'nsXBLWindowKeyHandler.h',
]
EXPORTS.mozilla.dom += [
'XBLChildrenElement.h',
]
UNIFIED_SOURCES += [
'nsBindingManager.cpp',
--- a/gfx/layers/apz/public/IAPZCTreeManager.h
+++ b/gfx/layers/apz/public/IAPZCTreeManager.h
@@ -16,16 +16,18 @@
#include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc
#include "Units.h" // for CSSPoint, CSSRect, etc
namespace mozilla {
class InputData;
namespace layers {
+class KeyboardMap;
+
enum AllowedTouchBehavior {
NONE = 0,
VERTICAL_PAN = 1 << 0,
HORIZONTAL_PAN = 1 << 1,
PINCH_ZOOM = 1 << 2,
DOUBLE_TAP_ZOOM = 1 << 3,
UNKNOWN = 1 << 4
};
@@ -100,16 +102,21 @@ public:
* See documentation for other ReceiveInputEvent above.
*/
nsEventStatus ReceiveInputEvent(
WidgetInputEvent& aEvent,
ScrollableLayerGuid* aOutTargetGuid,
uint64_t* aOutInputBlockId);
/**
+ * Set the keyboard shortcuts to use for translating keyboard events.
+ */
+ virtual void SetKeyboardMap(const KeyboardMap& aKeyboardMap) = 0;
+
+ /**
* Kicks an animation to zoom to a rect. This may be either a zoom out or zoom
* in. The actual animation is done on the compositor thread after being set
* up. |aRect| must be given in CSS pixels, relative to the document.
* |aFlags| is a combination of the ZoomToRectBehavior enum values.
*/
virtual void ZoomToRect(
const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -1430,16 +1430,22 @@ void
APZCTreeManager::ProcessTouchVelocity(uint32_t aTimestampMs, float aSpeedY)
{
if (mApzcForInputBlock) {
mApzcForInputBlock->HandleTouchVelocity(aTimestampMs, aSpeedY);
}
}
void
+APZCTreeManager::SetKeyboardMap(const KeyboardMap& aKeyboardMap)
+{
+ mKeyboardMap = aKeyboardMap;
+}
+
+void
APZCTreeManager::ZoomToRect(const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
const uint32_t aFlags)
{
RefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(aGuid);
if (apzc) {
apzc->ZoomToRect(aRect, aFlags);
}
--- a/gfx/layers/apz/src/APZCTreeManager.h
+++ b/gfx/layers/apz/src/APZCTreeManager.h
@@ -9,16 +9,17 @@
#include <unordered_map> // for std::unordered_map
#include "gfxPoint.h" // for gfxPoint
#include "mozilla/Assertions.h" // for MOZ_ASSERT_HELPER2
#include "mozilla/gfx/Logging.h" // for gfx::TreeLog
#include "mozilla/gfx/Matrix.h" // for Matrix4x4
#include "mozilla/layers/TouchCounter.h"// for TouchCounter
#include "mozilla/layers/IAPZCTreeManager.h" // for IAPZCTreeManager
+#include "mozilla/layers/Keyboard.h" // for KeyboardMap
#include "mozilla/Mutex.h" // for Mutex
#include "mozilla/RefPtr.h" // for RefPtr
#include "mozilla/TimeStamp.h" // for mozilla::TimeStamp
#include "nsCOMPtr.h" // for already_AddRefed
#if defined(MOZ_WIDGET_ANDROID)
#include "mozilla/layers/AndroidDynamicToolbarAnimator.h"
#endif // defined(MOZ_WIDGET_ANDROID)
@@ -207,16 +208,21 @@ public:
* was added to, if that was the case. May be null.
*/
nsEventStatus ReceiveInputEvent(
InputData& aEvent,
ScrollableLayerGuid* aOutTargetGuid,
uint64_t* aOutInputBlockId) override;
/**
+ * Set the keyboard shortcuts to use for translating keyboard events.
+ */
+ void SetKeyboardMap(const KeyboardMap& aKeyboardMap) override;
+
+ /**
* Kicks an animation to zoom to a rect. This may be either a zoom out or zoom
* in. The actual animation is done on the compositor thread after being set
* up. |aRect| must be given in CSS pixels, relative to the document.
* |aFlags| is a combination of the ZoomToRectBehavior enum values.
*/
void ZoomToRect(
const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
@@ -545,16 +551,20 @@ private:
* is considered part of the APZC tree management state.
* Finally, the lock needs to be held when accessing mZoomConstraints.
* IMPORTANT: See the note about lock ordering at the top of this file. */
mutable mozilla::Mutex mTreeLock;
RefPtr<HitTestingTreeNode> mRootNode;
/* Holds the zoom constraints for scrollable layers, as determined by the
* the main-thread gecko code. */
std::unordered_map<ScrollableLayerGuid, ZoomConstraints, ScrollableLayerGuidHash> mZoomConstraints;
+ /* A list of keyboard shortcuts to use for translating keyboard inputs into
+ * keyboard actions. This is gathered on the main thread from XBL bindings.
+ */
+ KeyboardMap mKeyboardMap;
/* This tracks the APZC that should receive all inputs for the current input event block.
* This allows touch points to move outside the thing they started on, but still have the
* touch events delivered to the same initial APZC. This will only ever be touched on the
* input delivery thread, and so does not require locking.
*/
RefPtr<AsyncPanZoomController> mApzcForInputBlock;
/* The hit result for the current input event block; this should always be in
* sync with mApzcForInputBlock.
--- a/gfx/layers/ipc/APZCTreeManagerChild.cpp
+++ b/gfx/layers/ipc/APZCTreeManagerChild.cpp
@@ -122,16 +122,22 @@ APZCTreeManagerChild::ReceiveInputEvent(
default: {
MOZ_ASSERT_UNREACHABLE("Invalid InputData type.");
return nsEventStatus_eConsumeNoDefault;
}
}
}
void
+APZCTreeManagerChild::SetKeyboardMap(const KeyboardMap& aKeyboardMap)
+{
+ SendSetKeyboardMap(aKeyboardMap);
+}
+
+void
APZCTreeManagerChild::ZoomToRect(
const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
const uint32_t aFlags)
{
SendZoomToRect(aGuid, aRect, aFlags);
}
--- a/gfx/layers/ipc/APZCTreeManagerChild.h
+++ b/gfx/layers/ipc/APZCTreeManagerChild.h
@@ -26,16 +26,19 @@ public:
nsEventStatus
ReceiveInputEvent(
InputData& aEvent,
ScrollableLayerGuid* aOutTargetGuid,
uint64_t* aOutInputBlockId) override;
void
+ SetKeyboardMap(const KeyboardMap& aKeyboardMap) override;
+
+ void
ZoomToRect(
const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
const uint32_t aFlags = DEFAULT_BEHAVIOR) override;
void
ContentReceivedInputBlock(
uint64_t aInputBlockId,
--- a/gfx/layers/ipc/APZCTreeManagerParent.cpp
+++ b/gfx/layers/ipc/APZCTreeManagerParent.cpp
@@ -140,16 +140,24 @@ APZCTreeManagerParent::RecvReceiveScroll
aOutTargetGuid,
aOutInputBlockId);
*aOutEvent = event;
return IPC_OK();
}
mozilla::ipc::IPCResult
+APZCTreeManagerParent::RecvSetKeyboardMap(const KeyboardMap& aKeyboardMap)
+{
+ mTreeManager->SetKeyboardMap(aKeyboardMap);
+
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult
APZCTreeManagerParent::RecvZoomToRect(
const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
const uint32_t& aFlags)
{
if (aGuid.mLayersId != mLayersId) {
// Guard against bad data from hijacked child processes
NS_ERROR("Unexpected layers id in RecvZoomToRect; dropping message...");
--- a/gfx/layers/ipc/APZCTreeManagerParent.h
+++ b/gfx/layers/ipc/APZCTreeManagerParent.h
@@ -74,16 +74,19 @@ public:
RecvReceiveScrollWheelInputEvent(
const ScrollWheelInput& aEvent,
nsEventStatus* aOutStatus,
ScrollWheelInput* aOutEvent,
ScrollableLayerGuid* aOutTargetGuid,
uint64_t* aOutInputBlockId) override;
mozilla::ipc::IPCResult
+ RecvSetKeyboardMap(const KeyboardMap& aKeyboardMap) override;
+
+ mozilla::ipc::IPCResult
RecvZoomToRect(
const ScrollableLayerGuid& aGuid,
const CSSRect& aRect,
const uint32_t& aFlags) override;
mozilla::ipc::IPCResult
RecvContentReceivedInputBlock(
const uint64_t& aInputBlockId,
--- a/gfx/layers/ipc/PAPZCTreeManager.ipdl
+++ b/gfx/layers/ipc/PAPZCTreeManager.ipdl
@@ -15,16 +15,17 @@ using LayoutDeviceCoord from "Units.h";
using LayoutDeviceIntPoint from "Units.h";
using mozilla::LayoutDevicePoint from "Units.h";
using ScreenPoint from "Units.h";
using struct mozilla::layers::ScrollableLayerGuid from "FrameMetrics.h";
using mozilla::layers::MaybeZoomConstraints from "FrameMetrics.h";
using mozilla::layers::TouchBehaviorFlags from "mozilla/layers/APZUtils.h";
using mozilla::layers::AsyncDragMetrics from "mozilla/layers/AsyncDragMetrics.h";
using mozilla::layers::GeckoContentController::TapType from "mozilla/layers/GeckoContentController.h";
+using class mozilla::layers::KeyboardMap from "mozilla/layers/Keyboard.h";
using nsEventStatus from "mozilla/EventForwards.h";
using EventMessage from "mozilla/EventForwards.h";
using mozilla::Modifiers from "mozilla/EventForwards.h";
using class mozilla::WidgetInputEvent from "mozilla/BasicEvents.h";
using class mozilla::WidgetMouseEventBase from "mozilla/MouseEvents.h";
using mozilla::WidgetMouseEvent::Reason from "mozilla/MouseEvents.h";
using class mozilla::WidgetTouchEvent from "mozilla/TouchEvents.h";
@@ -64,16 +65,18 @@ parent:
async ContentReceivedInputBlock(uint64_t aInputBlockId, bool PreventDefault);
async SetTargetAPZC(uint64_t aInputBlockId, ScrollableLayerGuid[] Targets);
async UpdateZoomConstraints(ScrollableLayerGuid aGuid, MaybeZoomConstraints aConstraints);
async CancelAnimation(ScrollableLayerGuid aGuid);
+ async SetKeyboardMap(KeyboardMap aKeyboardMap);
+
async SetDPI(float aDpiValue);
async SetAllowedTouchBehavior(uint64_t aInputBlockId, TouchBehaviorFlags[] aValues);
async StartScrollbarDrag(ScrollableLayerGuid aGuid, AsyncDragMetrics aDragMetrics);
async SetLongTapEnabled(bool aTapGestureEnabled);
--- a/widget/nsBaseWidget.cpp
+++ b/widget/nsBaseWidget.cpp
@@ -32,16 +32,17 @@
#include "mozilla/Preferences.h"
#include "BasicLayers.h"
#include "ClientLayerManager.h"
#include "mozilla/layers/Compositor.h"
#include "nsIXULRuntime.h"
#include "nsIXULWindow.h"
#include "nsIBaseWindow.h"
#include "nsXULPopupManager.h"
+#include "nsXBLWindowKeyHandler.h"
#include "nsIWidgetListener.h"
#include "nsIGfxInfo.h"
#include "npapi.h"
#include "X11UndefineNone.h"
#include "base/thread.h"
#include "prdtoa.h"
#include "prenv.h"
#include "mozilla/Attributes.h"
@@ -913,16 +914,17 @@ nsBaseWidget::CreateRootContentControlle
void nsBaseWidget::ConfigureAPZCTreeManager()
{
MOZ_ASSERT(mAPZC);
ConfigureAPZControllerThread();
mAPZC->SetDPI(GetDPI());
+ mAPZC->SetKeyboardMap(nsXBLWindowKeyHandler::CollectKeyboardShortcuts());
RefPtr<IAPZCTreeManager> treeManager = mAPZC; // for capture by the lambdas
ContentReceivedInputBlockCallback callback(
[treeManager](const ScrollableLayerGuid& aGuid,
uint64_t aInputBlockId,
bool aPreventDefault)
{