Bug 1302623 - Refactor XHR.open() methods to remove use of Optionals and correct auth handling. r=smaug

--HG--
extra : amend_source : b042192a0a0e75deb486beb1e503726c262daba7
This commit is contained in:
Thomas Wisniewski 2016-09-14 14:50:58 -04:00
parent d4b168679c
commit 3ad210d9fd
3 changed files with 39 additions and 57 deletions

View File

@ -1386,22 +1386,8 @@ XMLHttpRequestMainThread::Open(const nsACString& aMethod, const nsACString& aUrl
bool aAsync, const nsAString& aUsername,
const nsAString& aPassword, uint8_t optional_argc)
{
Optional<bool> async;
if (!optional_argc) {
// No optional arguments were passed in. Default async to true.
async.Construct() = true;
} else {
async.Construct() = aAsync;
}
Optional<nsAString> username;
if (optional_argc > 1) {
username = &aUsername;
}
Optional<nsAString> password;
if (optional_argc > 2) {
password = &aPassword;
}
return Open(aMethod, aUrl, async, username, password);
return Open(aMethod, aUrl, optional_argc > 0 ? aAsync : true,
aUsername, aPassword);
}
// This case is hit when the async parameter is outright omitted, which
@ -1410,8 +1396,7 @@ void
XMLHttpRequestMainThread::Open(const nsACString& aMethod, const nsAString& aUrl,
ErrorResult& aRv)
{
aRv = Open(aMethod, NS_ConvertUTF16toUTF8(aUrl), Optional<bool>(true),
Optional<nsAString>(), Optional<nsAString>());
Open(aMethod, aUrl, true, NullString(), NullString(), aRv);
}
// This case is hit when the async parameter is specified, even if the
@ -1425,30 +1410,25 @@ XMLHttpRequestMainThread::Open(const nsACString& aMethod,
const nsAString& aPassword,
ErrorResult& aRv)
{
Optional<nsAString> username;
username = &aUsername;
Optional<nsAString> password;
password = &aPassword;
aRv = Open(aMethod, NS_ConvertUTF16toUTF8(aUrl),
Optional<bool>(aAsync), username, password);
nsresult rv = Open(aMethod, NS_ConvertUTF16toUTF8(aUrl), aAsync, aUsername, aPassword);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
}
}
nsresult
XMLHttpRequestMainThread::Open(const nsACString& aMethod,
const nsACString& aUrl,
const Optional<bool>& aAsync,
const Optional<nsAString>& aUsername,
const Optional<nsAString>& aPassword)
{
bool async = aAsync.WasPassed() ? aAsync.Value() : true;
bool aAsync,
const nsAString& aUsername,
const nsAString& aPassword) {
// Gecko-specific
if (!async && !DontWarnAboutSyncXHR() && GetOwner() &&
if (!aAsync && !DontWarnAboutSyncXHR() && GetOwner() &&
GetOwner()->GetExtantDoc()) {
GetOwner()->GetExtantDoc()->WarnOnceAbout(nsIDocument::eSyncXMLHttpRequest);
}
Telemetry::Accumulate(Telemetry::XMLHTTPREQUEST_ASYNC_OR_SYNC, async ? 0 : 1);
Telemetry::Accumulate(Telemetry::XMLHTTPREQUEST_ASYNC_OR_SYNC, aAsync ? 0 : 1);
// Step 1
nsCOMPtr<nsIDocument> responsibleDocument = GetDocumentIfCurrent();
@ -1488,29 +1468,27 @@ XMLHttpRequestMainThread::Open(const nsACString& aMethod,
return NS_ERROR_DOM_INVALID_STATE_ERR;
}
// Step 7 is already done above.
// Note that the username and password are already passed in as null by Open()
// if the async parameter is omitted, so there's no need check again here.
// Step 7
// This is already handled by the other Open() method, which passes
// username and password in as NullStrings.
// Step 8
if (aAsync.WasPassed()) {
nsAutoCString host;
parsedURL->GetHost(host);
if (!host.IsEmpty()) {
nsAutoCString userpass;
if (aUsername.WasPassed()) {
CopyUTF16toUTF8(aUsername.Value(), userpass);
if (!aUsername.IsVoid()) {
CopyUTF16toUTF8(aUsername, userpass);
}
userpass.AppendLiteral(":");
if (aPassword.WasPassed()) {
AppendUTF16toUTF8(aPassword.Value(), userpass);
if (!aPassword.IsVoid()) {
AppendUTF16toUTF8(aPassword, userpass);
}
parsedURL->SetUserPass(userpass);
}
}
// Step 9
if (!async && HasOrHasHadOwner() && (mTimeoutMilliseconds ||
if (!aAsync && HasOrHasHadOwner() && (mTimeoutMilliseconds ||
mResponseType != XMLHttpRequestResponseType::_empty)) {
if (mTimeoutMilliseconds) {
LogMessage("TimeoutSyncXHRWarning", GetOwner());
@ -1529,7 +1507,7 @@ XMLHttpRequestMainThread::Open(const nsACString& aMethod,
mFlagSend = false;
mRequestMethod.Assign(method);
mRequestURL = parsedURL;
mFlagSynchronous = !async;
mFlagSynchronous = !aAsync;
mAuthorRequestHeaders.Clear();
ResetResponse();

View File

@ -255,9 +255,9 @@ public:
nsresult
Open(const nsACString& aMethod,
const nsACString& aUrl,
const Optional<bool>& aAsync,
const Optional<nsAString>& aUsername,
const Optional<nsAString>& aPassword);
bool aAsync,
const nsAString& aUsername,
const nsAString& aPassword);
virtual void
SetRequestHeader(const nsACString& aName, const nsACString& aValue,

View File

@ -1426,15 +1426,19 @@ OpenRunnable::MainThreadRunInternal()
MOZ_ASSERT(!mProxy->mInOpen);
mProxy->mInOpen = true;
rv = mProxy->mXHR->Open(mMethod, NS_ConvertUTF16toUTF8(mURL),
Optional<bool>(true), mUser, mPassword);
ErrorResult rv2;
mProxy->mXHR->Open(mMethod, mURL, true,
mUser.WasPassed() ? mUser.Value() : NullString(),
mPassword.WasPassed() ? mPassword.Value() : NullString(),
rv2);
MOZ_ASSERT(mProxy->mInOpen);
mProxy->mInOpen = false;
NS_ENSURE_SUCCESS(rv, rv);
if (rv2.Failed()) {
return rv2.StealNSResult();
}
ErrorResult rv2;
mProxy->mXHR->SetResponseType(mResponseType, rv2);
if (rv2.Failed()) {
return rv2.StealNSResult();