Files
palemoon27/layout/base/TouchManager.cpp
T
roytam1 5a5b052a7c import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 930218 part 1. Factor out the computation of block-size taken up by box-sizing into a separate function so we can reuse it. r=dbaron (22033f4184)
- Bug 930218 part 2. Account for the parent's box-sizing whe figuring out the percentage height of a kid with an intrinsic ratio for purposes of determining the parent's shrink-wrap width. r=dbaron (041711f58f)
- Bug 1235306 - Fix -Wimplicit-fallthrough warnings in layout/. r=dholbert (581c212254)
- Bug 1074971 - Add support for reserved commandkey combinations that can't be handled by content (e10s-only feature). r=smaug (e43d39dcef)
- Bug 1186799 part.1 nsHTMLEditorEventListener should commit composition when it receives unacceptable mousedown event r=smaug (17f2c48e96)
- Bug 1230216 - Changing nsIDOM*Event interfaces so that they don't inherit nsIDOMEvent. r=smaug (df77f91ecc)
- fix cancelBubble situation and align to gecko (bc133dc50a)
- Bug 1211402. Re-enable the upload step, but take out the stuff that no longer works (as in, everything.) r=me (cb7abd67d2)
- align (bac4aec6cc)
- Bug 1243608: P1. Only use video time if video frame contains seek target. r=cpearce (21d9e988ed)
- Bug 1244477: Offset seek time by start time. r=jwwang (743c24b2f7)
- Bug 1243608: P2. Pass the full SeekTarget object to MediaDecoderReader::Seek. r=cpearce (6ff30b4b65)
- Bug 1243608: P3. Make SeekTarget::mTime a TimeUnit object. r=cpearce (357d9864de)
- Bug 1243608: P4. Have MediaDecoderReader::SeekPromise return a TimeUnit. r=cpearce (53b476c62d)
- Bug 1159343: Interrupt seek early when possible. r=jwwang (9e26e69593)
- Bug 1243608: P5. Add type utility methods to SeekTarget class. r=cpearce (8e740bab50)
- Bug 1243608: P6. Only seek audio to video seek time when performing a fast seek. r=cpearce (d2a51a71f0)
- Bug 1233650. Part 1 - extract OutputStreamManager to its own file. r=roc. (52d533f923)
- Bug 1230882. Part 2 - remove DecodedStream::BeginShutdown() and other unused code. r=roc. (b2820b8f14)
- Bug 1231091. Part 1 - Add mVideoCompleted so MDSM can check when audio/video is done rendering. This removes the only caller of DecodedStream::IsFinished(). r=roc. (536f63e385)
- Bug 1146086: Properly marking overridden member with override keyword. v2. a=bustage (b6ed1b4e6c)
- Bug 1177243 - Use PodZero rather than memset in WebM decoders. r=rillian (f9853b72ee)
- Bug 1230054: Remove unused WebMReader. r=kinetik (1f88fe3c43)
- Bug 1230054: Add missing headers ON A CLOSED TREE. r=me (6e33accf03)
- Bug 1231091. Part 2 - return correct promises when audio/video track is asked. r=roc. (aef6342e59)
- Bug 1231091. Part 3 - resolve the end promise when all frames are rendered. r=roc. (bbb180dd90)
- Bug 1231091. Part 4 - ensure the end promise is resolved in the special case where video duration is 0. r=roc. (7835c31e75)
- Bug 1231091. Part 5 - Remove DecodedStream::IsFinished() and unused code. r=roc. (6dd02e5d6b)
- Bug 1231091. Part 6 - fix test_streams_element_capture.html timeout. r=roc. (8aae5c09cc)
- Bug 1232520 - dont' invoke AbstractThread::MainThread()->Dispatch() to avoid reentrant of AutoTaskDispatcher during tail dispatching phase. r=jya. (5434d0f370)
- Bug 1233650. Part 2 - make OutputStreamManager ref-counted so it can be shared between MDSM and DecodedStream. r=roc. (93e7d0e065)
- Bug 1233650. Part 3 - move creation of OutputStreamManager from DecodedStream to MDSM. r=roc. (a469dbcc9f)
- Bug 1233650. Part 4 - remove unused functions from DecodedStream. r=roc. (ec8753365e)
- Bug 1248314. Part 1 - Since OutputStreamManager::Connect/Disconnect is tightly coupled with the constructor/destructor of DecodedStreamData, it would improve cohesion to let DecodedStreamData manage an OutputStreamManager and know when to call OutputStreamManager::Connect/Disconnect. r=roc. (467d1472ca)
- Bug 1234424. Part 1 - share the underlying value of MDSM::mSameOriginMedia with DecodedStream. r=roc. (ff0abefb26)
- Bug 1234424. Part 2 - remove unused code. r=roc. (5a8266779b)
- Bug 1248314. part 2 - move track initialization code into the constructor of DecodedStreamData. r=roc. (4d57f47654)
- Bug 1248229. Part 1 - add test case to test if playback can work correctly after GC. r=roc. (83c81dc7cc)
- Bug 1248229. Part 2 - GC might happen in between OutputStreamManager::Disconnect() and OutputStreamManager::Connect(). We need to check if the stream is already destroyed before trying to connect it. r=roc. (c5a0ed670c)
- remove PM leftover (ed9ce00aad)
- Bug 1236703: P1. Add debugging information for MSE to about:media plugin. r=kentuckyfriedtakahe (4385a86197)
- Bug 1236703: P2. Add methods to retrieve debugging data on plain readers. r=jwwang (34bf637124)
- Bug 1236703: P3. Add moz specific method to retrieve debug data to media object IDL. r=bz (65c95eff74)
- Bug 1194721: Add additional PDU pack and unpack functions, r=shuang (d6ae416a10)
- Bug 1261307: Convert Unix socket IPC code to |UniquePtr|, r=nfroyd (cd797f4581)
- Bug 1236574 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in SocketBase subclasses; r=tzimmerman (6a20e9e905)
- Bug 1239207 - Don't process IPDL when not compiling; r=glandium (20ba7fb311)
- Bug 1210099 - Use diagnostic assert for union discriminator checks (r=jld) (74844eee1b)
- Bug 1208226 - Don't crash when failing to map a segment of shared memory. r=sotaro, billm (1822a634d9)
- Bug 1236635 - Fix compile error in IPC unit tests (r=jld) (c82e0bfe61)
- Bug 1263429 - Don't build libevent with sysctl on Linux. r=billm (00f248f61e)
- Bug 1304266 - Remove libevent workaround for MacOS 10.4 bug (r=dvander) a=jcristau (676758a926)
- Bug 1241776 - turn ENABLE_SHARED_ARRAY_BUFFER on for all channels. r=nbp (dc53fff545)
- Bug 1248851 part 1 - Explicitly mark some release() calls result-unused. r=Waldo (b377e3d86e)
- Bug 1246697 - Use simpler semantics for PersistentRooted<Traceable>; r=sfink (7afab5c807)
- bug 1225649 use CreatePlanarYCbCrImage() now that CreateImage() is gone r=dvander (b8a30f3d84)
- Bug 1234092: P1. Remove GStreamer support. r=kentuckyfriedtakahe (bf6a5d8811)
- Bug 1234092: P2. Remove GStreamer check from configure. r=glandium (73b69b41db)
- remove configure options (f9585af0d1)
- Bug 1168309 - Add the define, MOZ_GONK_MEDIACODEC, to dom/media. r=cpearce. (a4481af932)
- Bug 1240616 - mach mochitest-run suggests deprecated commands as an alternative r=cmanchester (17687db974)
- Bug 1249838 - Avoid dependency from the mozconfig loader on mach. r=gps (a88506c027)
- Bug 382721 - Part 0: Add missing includes and namespaces. r=jrmuizel (eecf253c5e)
2023-10-26 14:38:19 +08:00

