mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
5a5b052a7c
- 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)
239 lines
7.3 KiB
C++
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
|