Bug 1631405 - Move nsISecureBrowserUI to be owned by the canonical browsing context instead of docshell. r=nika,ckerschb,Gijs,webcompat-reviewers,twisniewski
This removes all docshell nsISecureBrowserUI and mixed content properties, and moves them into CanonicalBrowsingContext/WindowGlobalParent. It makes the mixed content blocker just compute the state for the current load, and then send the results to the parent process, where we update the security state accordingly. I think we could in the future remove onSecurityChange entirely, and instead just fire an event to the <browser> element notifying it of changes to the queryable securityUI. Unfortunately we have a lot of existing code that depends on specific ordering between onSecurityChange and onLocationChange, so I had to hook into the RemoteWebProgress implementation in BrowserParent to mimic the same timings. Differential Revision: https://phabricator.services.mozilla.com/D75447
This commit is contained in:
@@ -501,7 +501,8 @@ already_AddRefed<nsDocShell> nsDocShell::Create(
|
||||
// various methods via which nsDocLoader can be notified. Note that this
|
||||
// holds an nsWeakPtr to |ds|, so it's ok.
|
||||
rv = ds->AddProgressListener(ds, nsIWebProgress::NOTIFY_STATE_DOCUMENT |
|
||||
nsIWebProgress::NOTIFY_STATE_NETWORK);
|
||||
nsIWebProgress::NOTIFY_STATE_NETWORK |
|
||||
nsIWebProgress::NOTIFY_LOCATION);
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -1400,40 +1401,6 @@ void nsDocShell::GetParentCharset(const Encoding*& aCharset,
|
||||
NS_IF_ADDREF(*aPrincipal = mParentCharsetPrincipal);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetHasMixedActiveContentLoaded(bool* aHasMixedActiveContentLoaded) {
|
||||
RefPtr<Document> doc(GetDocument());
|
||||
*aHasMixedActiveContentLoaded = doc && doc->GetHasMixedActiveContentLoaded();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetHasMixedActiveContentBlocked(
|
||||
bool* aHasMixedActiveContentBlocked) {
|
||||
RefPtr<Document> doc(GetDocument());
|
||||
*aHasMixedActiveContentBlocked =
|
||||
doc && doc->GetHasMixedActiveContentBlocked();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetHasMixedDisplayContentLoaded(
|
||||
bool* aHasMixedDisplayContentLoaded) {
|
||||
RefPtr<Document> doc(GetDocument());
|
||||
*aHasMixedDisplayContentLoaded =
|
||||
doc && doc->GetHasMixedDisplayContentLoaded();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetHasMixedDisplayContentBlocked(
|
||||
bool* aHasMixedDisplayContentBlocked) {
|
||||
RefPtr<Document> doc(GetDocument());
|
||||
*aHasMixedDisplayContentBlocked =
|
||||
doc && doc->GetHasMixedDisplayContentBlocked();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetHasTrackingContentBlocked(Promise** aPromise) {
|
||||
MOZ_ASSERT(aPromise);
|
||||
@@ -1974,20 +1941,6 @@ nsDocShell::TabToTreeOwner(bool aForward, bool aForDocumentNavigation,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetSecurityUI(nsISecureBrowserUI** aSecurityUI) {
|
||||
NS_IF_ADDREF(*aSecurityUI = mSecurityUI);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::SetSecurityUI(nsISecureBrowserUI* aSecurityUI) {
|
||||
MOZ_ASSERT(!mIsBeingDestroyed);
|
||||
|
||||
mSecurityUI = aSecurityUI;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetLoadURIDelegate(nsILoadURIDelegate** aLoadURIDelegate) {
|
||||
nsCOMPtr<nsILoadURIDelegate> delegate = GetLoadURIDelegate();
|
||||
@@ -4348,9 +4301,6 @@ nsDocShell::Destroy() {
|
||||
|
||||
mChromeEventHandler = nullptr;
|
||||
|
||||
// required to break ref cycle
|
||||
mSecurityUI = nullptr;
|
||||
|
||||
// Cancel any timers that were set for this docshell; this is needed
|
||||
// to break the cycle between us and the timers.
|
||||
CancelRefreshURITimers();
|
||||
@@ -5623,7 +5573,17 @@ nsDocShell::OnStateChange(nsIWebProgress* aProgress, nsIRequest* aRequest,
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::OnLocationChange(nsIWebProgress* aProgress, nsIRequest* aRequest,
|
||||
nsIURI* aURI, uint32_t aFlags) {
|
||||
MOZ_ASSERT_UNREACHABLE("notification excluded in AddProgressListener(...)");
|
||||
if (XRE_IsParentProcess()) {
|
||||
// Since we've now changed Documents, notify the BrowsingContext that we've
|
||||
// changed. Ideally we'd just let the BrowsingContext do this when it
|
||||
// changes the current window global, but that happens before this and we
|
||||
// have a lot of tests that depend on the specific ordering of messages.
|
||||
if (!(aFlags & nsIWebProgressListener::LOCATION_CHANGE_SAME_DOCUMENT)) {
|
||||
GetBrowsingContext()
|
||||
->Canonical()
|
||||
->UpdateSecurityStateForLocationOrMixedContentChange();
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user