зеркало из https://github.com/mozilla/gecko-dev.git
Back out bug 1119497 and one patch from bug 920036 for causing bug 1121033. r=me
This commit is contained in:
Родитель
3af458857c
Коммит
cdac1b867f
|
@ -2195,11 +2195,7 @@ TabParent::MaybeForwardEventToRenderFrame(WidgetInputEvent& aEvent,
|
|||
ScrollableLayerGuid* aOutTargetGuid,
|
||||
uint64_t* aOutInputBlockId)
|
||||
{
|
||||
if (aEvent.mClass == eWheelEventClass
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
|| aEvent.mClass == eTouchEventClass
|
||||
#endif
|
||||
) {
|
||||
if (aEvent.mClass == eWheelEventClass) {
|
||||
// Wheel events must be sent to APZ directly from the widget. New APZ-
|
||||
// aware events should follow suit and move there as well. However, we
|
||||
// do need to inform the child process of the correct target and block
|
||||
|
|
|
@ -89,7 +89,7 @@ APZCTreeManager::CalculatePendingDisplayPort(
|
|||
APZCTreeManager::APZCTreeManager()
|
||||
: mInputQueue(new InputQueue()),
|
||||
mTreeLock("APZCTreeLock"),
|
||||
mHitResultForInputBlock(HitNothing),
|
||||
mHitResultForInputBlock(NoApzcHit),
|
||||
mRetainedTouchIdentifier(-1),
|
||||
mTouchCount(0),
|
||||
mApzcTreeLog("apzctree")
|
||||
|
@ -561,7 +561,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
}
|
||||
nsEventStatus result = nsEventStatus_eIgnore;
|
||||
Matrix4x4 transformToApzc;
|
||||
HitTestResult hitResult = HitNothing;
|
||||
HitTestResult hitResult = NoApzcHit;
|
||||
switch (aEvent.mInputType) {
|
||||
case MULTITOUCH_INPUT: {
|
||||
MultiTouchInput& touchInput = aEvent.AsMultiTouchInput();
|
||||
|
@ -572,7 +572,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
nsRefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(wheelInput.mOrigin,
|
||||
&hitResult);
|
||||
if (apzc) {
|
||||
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
|
||||
MOZ_ASSERT(hitResult == ApzcHitRegion || hitResult == ApzcContentRegion);
|
||||
|
||||
transformToApzc = GetScreenToApzcTransform(apzc);
|
||||
wheelInput.mLocalOrigin =
|
||||
|
@ -580,7 +580,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
|
||||
result = mInputQueue->ReceiveInputEvent(
|
||||
apzc,
|
||||
/* aTargetConfirmed = */ hitResult == HitLayer,
|
||||
/* aTargetConfirmed = */ hitResult == ApzcHitRegion,
|
||||
wheelInput, aOutInputBlockId);
|
||||
|
||||
// Update the out-parameters so they are what the caller expects.
|
||||
|
@ -595,7 +595,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
nsRefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(panInput.mPanStartPoint,
|
||||
&hitResult);
|
||||
if (apzc) {
|
||||
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
|
||||
MOZ_ASSERT(hitResult == ApzcHitRegion || hitResult == ApzcContentRegion);
|
||||
transformToApzc = GetScreenToApzcTransform(apzc);
|
||||
panInput.mLocalPanStartPoint = TransformTo<ParentLayerPixel>(
|
||||
transformToApzc, panInput.mPanStartPoint);
|
||||
|
@ -603,7 +603,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
transformToApzc, panInput.mPanDisplacement, panInput.mPanStartPoint);
|
||||
result = mInputQueue->ReceiveInputEvent(
|
||||
apzc,
|
||||
/* aTargetConfirmed = */ hitResult == HitLayer,
|
||||
/* aTargetConfirmed = */ hitResult == ApzcHitRegion,
|
||||
panInput, aOutInputBlockId);
|
||||
|
||||
// Update the out-parameters so they are what the caller expects.
|
||||
|
@ -620,13 +620,13 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
nsRefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(pinchInput.mFocusPoint,
|
||||
&hitResult);
|
||||
if (apzc) {
|
||||
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
|
||||
MOZ_ASSERT(hitResult == ApzcHitRegion || hitResult == ApzcContentRegion);
|
||||
transformToApzc = GetScreenToApzcTransform(apzc);
|
||||
pinchInput.mLocalFocusPoint = TransformTo<ParentLayerPixel>(
|
||||
transformToApzc, pinchInput.mFocusPoint);
|
||||
result = mInputQueue->ReceiveInputEvent(
|
||||
apzc,
|
||||
/* aTargetConfirmed = */ hitResult == HitLayer,
|
||||
/* aTargetConfirmed = */ hitResult == ApzcHitRegion,
|
||||
pinchInput, aOutInputBlockId);
|
||||
|
||||
// Update the out-parameters so they are what the caller expects.
|
||||
|
@ -641,13 +641,13 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
nsRefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(tapInput.mPoint,
|
||||
&hitResult);
|
||||
if (apzc) {
|
||||
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
|
||||
MOZ_ASSERT(hitResult == ApzcHitRegion || hitResult == ApzcContentRegion);
|
||||
transformToApzc = GetScreenToApzcTransform(apzc);
|
||||
tapInput.mLocalPoint = TransformTo<ParentLayerPixel>(
|
||||
transformToApzc, tapInput.mPoint);
|
||||
result = mInputQueue->ReceiveInputEvent(
|
||||
apzc,
|
||||
/* aTargetConfirmed = */ hitResult == HitLayer,
|
||||
/* aTargetConfirmed = */ hitResult == ApzcHitRegion,
|
||||
tapInput, aOutInputBlockId);
|
||||
|
||||
// Update the out-parameters so they are what the caller expects.
|
||||
|
@ -658,7 +658,7 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (hitResult == HitOverscrolledApzc) {
|
||||
if (hitResult == OverscrolledApzc) {
|
||||
result = nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
return result;
|
||||
|
@ -715,9 +715,9 @@ APZCTreeManager::ProcessTouchInput(MultiTouchInput& aInput,
|
|||
// NS_TOUCH_START event contains all active touches of the current
|
||||
// session thus resetting mTouchCount.
|
||||
mTouchCount = aInput.mTouches.Length();
|
||||
mHitResultForInputBlock = HitNothing;
|
||||
mHitResultForInputBlock = NoApzcHit;
|
||||
nsRefPtr<AsyncPanZoomController> apzc = GetTouchInputBlockAPZC(aInput, &mHitResultForInputBlock);
|
||||
// XXX the following check assumes mHitResultForInputBlock == HitLayer
|
||||
// XXX the following check assumes mHitResultForInputBlock == ApzcHitRegion
|
||||
// (and that mApzcForInputBlock was the confirmed target of the previous
|
||||
// input block). Eventually it would be better to move this into InputQueue
|
||||
// and have it auto-generated when we start processing events in a new
|
||||
|
@ -769,7 +769,7 @@ APZCTreeManager::ProcessTouchInput(MultiTouchInput& aInput,
|
|||
|
||||
nsEventStatus result = nsEventStatus_eIgnore;
|
||||
if (mApzcForInputBlock) {
|
||||
MOZ_ASSERT(mHitResultForInputBlock == HitLayer || mHitResultForInputBlock == HitDispatchToContentRegion);
|
||||
MOZ_ASSERT(mHitResultForInputBlock == ApzcHitRegion || mHitResultForInputBlock == ApzcContentRegion);
|
||||
|
||||
mApzcForInputBlock->GetGuid(aOutTargetGuid);
|
||||
// For computing the input for the APZC, used the cached transform.
|
||||
|
@ -782,7 +782,7 @@ APZCTreeManager::ProcessTouchInput(MultiTouchInput& aInput,
|
|||
transformToApzc, ScreenPoint(touchData.mScreenPoint));
|
||||
}
|
||||
result = mInputQueue->ReceiveInputEvent(mApzcForInputBlock,
|
||||
/* aTargetConfirmed = */ mHitResultForInputBlock == HitLayer,
|
||||
/* aTargetConfirmed = */ mHitResultForInputBlock == ApzcHitRegion,
|
||||
aInput, aOutInputBlockId);
|
||||
|
||||
// For computing the event to pass back to Gecko, use the up-to-date transforms.
|
||||
|
@ -797,7 +797,7 @@ APZCTreeManager::ProcessTouchInput(MultiTouchInput& aInput,
|
|||
outTransform, touchData.mScreenPoint);
|
||||
}
|
||||
}
|
||||
if (mHitResultForInputBlock == HitOverscrolledApzc) {
|
||||
if (mHitResultForInputBlock == OverscrolledApzc) {
|
||||
result = nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
|
||||
|
@ -817,7 +817,7 @@ APZCTreeManager::ProcessTouchInput(MultiTouchInput& aInput,
|
|||
// don't keep dangling references and leak things.
|
||||
if (mTouchCount == 0) {
|
||||
mApzcForInputBlock = nullptr;
|
||||
mHitResultForInputBlock = HitNothing;
|
||||
mHitResultForInputBlock = NoApzcHit;
|
||||
mRetainedTouchIdentifier = -1;
|
||||
}
|
||||
|
||||
|
@ -848,18 +848,18 @@ APZCTreeManager::ProcessEvent(WidgetInputEvent& aEvent,
|
|||
|
||||
// Transform the refPoint.
|
||||
// If the event hits an overscrolled APZC, instruct the caller to ignore it.
|
||||
HitTestResult hitResult = HitNothing;
|
||||
HitTestResult hitResult = NoApzcHit;
|
||||
nsRefPtr<AsyncPanZoomController> apzc = GetTargetAPZC(ScreenPoint(aEvent.refPoint.x, aEvent.refPoint.y),
|
||||
&hitResult);
|
||||
if (apzc) {
|
||||
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
|
||||
MOZ_ASSERT(hitResult == ApzcHitRegion || hitResult == ApzcContentRegion);
|
||||
apzc->GetGuid(aOutTargetGuid);
|
||||
Matrix4x4 transformToApzc = GetScreenToApzcTransform(apzc);
|
||||
Matrix4x4 transformToGecko = GetApzcToGeckoTransform(apzc);
|
||||
Matrix4x4 outTransform = transformToApzc * transformToGecko;
|
||||
aEvent.refPoint = TransformTo<LayoutDevicePixel>(outTransform, aEvent.refPoint);
|
||||
}
|
||||
if (hitResult == HitOverscrolledApzc) {
|
||||
if (hitResult == OverscrolledApzc) {
|
||||
result = nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
return result;
|
||||
|
@ -1215,13 +1215,13 @@ already_AddRefed<AsyncPanZoomController>
|
|||
APZCTreeManager::GetTargetAPZC(const ScreenPoint& aPoint, HitTestResult* aOutHitResult)
|
||||
{
|
||||
MonitorAutoLock lock(mTreeLock);
|
||||
HitTestResult hitResult = HitNothing;
|
||||
HitTestResult hitResult = NoApzcHit;
|
||||
ParentLayerPoint point = ViewAs<ParentLayerPixel>(aPoint,
|
||||
PixelCastJustification::ScreenIsParentLayerForRoot);
|
||||
nsRefPtr<AsyncPanZoomController> target = GetAPZCAtPoint(mRootNode, point, &hitResult);
|
||||
|
||||
// If we are in an overscrolled APZC, we should be returning nullptr.
|
||||
MOZ_ASSERT(!(target && (hitResult == HitOverscrolledApzc)));
|
||||
MOZ_ASSERT(!(target && (hitResult == OverscrolledApzc)));
|
||||
if (aOutHitResult) {
|
||||
*aOutHitResult = hitResult;
|
||||
}
|
||||
|
@ -1366,25 +1366,25 @@ APZCTreeManager::GetAPZCAtPoint(HitTestingTreeNode* aNode,
|
|||
ParentLayerPoint childPoint = ViewAs<ParentLayerPixel>(hitTestPointForChildLayers.ref(),
|
||||
PixelCastJustification::MovingDownToChildren);
|
||||
result = GetAPZCAtPoint(node->GetLastChild(), childPoint, aOutHitResult);
|
||||
if (*aOutHitResult == HitOverscrolledApzc) {
|
||||
if (*aOutHitResult == OverscrolledApzc) {
|
||||
// We matched an overscrolled APZC, abort.
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
// If we didn't match anything in the subtree, check |node|.
|
||||
if (*aOutHitResult == HitNothing) {
|
||||
if (!result) {
|
||||
APZCTM_LOG("Testing ParentLayer point %s (Layer %s) against node %p\n",
|
||||
Stringify(aHitTestPoint).c_str(),
|
||||
hitTestPointForChildLayers ? Stringify(hitTestPointForChildLayers.ref()).c_str() : "nil",
|
||||
node);
|
||||
HitTestResult hitResult = node->HitTest(aHitTestPoint);
|
||||
if (hitResult != HitTestResult::HitNothing) {
|
||||
if (hitResult != HitTestResult::NoApzcHit) {
|
||||
result = node->GetNearestContainingApzc();
|
||||
APZCTM_LOG("Successfully matched APZC %p via node %p (hit result %d)\n",
|
||||
result, node, hitResult);
|
||||
MOZ_ASSERT(hitResult == HitLayer || hitResult == HitDispatchToContentRegion);
|
||||
// If event regions are disabled, *aOutHitResult will be HitLayer
|
||||
MOZ_ASSERT(hitResult == ApzcHitRegion || hitResult == ApzcContentRegion);
|
||||
// If event regions are disabled, *aOutHitResult will be ApzcHitRegion
|
||||
*aOutHitResult = hitResult;
|
||||
}
|
||||
}
|
||||
|
@ -1392,14 +1392,14 @@ APZCTreeManager::GetAPZCAtPoint(HitTestingTreeNode* aNode,
|
|||
// If we are overscrolled, and the point matches us or one of our children,
|
||||
// the result is inside an overscrolled APZC, inform our caller of this
|
||||
// (callers typically ignore events targeted at overscrolled APZCs).
|
||||
if (*aOutHitResult != HitNothing && apzc && apzc->IsOverscrolled()) {
|
||||
if (result && apzc && apzc->IsOverscrolled()) {
|
||||
APZCTM_LOG("Result is inside overscrolled APZC %p\n", apzc);
|
||||
*aOutHitResult = HitOverscrolledApzc;
|
||||
*aOutHitResult = OverscrolledApzc;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (*aOutHitResult != HitNothing) {
|
||||
if (result && !gfxPrefs::LayoutEventRegionsEnabled()) {
|
||||
if (result) {
|
||||
if (!gfxPrefs::LayoutEventRegionsEnabled()) {
|
||||
// When event-regions are disabled, we treat scrollinfo layers as
|
||||
// regular scrollable layers. Unfortunately, their "hit region" (which
|
||||
// we create from the composition bounds) is their full area, and they
|
||||
|
|
|
@ -11,10 +11,10 @@ namespace mozilla {
|
|||
namespace layers {
|
||||
|
||||
enum HitTestResult {
|
||||
HitNothing,
|
||||
HitLayer,
|
||||
HitDispatchToContentRegion,
|
||||
HitOverscrolledApzc,
|
||||
NoApzcHit,
|
||||
ApzcHitRegion,
|
||||
ApzcContentRegion,
|
||||
OverscrolledApzc,
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -195,24 +195,24 @@ HitTestingTreeNode::HitTest(const ParentLayerPoint& aPoint) const
|
|||
// If there's no APZC, then we do need to check against the mEventRegions
|
||||
// (which contains the layer's visible region) for obscuration purposes.
|
||||
if (!gfxPrefs::LayoutEventRegionsEnabled() && GetApzc()) {
|
||||
return HitTestResult::HitLayer;
|
||||
return HitTestResult::ApzcHitRegion;
|
||||
}
|
||||
|
||||
// convert into Layer coordinate space
|
||||
Maybe<LayerPoint> pointInLayerPixels = Untransform(aPoint);
|
||||
if (!pointInLayerPixels) {
|
||||
return HitTestResult::HitNothing;
|
||||
return HitTestResult::NoApzcHit;
|
||||
}
|
||||
LayerIntPoint point = RoundedToInt(pointInLayerPixels.ref());
|
||||
|
||||
// test against event regions in Layer coordinate space
|
||||
if (!mEventRegions.mHitRegion.Contains(point.x, point.y)) {
|
||||
return HitTestResult::HitNothing;
|
||||
return HitTestResult::NoApzcHit;
|
||||
}
|
||||
if (mEventRegions.mDispatchToContentHitRegion.Contains(point.x, point.y)) {
|
||||
return HitTestResult::HitDispatchToContentRegion;
|
||||
return HitTestResult::ApzcContentRegion;
|
||||
}
|
||||
return HitTestResult::HitLayer;
|
||||
return HitTestResult::ApzcHitRegion;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -2551,25 +2551,6 @@ protected:
|
|||
manager->UpdateHitTestingTree(nullptr, root, false, 0, 0);
|
||||
rootApzc = ApzcOf(root);
|
||||
}
|
||||
|
||||
void CreateBug1119497LayerTree() {
|
||||
const char* layerTreeSyntax = "c(tt)";
|
||||
// LayerID 0 12
|
||||
// 0 is the root and doesn't have an APZC
|
||||
// 1 is behind 2 and does have an APZC
|
||||
// 2 entirely covers 1 and should take all the input events
|
||||
nsIntRegion layerVisibleRegions[] = {
|
||||
nsIntRegion(nsIntRect(0, 0, 100, 100)),
|
||||
nsIntRegion(nsIntRect(0, 0, 100, 100)),
|
||||
nsIntRegion(nsIntRect(0, 0, 100, 100)),
|
||||
};
|
||||
root = CreateLayerTree(layerTreeSyntax, layerVisibleRegions, nullptr, lm, layers);
|
||||
|
||||
SetScrollableFrameMetrics(layers[1], FrameMetrics::START_SCROLL_ID + 1);
|
||||
|
||||
registration = MakeUnique<ScopedLayerTreeRegistration>(0, root, mcc);
|
||||
manager->UpdateHitTestingTree(nullptr, root, false, 0, 0);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(APZEventRegionsTester, HitRegionImmediateResponse) {
|
||||
|
@ -2659,20 +2640,7 @@ TEST_F(APZEventRegionsTester, Obscuration) {
|
|||
HitTestResult result;
|
||||
nsRefPtr<AsyncPanZoomController> hit = manager->GetTargetAPZC(ScreenPoint(50, 75), &result);
|
||||
EXPECT_EQ(child, hit.get());
|
||||
EXPECT_EQ(HitTestResult::HitLayer, result);
|
||||
}
|
||||
|
||||
TEST_F(APZEventRegionsTester, Bug1119497) {
|
||||
SCOPED_GFX_PREF(LayoutEventRegionsEnabled, bool, true);
|
||||
|
||||
CreateBug1119497LayerTree();
|
||||
|
||||
HitTestResult result;
|
||||
nsRefPtr<AsyncPanZoomController> hit = manager->GetTargetAPZC(ScreenPoint(50, 50), &result);
|
||||
// We should hit layers[2], so |result| will be HitLayer but there's no
|
||||
// actual APZC in that parent chain, so |hit| should be nullptr.
|
||||
EXPECT_EQ(nullptr, hit.get());
|
||||
EXPECT_EQ(HitTestResult::HitLayer, result);
|
||||
EXPECT_EQ(HitTestResult::ApzcHitRegion, result);
|
||||
}
|
||||
|
||||
class TaskRunMetrics {
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "gfxPrefs.h"
|
||||
#include "libui/Input.h"
|
||||
#include "mozilla/ClearOnShutdown.h"
|
||||
#include "mozilla/MouseEvents.h"
|
||||
#include "mozilla/Mutex.h"
|
||||
#include "mozilla/TimeStamp.h"
|
||||
#include "mozilla/TouchEvents.h"
|
||||
|
@ -332,6 +333,21 @@ GeckoTouchDispatcher::ResampleTouchMoves(MultiTouchInput& aOutTouch, TimeStamp a
|
|||
aOutTouch.mTimeStamp = sampleTime;
|
||||
}
|
||||
|
||||
// Some touch events get sent as mouse events. If APZ doesn't capture the event
|
||||
// and if a touch only has 1 touch input, we can send a mouse event.
|
||||
void
|
||||
GeckoTouchDispatcher::DispatchMouseEvent(MultiTouchInput& aMultiTouch,
|
||||
bool aForwardToChildren)
|
||||
{
|
||||
WidgetMouseEvent mouseEvent = aMultiTouch.ToWidgetMouseEvent(nullptr);
|
||||
if (mouseEvent.message == NS_EVENT_NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
mouseEvent.mFlags.mNoCrossProcessBoundaryForwarding = !aForwardToChildren;
|
||||
nsWindow::DispatchInputEvent(mouseEvent);
|
||||
}
|
||||
|
||||
static bool
|
||||
IsExpired(const MultiTouchInput& aTouch)
|
||||
{
|
||||
|
@ -356,7 +372,9 @@ GeckoTouchDispatcher::DispatchTouchEvent(MultiTouchInput& aMultiTouch)
|
|||
return;
|
||||
}
|
||||
|
||||
nsWindow::DispatchTouchInput(aMultiTouch);
|
||||
bool captured = false;
|
||||
WidgetTouchEvent event = aMultiTouch.ToWidgetTouchEvent(nullptr);
|
||||
nsEventStatus status = nsWindow::DispatchInputEvent(event, &captured);
|
||||
|
||||
if (mEnabledUniformityInfo && profiler_is_active()) {
|
||||
const char* touchAction = "Invalid";
|
||||
|
@ -377,6 +395,11 @@ GeckoTouchDispatcher::DispatchTouchEvent(MultiTouchInput& aMultiTouch)
|
|||
TouchDataPayload* payload = new TouchDataPayload(touchPoint);
|
||||
PROFILER_MARKER_PAYLOAD(touchAction, payload);
|
||||
}
|
||||
|
||||
if (!captured && (aMultiTouch.mTouches.Length() == 1)) {
|
||||
bool forwardToChildren = status != nsEventStatus_eConsumeNoDefault;
|
||||
DispatchMouseEvent(aMultiTouch, forwardToChildren);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace mozilla
|
||||
|
|
|
@ -47,9 +47,6 @@
|
|||
#include "mozilla/gfx/2D.h"
|
||||
#include "mozilla/layers/APZCTreeManager.h"
|
||||
#include "mozilla/layers/CompositorParent.h"
|
||||
#include "mozilla/layers/InputAPZContext.h"
|
||||
#include "mozilla/MouseEvents.h"
|
||||
#include "mozilla/TouchEvents.h"
|
||||
#include "nsThreadUtils.h"
|
||||
#include "HwcComposer2D.h"
|
||||
|
||||
|
@ -230,91 +227,35 @@ nsWindow::NotifyVsync(TimeStamp aVsyncTimestamp)
|
|||
}
|
||||
}
|
||||
|
||||
/*static*/ nsEventStatus
|
||||
nsWindow::DispatchInputEvent(WidgetGUIEvent& aEvent)
|
||||
nsEventStatus
|
||||
nsWindow::DispatchInputEvent(WidgetGUIEvent& aEvent, bool* aWasCaptured)
|
||||
{
|
||||
if (aWasCaptured) {
|
||||
*aWasCaptured = false;
|
||||
}
|
||||
if (!gFocusedWindow) {
|
||||
return nsEventStatus_eIgnore;
|
||||
}
|
||||
|
||||
gFocusedWindow->UserActivity();
|
||||
|
||||
nsEventStatus status;
|
||||
aEvent.widget = gFocusedWindow;
|
||||
|
||||
if (TabParent* capturer = TabParent::GetEventCapturer()) {
|
||||
bool captured = capturer->TryCapture(aEvent);
|
||||
if (aWasCaptured) {
|
||||
*aWasCaptured = captured;
|
||||
}
|
||||
if (captured) {
|
||||
return nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
}
|
||||
|
||||
nsEventStatus status;
|
||||
gFocusedWindow->DispatchEvent(&aEvent, status);
|
||||
return status;
|
||||
}
|
||||
|
||||
/*static*/ void
|
||||
nsWindow::DispatchTouchInput(MultiTouchInput& aInput)
|
||||
{
|
||||
if (!gFocusedWindow) {
|
||||
return;
|
||||
}
|
||||
|
||||
gFocusedWindow->UserActivity();
|
||||
gFocusedWindow->DispatchTouchInputViaAPZ(aInput);
|
||||
}
|
||||
|
||||
void
|
||||
nsWindow::DispatchTouchInputViaAPZ(MultiTouchInput& aInput)
|
||||
{
|
||||
if (!mAPZC) {
|
||||
// In general mAPZC should not be null, but during initial setup
|
||||
// it might be, so we handle that case by ignoring touch input there.
|
||||
return;
|
||||
}
|
||||
|
||||
// First send it through the APZ code
|
||||
mozilla::layers::ScrollableLayerGuid guid;
|
||||
uint64_t inputBlockId;
|
||||
nsEventStatus rv = mAPZC->ReceiveInputEvent(aInput, &guid, &inputBlockId);
|
||||
// If the APZ says to drop it, then we drop it
|
||||
if (rv == nsEventStatus_eConsumeNoDefault) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Convert it to an event we can send to Gecko
|
||||
WidgetTouchEvent event = aInput.ToWidgetTouchEvent(this);
|
||||
|
||||
// If there is an event capturing child process, send it directly there.
|
||||
// This happens if we already sent a touchstart event through the root
|
||||
// process hit test and it ended up going to a child process. The event
|
||||
// capturing process should get all subsequent touch events in the same
|
||||
// event block. In this case the TryCapture call below will return true,
|
||||
// and the child process will take care of responding to the event as needed
|
||||
// so we don't need to do anything else here.
|
||||
if (TabParent* capturer = TabParent::GetEventCapturer()) {
|
||||
InputAPZContext context(guid, inputBlockId);
|
||||
if (capturer->TryCapture(event)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If it didn't get captured, dispatch the event into the gecko root process
|
||||
// for "normal" flow. The event might get sent to the child process still,
|
||||
// but if it doesn't we need to notify the APZ of various things. All of
|
||||
// that happens in DispatchEventForAPZ
|
||||
rv = DispatchEventForAPZ(&event, guid, inputBlockId);
|
||||
|
||||
// Finally, if the touch event had only one touch point, generate a mouse
|
||||
// event for it and send it through the gecko root process.
|
||||
// Technically we should not need to do this if the touch event was routed
|
||||
// to the child process, but that seems to expose a bug in B2G where the
|
||||
// keyboard doesn't go away in some cases.
|
||||
// Also for now we're dispatching mouse events from all touch events because
|
||||
// we need this for click events to work in the chrome process. Once we have
|
||||
// APZ and ChromeProcessController::HandleSingleTap working for the chrome
|
||||
// process we shouldn't need to do this at all.
|
||||
if (event.touches.Length() == 1) {
|
||||
WidgetMouseEvent mouseEvent = aInput.ToWidgetMouseEvent(this);
|
||||
if (mouseEvent.message != NS_EVENT_NULL) {
|
||||
mouseEvent.mFlags.mNoCrossProcessBoundaryForwarding = (rv == nsEventStatus_eConsumeNoDefault);
|
||||
DispatchEvent(&mouseEvent, rv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsWindow::Create(nsIWidget *aParent,
|
||||
void *aNativeParent,
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#ifndef nsWindow_h
|
||||
#define nsWindow_h
|
||||
|
||||
#include "InputData.h"
|
||||
#include "nsBaseWidget.h"
|
||||
#include "nsRegion.h"
|
||||
#include "nsIIdleServiceInternal.h"
|
||||
|
@ -52,8 +51,8 @@ public:
|
|||
|
||||
static void NotifyVsync(mozilla::TimeStamp aVsyncTimestamp);
|
||||
static void DoDraw(void);
|
||||
static nsEventStatus DispatchInputEvent(mozilla::WidgetGUIEvent& aEvent);
|
||||
static void DispatchTouchInput(mozilla::MultiTouchInput& aInput);
|
||||
static nsEventStatus DispatchInputEvent(mozilla::WidgetGUIEvent& aEvent,
|
||||
bool* aWasCaptured = nullptr);
|
||||
|
||||
NS_IMETHOD Create(nsIWidget *aParent,
|
||||
void *aNativeParent,
|
||||
|
@ -88,7 +87,6 @@ public:
|
|||
return NS_OK;
|
||||
}
|
||||
virtual nsIntPoint WidgetToScreenOffset();
|
||||
void DispatchTouchInputViaAPZ(mozilla::MultiTouchInput& aInput);
|
||||
NS_IMETHOD DispatchEvent(mozilla::WidgetGUIEvent* aEvent,
|
||||
nsEventStatus& aStatus);
|
||||
NS_IMETHOD CaptureRollupEvents(nsIRollupListener *aListener,
|
||||
|
|
Загрузка…
Ссылка в новой задаче