зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1290823 - Factor out the code for dispatching a single tap event to observers into its own function. r=rbarker
This is not just a refactoring. It ensures that the early return in the factored-out code only skips the dispatch to observers, *not* the additional processing by ChromeProcessController. MozReview-Commit-ID: F7xCoORKRlG --HG-- extra : rebase_source : f9ef57d25a54442dd083560029437fcad885149c
This commit is contained in:
Родитель
afa6c4d5f3
Коммит
7230352e0f
|
@ -43,6 +43,44 @@ AndroidContentController::NotifyDefaultPrevented(IAPZCTreeManager* aManager,
|
||||||
aManager->ContentReceivedInputBlock(aInputBlockId, aDefaultPrevented);
|
aManager->ContentReceivedInputBlock(aInputBlockId, aDefaultPrevented);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
AndroidContentController::DispatchSingleTapToObservers(const LayoutDevicePoint& aPoint,
|
||||||
|
const ScrollableLayerGuid& aGuid) const
|
||||||
|
{
|
||||||
|
nsIContent* content = nsLayoutUtils::FindContentFor(aGuid.mScrollId);
|
||||||
|
nsIPresShell* shell = content
|
||||||
|
? mozilla::layers::APZCCallbackHelper::GetRootContentDocumentPresShellForContent(content)
|
||||||
|
: nullptr;
|
||||||
|
|
||||||
|
if (!shell || !shell->GetPresContext()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSSPoint point = mozilla::layers::APZCCallbackHelper::ApplyCallbackTransform(
|
||||||
|
aPoint / shell->GetPresContext()->CSSToDevPixelScale(), aGuid);
|
||||||
|
|
||||||
|
if (shell->ScaleToResolution()) {
|
||||||
|
// We need to convert from the root document to the root content document,
|
||||||
|
// by unapplying the resolution that's on the content document.
|
||||||
|
const float resolution = shell->GetResolution();
|
||||||
|
point.x /= resolution;
|
||||||
|
point.y /= resolution;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSSIntPoint rounded = RoundedToInt(point);
|
||||||
|
nsAppShell::PostEvent([rounded] {
|
||||||
|
nsCOMPtr<nsIObserverService> obsServ =
|
||||||
|
mozilla::services::GetObserverService();
|
||||||
|
if (!obsServ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsPrintfCString data("{\"x\":%d,\"y\":%d}", rounded.x, rounded.y);
|
||||||
|
obsServ->NotifyObservers(nullptr, "Gesture:SingleTap",
|
||||||
|
NS_ConvertASCIItoUTF16(data).get());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AndroidContentController::HandleTap(TapType aType, const LayoutDevicePoint& aPoint,
|
AndroidContentController::HandleTap(TapType aType, const LayoutDevicePoint& aPoint,
|
||||||
Modifiers aModifiers,
|
Modifiers aModifiers,
|
||||||
|
@ -55,38 +93,7 @@ AndroidContentController::HandleTap(TapType aType, const LayoutDevicePoint& aPoi
|
||||||
// done from either thread but we need access to the callback transform
|
// done from either thread but we need access to the callback transform
|
||||||
// so we do it from the main thread.
|
// so we do it from the main thread.
|
||||||
if (NS_IsMainThread() && aType == TapType::eSingleTap) {
|
if (NS_IsMainThread() && aType == TapType::eSingleTap) {
|
||||||
nsIContent* content = nsLayoutUtils::FindContentFor(aGuid.mScrollId);
|
DispatchSingleTapToObservers(aPoint, aGuid);
|
||||||
nsIPresShell* shell = content
|
|
||||||
? mozilla::layers::APZCCallbackHelper::GetRootContentDocumentPresShellForContent(content)
|
|
||||||
: nullptr;
|
|
||||||
|
|
||||||
if (!shell || !shell->GetPresContext()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CSSPoint point = mozilla::layers::APZCCallbackHelper::ApplyCallbackTransform(
|
|
||||||
aPoint / shell->GetPresContext()->CSSToDevPixelScale(), aGuid);
|
|
||||||
|
|
||||||
if (shell->ScaleToResolution()) {
|
|
||||||
// We need to convert from the root document to the root content document,
|
|
||||||
// by unapplying the resolution that's on the content document.
|
|
||||||
const float resolution = shell->GetResolution();
|
|
||||||
point.x /= resolution;
|
|
||||||
point.y /= resolution;
|
|
||||||
}
|
|
||||||
|
|
||||||
CSSIntPoint rounded = RoundedToInt(point);
|
|
||||||
nsAppShell::PostEvent([rounded] {
|
|
||||||
nsCOMPtr<nsIObserverService> obsServ =
|
|
||||||
mozilla::services::GetObserverService();
|
|
||||||
if (!obsServ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsPrintfCString data("{\"x\":%d,\"y\":%d}", rounded.x, rounded.y);
|
|
||||||
obsServ->NotifyObservers(nullptr, "Gesture:SingleTap",
|
|
||||||
NS_ConvertASCIItoUTF16(data).get());
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChromeProcessController::HandleTap(aType, aPoint, aModifiers, aGuid, aInputBlockId);
|
ChromeProcessController::HandleTap(aType, aPoint, aModifiers, aGuid, aInputBlockId);
|
||||||
|
|
|
@ -48,6 +48,9 @@ public:
|
||||||
uint64_t aInputBlockId, bool aDefaultPrevented);
|
uint64_t aInputBlockId, bool aDefaultPrevented);
|
||||||
private:
|
private:
|
||||||
nsWindow* mAndroidWindow;
|
nsWindow* mAndroidWindow;
|
||||||
|
|
||||||
|
void DispatchSingleTapToObservers(const LayoutDevicePoint& aPoint,
|
||||||
|
const ScrollableLayerGuid& aGuid) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace widget
|
} // namespace widget
|
||||||
|
|
Загрузка…
Ссылка в новой задаче