GlobalTeardownObserver.cpp (2294B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "GlobalTeardownObserver.h" 8 9 #include "mozilla/dom/Document.h" 10 #include "nsGlobalWindowInner.h" 11 12 namespace mozilla { 13 14 GlobalTeardownObserver::GlobalTeardownObserver() = default; 15 GlobalTeardownObserver::GlobalTeardownObserver(nsIGlobalObject* aGlobalObject, 16 bool aHasOrHasHadOwnerWindow) 17 : mHasOrHasHadOwnerWindow(aHasOrHasHadOwnerWindow) { 18 BindToOwner(aGlobalObject); 19 } 20 21 GlobalTeardownObserver::~GlobalTeardownObserver() { 22 if (mParentObject) { 23 mParentObject->RemoveGlobalTeardownObserver(this); 24 } 25 } 26 27 nsGlobalWindowInner* GlobalTeardownObserver::GetOwnerWindow() const { 28 return mHasOrHasHadOwnerWindow 29 ? static_cast<nsGlobalWindowInner*>(mParentObject) 30 : nullptr; 31 } 32 33 void GlobalTeardownObserver::BindToOwner(nsIGlobalObject* aOwner) { 34 MOZ_ASSERT(!mParentObject); 35 36 if (aOwner) { 37 mParentObject = aOwner; 38 aOwner->AddGlobalTeardownObserver(this); 39 const bool isWindow = !!aOwner->GetAsInnerWindow(); 40 MOZ_ASSERT_IF(!isWindow, !mHasOrHasHadOwnerWindow); 41 mHasOrHasHadOwnerWindow = isWindow; 42 } 43 } 44 45 void GlobalTeardownObserver::DisconnectFromOwner() { 46 if (mParentObject) { 47 mParentObject->RemoveGlobalTeardownObserver(this); 48 mParentObject = nullptr; 49 } 50 } 51 52 nsresult GlobalTeardownObserver::CheckCurrentGlobalCorrectness() const { 53 if (!mParentObject) { 54 if (NS_IsMainThread() && !HasOrHasHadOwnerWindow()) { 55 return NS_OK; 56 } 57 return NS_ERROR_FAILURE; 58 } 59 60 // Main-thread. 61 if (mHasOrHasHadOwnerWindow) { 62 auto* ownerWin = static_cast<nsGlobalWindowInner*>(mParentObject); 63 if (!ownerWin->IsCurrentInnerWindow()) { 64 return NS_ERROR_FAILURE; 65 } 66 } 67 68 if (NS_IsMainThread()) { 69 return NS_OK; 70 } 71 72 // Not on main thread, might check if is on the global's owning thread before 73 // calling IsDying(). 74 if (mParentObject->IsDying()) { 75 return NS_ERROR_FAILURE; 76 } 77 78 return NS_OK; 79 } 80 81 }; // namespace mozilla