239 lines
7.3 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* vim: set ts=2 sw=2 et tw=78:
* 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 "TouchManager.h"
#include "mozilla/TouchEvents.h"
#include "mozilla/dom/EventTarget.h"
#include "nsIFrame.h"
#include "nsPresShell.h"
#include "nsView.h"
namespace mozilla {
using EventTarget = ::mozilla::dom::EventTarget;
nsRefPtrHashtable<nsUint32HashKey, dom::Touch>* TouchManager::gCaptureTouchList;
/*static*/ void
TouchManager::InitializeStatics()
{
NS_ASSERTION(!gCaptureTouchList, "InitializeStatics called multiple times!");
gCaptureTouchList = new nsRefPtrHashtable<nsUint32HashKey, dom::Touch>;
}
/*static*/ void
TouchManager::ReleaseStatics()
{
NS_ASSERTION(gCaptureTouchList, "ReleaseStatics called without Initialize!");
delete gCaptureTouchList;
gCaptureTouchList = nullptr;
}
void
TouchManager::Init(PresShell* aPresShell, nsIDocument* aDocument)
{
mPresShell = aPresShell;
mDocument = aDocument;
}
void
TouchManager::Destroy()
{
EvictTouches();
mDocument = nullptr;
mPresShell = nullptr;
}
static void
EvictTouchPoint(RefPtr<dom::Touch>& aTouch,
nsIDocument* aLimitToDocument = nullptr)
{
nsCOMPtr<nsINode> node(do_QueryInterface(aTouch->mTarget));
if (node) {
nsIDocument* doc = node->GetCurrentDoc();
if (doc && (!aLimitToDocument || aLimitToDocument == doc)) {
nsIPresShell* presShell = doc->GetShell();
if (presShell) {
nsIFrame* frame = presShell->GetRootFrame();
if (frame) {
nsPoint pt(aTouch->mRefPoint.x, aTouch->mRefPoint.y);
nsCOMPtr<nsIWidget> widget = frame->GetView()->GetNearestWidget(&pt);
if (widget) {
WidgetTouchEvent event(true, eTouchEnd, widget);
event.widget = widget;
event.time = PR_IntervalNow();
event.touches.AppendElement(aTouch);
nsEventStatus status;
widget->DispatchEvent(&event, status);
return;
}
}
}
}
}
if (!node || !aLimitToDocument || node->OwnerDoc() == aLimitToDocument) {
// We couldn't dispatch touchend. Remove the touch from gCaptureTouchList explicitly.
TouchManager::gCaptureTouchList->Remove(aTouch->Identifier());
}
}
static void
AppendToTouchList(WidgetTouchEvent::TouchArray* aTouchList)
{
for (auto iter = TouchManager::gCaptureTouchList->Iter();
!iter.Done();
iter.Next()) {
RefPtr<dom::Touch>& touch = iter.Data();
touch->mChanged = false;
aTouchList->AppendElement(touch);
}
}
void
TouchManager::EvictTouches()
{
WidgetTouchEvent::AutoTouchArray touches;
AppendToTouchList(&touches);
for (uint32_t i = 0; i < touches.Length(); ++i) {
EvictTouchPoint(touches[i], mDocument);
}
}
bool
TouchManager::PreHandleEvent(WidgetEvent* aEvent,
nsEventStatus* aStatus,
bool& aTouchIsNew,
bool& aIsHandlingUserInput,
nsCOMPtr<nsIContent>& aCurrentEventContent)
{
switch (aEvent->mMessage) {
case eTouchStart: {
aIsHandlingUserInput = true;
WidgetTouchEvent* touchEvent = aEvent->AsTouchEvent();
// if there is only one touch in this touchstart event, assume that it is
// the start of a new touch session and evict any old touches in the
// queue
if (touchEvent->touches.Length() == 1) {
WidgetTouchEvent::AutoTouchArray touches;
AppendToTouchList(&touches);
for (uint32_t i = 0; i < touches.Length(); ++i) {
EvictTouchPoint(touches[i]);
}
}
// Add any new touches to the queue
for (uint32_t i = 0; i < touchEvent->touches.Length(); ++i) {
dom::Touch* touch = touchEvent->touches[i];
int32_t id = touch->Identifier();
if (!gCaptureTouchList->Get(id, nullptr)) {
// If it is not already in the queue, it is a new touch
touch->mChanged = true;
}
touch->mMessage = aEvent->mMessage;
gCaptureTouchList->Put(id, touch);
}
break;
}
case eTouchMove: {
// Check for touches that changed. Mark them add to queue
WidgetTouchEvent* touchEvent = aEvent->AsTouchEvent();
WidgetTouchEvent::TouchArray& touches = touchEvent->touches;
bool haveChanged = false;
for (int32_t i = touches.Length(); i; ) {
--i;
dom::Touch* touch = touches[i];
if (!touch) {
continue;
}
int32_t id = touch->Identifier();
touch->mMessage = aEvent->mMessage;
RefPtr<dom::Touch> oldTouch = gCaptureTouchList->GetWeak(id);
if (!oldTouch) {
touches.RemoveElementAt(i);
continue;
}
if (!touch->Equals(oldTouch)) {
touch->mChanged = true;
haveChanged = true;
}
nsCOMPtr<dom::EventTarget> targetPtr = oldTouch->mTarget;
if (!targetPtr) {
touches.RemoveElementAt(i);
continue;
}
touch->SetTarget(targetPtr);
gCaptureTouchList->Put(id, touch);
// if we're moving from touchstart to touchmove for this touch
// we allow preventDefault to prevent mouse events
if (oldTouch->mMessage != touch->mMessage) {
aTouchIsNew = true;
}
}
// is nothing has changed, we should just return
if (!haveChanged) {
if (aTouchIsNew) {
// however, if this is the first touchmove after a touchstart,
// it is special in that preventDefault is allowed on it, so
// we must dispatch it to content even if nothing changed. we
// arbitrarily pick the first touch point to be the "changed"
// touch because firing an event with no changed events doesn't
// work.
for (uint32_t i = 0; i < touchEvent->touches.Length(); ++i) {
if (touchEvent->touches[i]) {
touchEvent->touches[i]->mChanged = true;
break;
}
}
} else {
return false;
}
}
break;
}
case eTouchEnd:
aIsHandlingUserInput = true;
// Fall through to touchcancel code
MOZ_FALLTHROUGH;
case eTouchCancel: {
// Remove the changed touches
// need to make sure we only remove touches that are ending here
WidgetTouchEvent* touchEvent = aEvent->AsTouchEvent();
WidgetTouchEvent::TouchArray& touches = touchEvent->touches;
for (uint32_t i = 0; i < touches.Length(); ++i) {
dom::Touch* touch = touches[i];
if (!touch) {
continue;
}
touch->mMessage = aEvent->mMessage;
touch->mChanged = true;
int32_t id = touch->Identifier();
RefPtr<dom::Touch> oldTouch = gCaptureTouchList->GetWeak(id);
if (!oldTouch) {
continue;
}
nsCOMPtr<EventTarget> targetPtr = oldTouch->mTarget;
aCurrentEventContent = do_QueryInterface(targetPtr);
touch->SetTarget(targetPtr);
gCaptureTouchList->Remove(id);
}
// add any touches left in the touch list, but ensure changed=false
AppendToTouchList(&touches);
break;
}
default:
break;
}
return true;
}
} // namespace mozilla