There are two issues in our current setup 1) Input events which are occurring in the same tab are going to be lost because sync XHR. We have event handling suppression for synx XHR, so input events are going to be discarded. 2) Input events that are happening in another tab (same process as the synx XHR tab) are not going to be delayed. This is not correct since sync XHR should block the Javascript execution. This patches fixes the above cases for when both TaskController and e10s are enabled by suspending the InputTaskManager during sync XHR, which delays the input event handling and keeps the events around. Differential Revision: https://phabricator.services.mozilla.com/D90780
60 lines
2.0 KiB
C++
60 lines
2.0 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "txXMLParser.h"
|
|
#include "txURIUtils.h"
|
|
#include "txXPathTreeWalker.h"
|
|
|
|
#include "mozilla/dom/Document.h"
|
|
#include "nsSyncLoadService.h"
|
|
#include "nsNetUtil.h"
|
|
#include "nsIURI.h"
|
|
|
|
using namespace mozilla::dom;
|
|
|
|
nsresult txParseDocumentFromURI(const nsAString& aHref,
|
|
const txXPathNode& aLoader, nsAString& aErrMsg,
|
|
txXPathNode** aResult) {
|
|
NS_ENSURE_ARG_POINTER(aResult);
|
|
*aResult = nullptr;
|
|
nsCOMPtr<nsIURI> documentURI;
|
|
nsresult rv = NS_NewURI(getter_AddRefs(documentURI), aHref);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
Document* loaderDocument = txXPathNativeNode::getDocument(aLoader);
|
|
|
|
nsCOMPtr<nsILoadGroup> loadGroup = loaderDocument->GetDocumentLoadGroup();
|
|
|
|
// For the system principal loaderUri will be null here, which is good
|
|
// since that means that chrome documents can load any uri.
|
|
|
|
// Raw pointer, we want the resulting txXPathNode to hold a reference to
|
|
// the document.
|
|
Document* theDocument = nullptr;
|
|
nsAutoSyncOperation sync(loaderDocument,
|
|
SyncOperationBehavior::eSuspendInput);
|
|
rv = nsSyncLoadService::LoadDocument(
|
|
documentURI, nsIContentPolicy::TYPE_INTERNAL_XMLHTTPREQUEST,
|
|
loaderDocument->NodePrincipal(),
|
|
nsILoadInfo::SEC_REQUIRE_CORS_INHERITS_SEC_CONTEXT, loadGroup,
|
|
loaderDocument->CookieJarSettings(), true,
|
|
loaderDocument->GetReferrerPolicy(), &theDocument);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
aErrMsg.AppendLiteral("Document load of ");
|
|
aErrMsg.Append(aHref);
|
|
aErrMsg.AppendLiteral(" failed.");
|
|
return NS_FAILED(rv) ? rv : NS_ERROR_FAILURE;
|
|
}
|
|
|
|
*aResult = txXPathNativeNode::createXPathNode(theDocument);
|
|
if (!*aResult) {
|
|
NS_RELEASE(theDocument);
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|