From 35a4358b3d496b3412c0b58c48a99177d67f27b4 Mon Sep 17 00:00:00 2001 From: Cameron Kaiser Date: Sat, 25 Jan 2020 18:01:18 -0800 Subject: [PATCH] #587: M1513855 M1596668 M1602944 M1599420 M1595399 --- dom/indexedDB/ActorsChild.cpp | 6 ++++-- parser/html/javasrc/TreeBuilder.java | 4 ---- parser/html/nsHtml5TreeBuilder.cpp | 4 ++-- toolkit/components/startup/nsAppStartup.cpp | 5 +++++ widget/nsBaseDragService.cpp | 8 ++++++-- widget/nsBaseDragService.h | 3 +++ xpcom/io/nsLocalFileUnix.cpp | 3 +++ 7 files changed, 23 insertions(+), 10 deletions(-) diff --git a/dom/indexedDB/ActorsChild.cpp b/dom/indexedDB/ActorsChild.cpp index e70c10d0a..343893783 100644 --- a/dom/indexedDB/ActorsChild.cpp +++ b/dom/indexedDB/ActorsChild.cpp @@ -2796,6 +2796,10 @@ BackgroundCursorChild::HandleResponse( auto& responses = const_cast&>(aResponses); + // If a new cursor is created, we need to keep a reference to it until the + // ResultHelper creates a DOM Binding. + RefPtr newCursor; + for (ObjectStoreCursorResponse& response : responses) { StructuredCloneReadInfo cloneReadInfo(Move(response.cloneInfo())); cloneReadInfo.mDatabase = mTransaction->Database(); @@ -2804,8 +2808,6 @@ BackgroundCursorChild::HandleResponse( response.cloneInfo(), cloneReadInfo.mFiles); - RefPtr newCursor; - if (mCursor) { if (mCursor->IsContinueCalled()) { mCursor->Reset(Move(response.key()), Move(cloneReadInfo)); diff --git a/parser/html/javasrc/TreeBuilder.java b/parser/html/javasrc/TreeBuilder.java index cb1f06e84..077dc6f06 100644 --- a/parser/html/javasrc/TreeBuilder.java +++ b/parser/html/javasrc/TreeBuilder.java @@ -710,8 +710,6 @@ public abstract class TreeBuilder implements TokenHandler, contextName); } } - contextName = null; - contextNode = null; } else { mode = INITIAL; // If we are viewing XML source, put a foreign element permanently @@ -1617,8 +1615,6 @@ public abstract class TreeBuilder implements TokenHandler, * @see nu.validator.htmlparser.common.TokenHandler#endTokenization() */ public final void endTokenization() throws SAXException { - formPointer = null; - headPointer = null; deepTreeSurrogateParent = null; templateModeStack = null; if (stack != null) { diff --git a/parser/html/nsHtml5TreeBuilder.cpp b/parser/html/nsHtml5TreeBuilder.cpp index d303db2ff..d3d8d7b00 100644 --- a/parser/html/nsHtml5TreeBuilder.cpp +++ b/parser/html/nsHtml5TreeBuilder.cpp @@ -140,8 +140,6 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self) tokenizer->setState(NS_HTML5TOKENIZER_DATA); } } - contextName = nullptr; - contextNode = nullptr; } else { mode = NS_HTML5TREE_BUILDER_INITIAL; if (tokenizer->isViewingXmlSource()) { @@ -580,6 +578,8 @@ nsHtml5TreeBuilder::endTokenization() { formPointer = nullptr; headPointer = nullptr; + contextName = nullptr; + contextNode = nullptr; deepTreeSurrogateParent = nullptr; templateModeStack = nullptr; if (stack) { diff --git a/toolkit/components/startup/nsAppStartup.cpp b/toolkit/components/startup/nsAppStartup.cpp index dc40aa11e..5e05ef7bd 100644 --- a/toolkit/components/startup/nsAppStartup.cpp +++ b/toolkit/components/startup/nsAppStartup.cpp @@ -283,6 +283,11 @@ nsAppStartup::Run(void) return rv; } + // Make sure that the appropriate quit notifications have been dispatched + // regardless of whether the event loop has spun or not. Note that this call + // is a no-op if Quit has already been called previously. + Quit(eForceQuit); + nsresult retval = NS_OK; if (mRestart) { retval = NS_SUCCESS_RESTART_APP; diff --git a/widget/nsBaseDragService.cpp b/widget/nsBaseDragService.cpp index 6b1a502b7..54dddff12 100644 --- a/widget/nsBaseDragService.cpp +++ b/widget/nsBaseDragService.cpp @@ -58,7 +58,8 @@ nsBaseDragService::nsBaseDragService() mDragAction(DRAGDROP_ACTION_NONE), mDragActionFromChildProcess(DRAGDROP_ACTION_UNINITIALIZED), mTargetSize(0,0), mScreenX(-1), mScreenY(-1), mSuppressLevel(0), - mInputSource(nsIDOMMouseEvent::MOZ_SOURCE_MOUSE) + mInputSource(nsIDOMMouseEvent::MOZ_SOURCE_MOUSE), + mEndingSession(false) { } @@ -379,10 +380,12 @@ nsBaseDragService::TakeChildProcessDragAction() NS_IMETHODIMP nsBaseDragService::EndDragSession(bool aDoneDrag) { - if (!mDoingDrag) { + if (!mDoingDrag || mEndingSession) { return NS_ERROR_FAILURE; } + mEndingSession = true; + if (aDoneDrag && !mSuppressLevel) { FireDragEventAtSource(eDragEnd); } @@ -401,6 +404,7 @@ nsBaseDragService::EndDragSession(bool aDoneDrag) mChildProcesses.Clear(); mDoingDrag = false; + mEndingSession = false; mCanDrop = false; // release the source we've been holding on to. diff --git a/widget/nsBaseDragService.h b/widget/nsBaseDragService.h index d1ff621a0..f9d4f8b40 100644 --- a/widget/nsBaseDragService.h +++ b/widget/nsBaseDragService.h @@ -142,6 +142,9 @@ protected: bool mCanDrop; bool mOnlyChromeDrop; bool mDoingDrag; + + // true if in EndDragSession + bool mEndingSession; // true if mImage should be used to set a drag image bool mHasImage; // true if the user cancelled the drag operation diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp index 473d91903..90bde452e 100644 --- a/xpcom/io/nsLocalFileUnix.cpp +++ b/xpcom/io/nsLocalFileUnix.cpp @@ -1573,6 +1573,9 @@ nsLocalFile::IsExecutable(bool* aResult) // Search for any of the set of executable extensions. static const char* const executableExts[] = { "air", // Adobe AIR installer +#ifdef MOZ_WIDGET_COCOA + "fileloc", // File location files can be used to point to other files. +#endif "jar" // java application bundle }; nsDependentSubstring ext = Substring(path, dotIdx + 1);