Bug 1254484 - resolve relative presentation URL. r=smaug.

MozReview-Commit-ID: CF3WNGorwH1
This commit is contained in:
Shih-Chiang Chien 2016-08-03 15:35:36 +08:00
Родитель 51818f44f0
Коммит 2abb975dbb
5 изменённых файлов: 48 добавлений и 8 удалений

Просмотреть файл

@ -12,8 +12,11 @@
#include "mozilla/dom/Promise.h"
#include "mozIThirdPartyUtil.h"
#include "nsCycleCollectionParticipant.h"
#include "nsIDocument.h"
#include "nsIPresentationService.h"
#include "nsIURI.h"
#include "nsIUUIDGenerator.h"
#include "nsNetUtil.h"
#include "nsSandboxFlags.h"
#include "nsServiceManagerUtils.h"
#include "PresentationAvailability.h"
@ -31,6 +34,31 @@ NS_IMPL_RELEASE_INHERITED(PresentationRequest, DOMEventTargetHelper)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(PresentationRequest)
NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
static nsresult
GetAbsoluteURL(const nsAString& aUrl,
nsIURI* aBaseUri,
nsIDocument* aDocument,
nsAString& aAbsoluteUrl)
{
nsCOMPtr<nsIURI> uri;
nsresult rv = NS_NewURI(getter_AddRefs(uri),
aUrl,
aDocument ? aDocument->GetDocumentCharacterSet().get()
: nullptr,
aBaseUri);
if (NS_FAILED(rv)) {
return rv;
}
nsAutoCString spec;
uri->GetSpec(spec);
aAbsoluteUrl = NS_ConvertUTF8toUTF16(spec);
return NS_OK;
}
/* static */ already_AddRefed<PresentationRequest>
PresentationRequest::Constructor(const GlobalObject& aGlobal,
const nsAString& aUrl,
@ -48,7 +76,18 @@ PresentationRequest::Constructor(const GlobalObject& aGlobal,
return nullptr;
}
RefPtr<PresentationRequest> request = new PresentationRequest(window, aUrl);
// Resolve relative URL to absolute URL
nsCOMPtr<nsIURI> baseUri = window->GetDocBaseURI();
nsAutoString absoluteUrl;
nsresult rv = GetAbsoluteURL(aUrl, baseUri, window->GetExtantDoc(), absoluteUrl);
if (NS_WARN_IF(NS_FAILED(rv))) {
aRv.Throw(NS_ERROR_UNEXPECTED);
return nullptr;
}
RefPtr<PresentationRequest> request =
new PresentationRequest(window, absoluteUrl);
return NS_WARN_IF(!request->Init()) ? nullptr : request.forget();
}

Просмотреть файл

@ -108,7 +108,7 @@ function setup() {
function testCreateRequest() {
return new Promise(function(aResolve, aReject) {
info('Sender: --- testCreateRequest ---');
request = new PresentationRequest(receiverUrl);
request = new PresentationRequest("file_presentation_1ua_receiver.html");
request.getAvailability().then((aAvailability) => {
aAvailability.onchange = function() {
aAvailability.onchange = null;
@ -132,6 +132,7 @@ function testStartConnection() {
ok(connection, "Sender: Connection should be available.");
ok(connection.id, "Sender: Connection ID should be set.");
is(connection.state, "connecting", "The initial state should be connecting.");
is(connection.url, receiverUrl, "request URL should be expanded to absolute URL");
connection.onconnect = function() {
connection.onconnect = null;
is(connection.state, "connected", "Connection should be connected.");

Просмотреть файл

@ -22,7 +22,7 @@ var connection;
function testSetup() {
return new Promise(function(aResolve, aReject) {
request = new PresentationRequest("http://example.com");
request = new PresentationRequest("http://example.com/");
request.getAvailability().then(
function(aAvailability) {
@ -184,7 +184,7 @@ function testReconnect() {
gScript.addMessageListener('start-reconnect', function startReconnectHandler(url) {
gScript.removeMessageListener('start-reconnect', startReconnectHandler);
is(url, "http://example.com", "URLs should be the same.")
is(url, "http://example.com/", "URLs should be the same.")
gScript.sendAsyncMessage('trigger-reconnected-acked', url);
});

Просмотреть файл

@ -44,7 +44,7 @@ function testSetup() {
}
}, false);
request = new PresentationRequest("http://example.com");
request = new PresentationRequest("http://example.com/");
request.getAvailability().then(
function(aAvailability) {
@ -301,7 +301,7 @@ function testReconnect() {
info('--- testReconnect ---');
gScript.addMessageListener('start-reconnect', function startReconnectHandler(url) {
gScript.removeMessageListener('start-reconnect', startReconnectHandler);
is(url, "http://example.com", "URLs should be the same.");
is(url, "http://example.com/", "URLs should be the same.");
gScript.sendAsyncMessage('trigger-reconnected-acked', url);
});

Просмотреть файл

@ -20,7 +20,7 @@ var connection;
function testSetup() {
return new Promise(function(aResolve, aReject) {
request = new PresentationRequest("http://example.com");
request = new PresentationRequest("http://example.com/");
request.getAvailability().then(
function(aAvailability) {
@ -178,7 +178,7 @@ function testReconnect() {
gScript.addMessageListener('start-reconnect', function startReconnectHandler(url) {
gScript.removeMessageListener('start-reconnect', startReconnectHandler);
is(url, "http://example.com", "URLs should be the same.")
is(url, "http://example.com/", "URLs should be the same.")
gScript.sendAsyncMessage('trigger-reconnected-acked', url);
});