tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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