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:
Matt Woodrow 2019-11-05 00:25:57 +00:00
parent 7c79b20d22
commit 54e27b2efe
5 changed files with 49 additions and 52 deletions

View File

@ -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

View File

@ -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

View File

@ -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()));

View File

@ -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)))) {

View File

@ -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)