fune/toolkit/components/windowwatcher/nsWindowWatcher.h
Nika Layzell d564908035 Bug 1810619 - Part 1: Be more precise in named lookup code, r=smaug,geckoview-reviewers,m_kato
This makes various changes to the named lookup/navigation code to make
them more precise, and avoid issues which could happen if a window is
closed while script is still executing.

This also should improve handling for inactive windows in some cases, by
more frequently working off of the WindowContext tree rather than the
BrowsingContext tree.

As part of these changes, some behaviour was changed around e.g. the
file URI exception to avoid the deprecated nsIPrincipal::GetURI method.
I don't believe the behaviour should have changed in a meaningful way.

Differential Revision: https://phabricator.services.mozilla.com/D171755
2023-03-15 21:57:03 +00:00

111 lines
3.9 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef __nsWindowWatcher_h__
#define __nsWindowWatcher_h__
// {a21bfa01-f349-4394-a84c-8de5cf0737d0}
#define NS_WINDOWWATCHER_CID \
{ \
0xa21bfa01, 0xf349, 0x4394, { \
0xa8, 0x4c, 0x8d, 0xe5, 0xcf, 0x7, 0x37, 0xd0 \
} \
}
#include "nsCOMPtr.h"
#include "Units.h"
#include "mozilla/Mutex.h"
#include "mozilla/Maybe.h"
#include "nsIWindowCreator.h" // for stupid compilers
#include "nsIWindowWatcher.h"
#include "nsIOpenWindowInfo.h"
#include "nsIPromptFactory.h"
#include "nsIRemoteTab.h"
#include "nsPIWindowWatcher.h"
#include "nsTArray.h"
#include "mozilla/dom/WindowFeatures.h" // mozilla::dom::WindowFeatures
class nsIURI;
class nsIDocShellTreeItem;
class nsIDocShellTreeOwner;
class nsPIDOMWindowOuter;
class nsWatcherWindowEnumerator;
class nsPromptService;
struct nsWatcherWindowEntry;
class nsWindowWatcher : public nsIWindowWatcher,
public nsPIWindowWatcher,
public nsIPromptFactory {
friend class nsWatcherWindowEnumerator;
public:
nsWindowWatcher();
nsresult Init();
NS_DECL_ISUPPORTS
NS_DECL_NSIWINDOWWATCHER
NS_DECL_NSPIWINDOWWATCHER
NS_DECL_NSIPROMPTFACTORY
static int32_t GetWindowOpenLocation(nsPIDOMWindowOuter* aParent,
uint32_t aChromeFlags,
bool aCalledFromJS, bool aIsForPrinting);
static bool HaveSpecifiedSize(const mozilla::dom::WindowFeatures& features);
protected:
virtual ~nsWindowWatcher();
friend class nsPromptService;
bool AddEnumerator(nsWatcherWindowEnumerator* aEnumerator);
bool RemoveEnumerator(nsWatcherWindowEnumerator* aEnumerator);
nsWatcherWindowEntry* FindWindowEntry(mozIDOMWindowProxy* aWindow);
nsresult RemoveWindow(nsWatcherWindowEntry* aInfo);
// Just like OpenWindowJS, but knows whether it got called via OpenWindowJS
// (which means called from script) or called via OpenWindow.
nsresult OpenWindowInternal(mozIDOMWindowProxy* aParent,
const nsACString& aUrl, const nsACString& aName,
const nsACString& aFeatures, bool aCalledFromJS,
bool aDialog, bool aNavigate, nsIArray* aArgv,
bool aIsPopupSpam, bool aForceNoOpener,
bool aForceNoReferrer, PrintKind,
nsDocShellLoadState* aLoadState,
mozilla::dom::BrowsingContext** aResult);
static nsresult URIfromURL(const nsACString& aURL,
mozIDOMWindowProxy* aParent, nsIURI** aURI);
static bool ShouldOpenPopup(const mozilla::dom::WindowFeatures& aFeatures);
static uint32_t CalculateChromeFlagsForContent(
const mozilla::dom::WindowFeatures& aFeatures, bool* aIsPopupRequested);
static uint32_t CalculateChromeFlagsForSystem(
const mozilla::dom::WindowFeatures& aFeatures, bool aDialog,
bool aChromeURL);
private:
MOZ_CAN_RUN_SCRIPT_BOUNDARY nsresult CreateChromeWindow(
nsIWebBrowserChrome* aParentChrome, uint32_t aChromeFlags,
nsIOpenWindowInfo* aOpenWindowInfo, nsIWebBrowserChrome** aResult);
static uint32_t CalculateChromeFlagsHelper(
uint32_t aInitialFlags, const mozilla::dom::WindowFeatures& aFeatures,
bool* presenceFlag = nullptr);
protected:
nsTArray<nsWatcherWindowEnumerator*> mEnumeratorList;
nsWatcherWindowEntry* mOldestWindow;
mozilla::Mutex mListLock MOZ_UNANNOTATED;
nsCOMPtr<nsIWindowCreator> mWindowCreator;
};
#endif