mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-18 07:45:30 +00:00
Bug 1591433 - Support getting an nsIPrompt from DocumentChannelParent, in the same way as HttpChannelParent does. r=mayhemer
Differential Revision: https://phabricator.services.mozilla.com/D50895 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
7c79b20d22
commit
54e27b2efe
@ -24,6 +24,8 @@
|
||||
#include "nsISecureBrowserUI.h"
|
||||
#include "nsRedirectHistoryEntry.h"
|
||||
#include "nsSerializationHelper.h"
|
||||
#include "nsIPrompt.h"
|
||||
#include "nsIWindowWatcher.h"
|
||||
|
||||
using namespace mozilla::dom;
|
||||
|
||||
@ -49,10 +51,12 @@ DocumentChannelParent::DocumentChannelParent(
|
||||
const PBrowserOrId& iframeEmbedding, nsILoadContext* aLoadContext,
|
||||
PBOverrideStatus aOverrideStatus)
|
||||
: mLoadContext(aLoadContext), mPBOverride(aOverrideStatus) {
|
||||
RefPtr<dom::BrowserParent> parent;
|
||||
if (iframeEmbedding.type() == PBrowserOrId::TPBrowserParent) {
|
||||
mBrowserParent =
|
||||
parent =
|
||||
static_cast<dom::BrowserParent*>(iframeEmbedding.get_PBrowserParent());
|
||||
}
|
||||
mListener = new ParentChannelListener(this, parent);
|
||||
}
|
||||
|
||||
bool DocumentChannelParent::Init(const DocumentChannelCreationArgs& aArgs) {
|
||||
@ -64,8 +68,6 @@ bool DocumentChannelParent::Init(const DocumentChannelCreationArgs& aArgs) {
|
||||
getter_AddRefs(loadInfo));
|
||||
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
||||
|
||||
mListener = new ParentChannelListener(this);
|
||||
|
||||
bool result = nsDocShell::CreateChannelForLoadState(
|
||||
loadState, loadInfo, mListener, nullptr,
|
||||
aArgs.initiatorType().ptrOr(nullptr), aArgs.loadFlags(), aArgs.loadType(),
|
||||
@ -683,16 +685,7 @@ DocumentChannelParent::GetInterface(const nsIID& aIID, void** result) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (aIID.Equals(NS_GET_IID(nsIAuthPromptProvider)) ||
|
||||
aIID.Equals(NS_GET_IID(nsISecureBrowserUI)) ||
|
||||
aIID.Equals(NS_GET_IID(nsIRemoteTab))) {
|
||||
if (mBrowserParent) {
|
||||
return mBrowserParent->QueryInterface(aIID, result);
|
||||
}
|
||||
}
|
||||
|
||||
nsresult rv = QueryInterface(aIID, result);
|
||||
return rv;
|
||||
return QueryInterface(aIID, result);
|
||||
}
|
||||
|
||||
// Rather than forwarding all these nsIParentChannel functions to the child, we
|
||||
|
@ -187,8 +187,6 @@ class DocumentChannelParent : public nsIInterfaceRequestor,
|
||||
// value we need here.
|
||||
nsCOMPtr<nsIURI> mChannelCreationURI;
|
||||
|
||||
RefPtr<mozilla::dom::BrowserParent> mBrowserParent;
|
||||
|
||||
nsTArray<DocumentChannelRedirect> mRedirects;
|
||||
|
||||
// Corresponding redirect channel registrar Id for the final channel that
|
||||
|
@ -299,14 +299,6 @@ NS_INTERFACE_MAP_END
|
||||
|
||||
NS_IMETHODIMP
|
||||
HttpChannelParent::GetInterface(const nsIID& aIID, void** result) {
|
||||
if (aIID.Equals(NS_GET_IID(nsIAuthPromptProvider)) ||
|
||||
aIID.Equals(NS_GET_IID(nsISecureBrowserUI)) ||
|
||||
aIID.Equals(NS_GET_IID(nsIRemoteTab))) {
|
||||
if (mBrowserParent) {
|
||||
return mBrowserParent->QueryInterface(aIID, result);
|
||||
}
|
||||
}
|
||||
|
||||
// Only support nsIAuthPromptProvider in Content process
|
||||
if (XRE_IsParentProcess() && aIID.Equals(NS_GET_IID(nsIAuthPromptProvider))) {
|
||||
*result = nullptr;
|
||||
@ -320,31 +312,6 @@ HttpChannelParent::GetInterface(const nsIID& aIID, void** result) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (mBrowserParent && aIID.Equals(NS_GET_IID(nsIPrompt))) {
|
||||
nsCOMPtr<Element> frameElement = mBrowserParent->GetOwnerElement();
|
||||
if (frameElement) {
|
||||
nsCOMPtr<nsPIDOMWindowOuter> win = frameElement->OwnerDoc()->GetWindow();
|
||||
NS_ENSURE_TRUE(win, NS_ERROR_UNEXPECTED);
|
||||
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIWindowWatcher> wwatch =
|
||||
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
|
||||
|
||||
if (NS_WARN_IF(!NS_SUCCEEDED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIPrompt> prompt;
|
||||
rv = wwatch->GetNewPrompter(win, getter_AddRefs(prompt));
|
||||
if (NS_WARN_IF(!NS_SUCCEEDED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
prompt.forget(result);
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return QueryInterface(aIID, result);
|
||||
}
|
||||
|
||||
@ -523,7 +490,7 @@ bool HttpChannelParent::DoAsyncOpen(
|
||||
}
|
||||
|
||||
RefPtr<ParentChannelListener> parentListener =
|
||||
new ParentChannelListener(this);
|
||||
new ParentChannelListener(this, mBrowserParent);
|
||||
|
||||
httpChannel->SetRequestMethod(nsDependentCString(requestMethod.get()));
|
||||
|
||||
|
@ -29,12 +29,14 @@ using mozilla::dom::ServiceWorkerParentInterceptEnabled;
|
||||
namespace mozilla {
|
||||
namespace net {
|
||||
|
||||
ParentChannelListener::ParentChannelListener(nsIStreamListener* aListener)
|
||||
ParentChannelListener::ParentChannelListener(nsIStreamListener* aListener,
|
||||
dom::BrowserParent* aBrowserParent)
|
||||
: mNextListener(aListener),
|
||||
mSuspendedForDiversion(false),
|
||||
mShouldIntercept(false),
|
||||
mShouldSuspendIntercept(false),
|
||||
mInterceptCanceled(false) {
|
||||
mInterceptCanceled(false),
|
||||
mBrowserParent(aBrowserParent) {
|
||||
LOG(("ParentChannelListener::ParentChannelListener [this=%p, next=%p]", this,
|
||||
aListener));
|
||||
|
||||
@ -121,6 +123,39 @@ ParentChannelListener::GetInterface(const nsIID& aIID, void** result) {
|
||||
return QueryInterface(aIID, result);
|
||||
}
|
||||
|
||||
if (aIID.Equals(NS_GET_IID(nsIAuthPromptProvider)) ||
|
||||
aIID.Equals(NS_GET_IID(nsISecureBrowserUI)) ||
|
||||
aIID.Equals(NS_GET_IID(nsIRemoteTab))) {
|
||||
if (mBrowserParent) {
|
||||
return mBrowserParent->QueryInterface(aIID, result);
|
||||
}
|
||||
}
|
||||
|
||||
if (mBrowserParent && aIID.Equals(NS_GET_IID(nsIPrompt))) {
|
||||
nsCOMPtr<Element> frameElement = mBrowserParent->GetOwnerElement();
|
||||
if (frameElement) {
|
||||
nsCOMPtr<nsPIDOMWindowOuter> win = frameElement->OwnerDoc()->GetWindow();
|
||||
NS_ENSURE_TRUE(win, NS_ERROR_UNEXPECTED);
|
||||
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIWindowWatcher> wwatch =
|
||||
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
|
||||
|
||||
if (NS_WARN_IF(!NS_SUCCEEDED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIPrompt> prompt;
|
||||
rv = wwatch->GetNewPrompter(win, getter_AddRefs(prompt));
|
||||
if (NS_WARN_IF(!NS_SUCCEEDED(rv))) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
prompt.forget(result);
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIInterfaceRequestor> ir;
|
||||
if (mNextListener && NS_SUCCEEDED(CallQueryInterface(mNextListener.get(),
|
||||
getter_AddRefs(ir)))) {
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "nsIInterfaceRequestor.h"
|
||||
#include "nsINetworkInterceptController.h"
|
||||
#include "nsIStreamListener.h"
|
||||
#include "mozilla/dom/BrowserParent.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace net {
|
||||
@ -38,7 +39,8 @@ class ParentChannelListener final : public nsIInterfaceRequestor,
|
||||
|
||||
NS_DECLARE_STATIC_IID_ACCESSOR(PARENT_CHANNEL_LISTENER)
|
||||
|
||||
explicit ParentChannelListener(nsIStreamListener* aListener);
|
||||
explicit ParentChannelListener(nsIStreamListener* aListener,
|
||||
dom::BrowserParent* aBrowserParent);
|
||||
|
||||
// For channel diversion from child to parent.
|
||||
MOZ_MUST_USE nsresult DivertTo(nsIStreamListener* aListener);
|
||||
@ -83,6 +85,8 @@ class ParentChannelListener final : public nsIInterfaceRequestor,
|
||||
// This will be populated with a real network controller if parent-side
|
||||
// interception is enabled.
|
||||
nsCOMPtr<nsINetworkInterceptController> mInterceptController;
|
||||
|
||||
RefPtr<mozilla::dom::BrowserParent> mBrowserParent;
|
||||
};
|
||||
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(ParentChannelListener, PARENT_CHANNEL_LISTENER)
|
||||
|
Loading…
Reference in New Issue
Block a user