Bug 1509101. Stop passing around anchor targets as char16_t*; use nsAString instead. r=baku

Differential Revision: https://phabricator.services.mozilla.com/D12579

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Boris Zbarsky 2018-11-21 18:53:39 +00:00
parent e39a94637e
commit c38419de6d
8 changed files with 59 additions and 23 deletions

View File

@ -13071,7 +13071,7 @@ class OnLinkClickEvent : public Runnable
public:
OnLinkClickEvent(nsDocShell* aHandler, nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream,
nsIInputStream* aHeadersDataStream,
@ -13092,7 +13092,7 @@ public:
AutoJSAPI jsapi;
if (mIsTrusted || jsapi.Init(mContent->OwnerDoc()->GetScopeObject())) {
mHandler->OnLinkClickSync(mContent, mURI,
mTargetSpec.get(), mFileName,
mTargetSpec, mFileName,
mPostDataStream,
mHeadersDataStream, mNoOpenerImplied,
nullptr, nullptr, mIsUserTriggered,
@ -13119,7 +13119,7 @@ private:
OnLinkClickEvent::OnLinkClickEvent(nsDocShell* aHandler,
nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream,
nsIInputStream* aHeadersDataStream,
@ -13146,7 +13146,7 @@ OnLinkClickEvent::OnLinkClickEvent(nsDocShell* aHandler,
NS_IMETHODIMP
nsDocShell::OnLinkClick(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream,
nsIInputStream* aHeadersDataStream,
@ -13183,10 +13183,9 @@ nsDocShell::OnLinkClick(nsIContent* aContent,
nsCOMPtr<nsIWebBrowserChrome3> browserChrome3 = do_GetInterface(mTreeOwner);
bool noOpenerImplied = false;
if (browserChrome3) {
nsAutoString oldTarget(aTargetSpec);
rv = browserChrome3->OnBeforeLinkTraversal(oldTarget, aURI,
rv = browserChrome3->OnBeforeLinkTraversal(aTargetSpec, aURI,
aContent, mIsAppTab, target);
if (!oldTarget.Equals(target)) {
if (!aTargetSpec.Equals(target)) {
noOpenerImplied = true;
}
}
@ -13196,7 +13195,7 @@ nsDocShell::OnLinkClick(nsIContent* aContent,
}
nsCOMPtr<nsIRunnable> ev =
new OnLinkClickEvent(this, aContent, aURI, target.get(), aFileName,
new OnLinkClickEvent(this, aContent, aURI, target, aFileName,
aPostDataStream, aHeadersDataStream, noOpenerImplied,
aIsUserTriggered, aIsTrusted, aTriggeringPrincipal);
return DispatchToTabGroup(TaskCategory::UI, ev.forget());
@ -13213,7 +13212,7 @@ IsElementAnchorOrArea(nsIContent* aContent)
NS_IMETHODIMP
nsDocShell::OnLinkClickSync(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream,
nsIInputStream* aHeadersDataStream,
@ -13326,8 +13325,6 @@ nsDocShell::OnLinkClickSync(nsIContent* aContent,
// referer could be null here in some odd cases, but that's ok,
// we'll just load the link w/o sending a referer in those cases.
nsAutoString target(aTargetSpec);
// If this is an anchor element, grab its type property to use as a hint
nsAutoString typeHint;
RefPtr<HTMLAnchorElement> anchor = HTMLAnchorElement::FromNode(aContent);
@ -13366,7 +13363,7 @@ nsDocShell::OnLinkClickSync(nsIContent* aContent,
triggeringPrincipal,
aContent->NodePrincipal(),
flags,
target, // Window target
aTargetSpec, // Window target
NS_LossyConvertUTF16toASCII(typeHint),
aFileName, // Download as file
aPostDataStream, // Post data stream
@ -13388,7 +13385,7 @@ nsDocShell::OnLinkClickSync(nsIContent* aContent,
NS_IMETHODIMP
nsDocShell::OnOverLink(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec)
const nsAString& aTargetSpec)
{
if (aContent->IsEditable()) {
return NS_OK;

View File

@ -196,7 +196,7 @@ public:
// nsILinkHandler
NS_IMETHOD OnLinkClick(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream,
nsIInputStream* aHeadersDataStream,
@ -205,7 +205,7 @@ public:
nsIPrincipal* aTriggeringPrincipal) override;
NS_IMETHOD OnLinkClickSync(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream = 0,
nsIInputStream* aHeadersDataStream = 0,
@ -216,7 +216,7 @@ public:
nsIPrincipal* aTriggeringPrincipal = nullptr) override;
NS_IMETHOD OnOverLink(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec) override;
const nsAString& aTargetSpec) override;
NS_IMETHOD OnLeaveLink() override;
// Don't use NS_DECL_NSILOADCONTEXT because some of nsILoadContext's methods

View File

@ -42,7 +42,7 @@ public:
*/
NS_IMETHOD OnLinkClick(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream,
nsIInputStream* aHeadersDataStream,
@ -71,7 +71,7 @@ public:
*/
NS_IMETHOD OnLinkClickSync(nsIContent* aContent,
nsIURI* aURI,
const char16_t* aTargetSpec,
const nsAString& aTargetSpec,
const nsAString& aFileName,
nsIInputStream* aPostDataStream = 0,
nsIInputStream* aHeadersDataStream = 0,
@ -91,7 +91,7 @@ public:
*/
NS_IMETHOD OnOverLink(nsIContent* aContent,
nsIURI* aURLSpec,
const char16_t* aTargetSpec) = 0;
const nsAString& aTargetSpec) = 0;
/**
* Process the mouse leaving a link.

View File

@ -5543,7 +5543,7 @@ nsContentUtils::TriggerLink(nsIContent *aContent, nsPresContext *aPresContext,
}
if (!aClick) {
handler->OnOverLink(aContent, aLinkURI, aTargetSpec.get());
handler->OnOverLink(aContent, aLinkURI, aTargetSpec);
return;
}
@ -5576,7 +5576,7 @@ nsContentUtils::TriggerLink(nsIContent *aContent, nsPresContext *aPresContext,
}
handler->OnLinkClick(aContent, aLinkURI,
fileName.IsVoid() ? aTargetSpec.get() : EmptyString().get(),
fileName.IsVoid() ? aTargetSpec : EmptyString(),
fileName, nullptr, nullptr, EventStateManager::IsHandlingUserInput(),
aIsTrusted, aContent->NodePrincipal());
}

View File

@ -751,7 +751,7 @@ HTMLFormElement::SubmitSubmission(HTMLFormSubmission* aFormSubmission)
nsAutoString target;
aFormSubmission->GetTarget(target);
rv = linkHandler->OnLinkClickSync(this, actionURI,
target.get(),
target,
VoidString(),
postDataStream,
nullptr, false,

View File

@ -484,7 +484,7 @@ NS_IMETHODIMP nsPluginInstanceOwner::GetURL(const char *aURL,
triggeringPrincipal = NullPrincipal::CreateWithInheritedAttributes(content->NodePrincipal());
}
rv = lh->OnLinkClick(content, uri, unitarget.get(), VoidString(),
rv = lh->OnLinkClick(content, uri, unitarget, VoidString(),
aPostStream, headersDataStream,
/* isUserTriggered */ false,
/* isTrusted */ true, triggeringPrincipal);

View File

@ -0,0 +1,5 @@
<script>
window.parent.postMessage({
"name": window.name,
}, "*");
</script>

View File

@ -0,0 +1,34 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Targeting with embedded null in target</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<iframe name="abc">
</iframe>
<a href="resources/message-parent.html" target="abc">Click me</a>
<script>
var t = async_test();
var target_name = "abc\u0000def";
onmessage = t.step_func_done(function (e) {
assert_equals(e.data.name, target_name,
"Should come from a window with the right name");
assert_equals(e.source, frames[1],
"Should come frome the right window");
});
t.step(function() {
var iframe = document.createElement("iframe");
iframe.setAttribute("name", target_name);
document.body.appendChild(iframe);
var a = document.querySelector("a");
a.target = target_name;
a.click();
});
</script>
</body>
</html>