author | Edgar Chen <echen@mozilla.com> |
Wed, 05 Aug 2020 01:50:21 +0000 | |
changeset 543563 | ba8f984262e3520669f233393e22dd1210ffc903 |
parent 543562 | df7c9cae79bee9a78c5ef532d9d3986e5abf473e |
child 543564 | 2c4dd17ca2c180c7199916c512b52da07e948586 |
push id | 37676 |
push user | cbrindusan@mozilla.com |
push date | Thu, 06 Aug 2020 21:54:39 +0000 |
treeherder | mozilla-central@95cbd1379138 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | masayuki |
bugs | 1597463 |
milestone | 81.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -46,16 +46,17 @@ #include "gfxContext.h" #include "gfxUserFontSet.h" #include "nsContentList.h" #include "nsPresContext.h" #include "nsIContent.h" #include "mozilla/dom/BrowserBridgeChild.h" #include "mozilla/dom/BrowsingContext.h" +#include "mozilla/dom/CanonicalBrowsingContext.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/PointerEventHandler.h" #include "mozilla/dom/PopupBlocker.h" #include "mozilla/dom/Document.h" #include "mozilla/dom/DocumentInlines.h" #include "mozilla/dom/UserActivation.h" #include "nsAnimationManager.h" #include "nsNameSpaceManager.h" // for Pref-related rule management (bugs 22963,20760,31816) @@ -6546,31 +6547,48 @@ already_AddRefed<nsIContent> PresShell:: fm->GetFocusedElementForWindow(mDocument->GetWindow(), false, nullptr, getter_AddRefs(focusedElement)); return focusedElement.forget(); } return nullptr; } already_AddRefed<PresShell> PresShell::GetParentPresShellForEventHandling() { - NS_ENSURE_TRUE(mPresContext, nullptr); + if (!mPresContext) { + return nullptr; + } // Now, find the parent pres shell and send the event there - nsCOMPtr<nsIDocShellTreeItem> treeItem = mPresContext->GetDocShell(); - if (!treeItem) { - treeItem = mForwardingContainer.get(); + RefPtr<nsDocShell> docShell = mPresContext->GetDocShell(); + if (!docShell) { + docShell = mForwardingContainer.get(); } // Might have gone away, or never been around to start with - NS_ENSURE_TRUE(treeItem, nullptr); - - nsCOMPtr<nsIDocShellTreeItem> parentTreeItem; - treeItem->GetInProcessParent(getter_AddRefs(parentTreeItem)); - nsCOMPtr<nsIDocShell> parentDocShell = do_QueryInterface(parentTreeItem); - NS_ENSURE_TRUE(parentDocShell && treeItem != parentTreeItem, nullptr); + if (!docShell) { + return nullptr; + } + + BrowsingContext* bc = docShell->GetBrowsingContext(); + if (!bc) { + return nullptr; + } + + RefPtr<BrowsingContext> parentBC; + if (XRE_IsParentProcess()) { + parentBC = bc->Canonical()->GetParentCrossChromeBoundary(); + } else { + parentBC = bc->GetParent(); + } + + RefPtr<nsIDocShell> parentDocShell = + parentBC ? parentBC->GetDocShell() : nullptr; + if (!parentDocShell) { + return nullptr; + } RefPtr<PresShell> parentPresShell = parentDocShell->GetPresShell(); return parentPresShell.forget(); } nsresult PresShell::EventHandler::RetargetEventToParent( WidgetGUIEvent* aGUIEvent, nsEventStatus* aEventStatus) { // Send this events straight up to the parent pres shell.