# HG changeset patch # Parent 76a0f1463758b99f42465a2f6d9217352fc561b7 # User Andrea Marchesini diff --git a/dom/broadcastchannel/BroadcastChannel.cpp b/dom/broadcastchannel/BroadcastChannel.cpp --- a/dom/broadcastchannel/BroadcastChannel.cpp +++ b/dom/broadcastchannel/BroadcastChannel.cpp @@ -51,63 +51,78 @@ private: namespace { void GetOrigin(nsIPrincipal* aPrincipal, nsAString& aOrigin, ErrorResult& aRv) { MOZ_ASSERT(aPrincipal); - uint16_t appStatus = aPrincipal->GetAppStatus(); + bool unknownAppId; + aRv = aPrincipal->GetUnknownAppId(&unknownAppId); + if (NS_WARN_IF(aRv.Failed())) { + return; + } - if (appStatus == nsIPrincipal::APP_STATUS_NOT_INSTALLED) { - nsAutoString tmp; - aRv = nsContentUtils::GetUTFOrigin(aPrincipal, tmp); + if (!unknownAppId) { + uint32_t appId; + aRv = aPrincipal->GetAppId(&appId); if (NS_WARN_IF(aRv.Failed())) { return; } - aOrigin = tmp; - if (aOrigin.EqualsASCII("null")) { - nsCOMPtr uri; - aRv = aPrincipal->GetURI(getter_AddRefs(uri)); - if (NS_WARN_IF(aRv.Failed())) { + if (appId != nsIScriptSecurityManager::NO_APP_ID) { + // If we are in "app code", use manifest URL as unique origin since + // multiple apps can share the same origin but not same broadcast + // messages. + nsresult rv; + nsCOMPtr appsService = + do_GetService("@mozilla.org/AppsService;1", &rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + aRv.Throw(rv); return; } - if (NS_WARN_IF(!uri)) { - aRv.Throw(NS_ERROR_FAILURE); - return; - } + appsService->GetManifestURLByLocalId(appId, aOrigin); + return; + } + } - nsAutoCString spec; - aRv = uri->GetSpec(spec); - if (NS_WARN_IF(aRv.Failed())) { - return; - } - - aOrigin = NS_ConvertUTF8toUTF16(spec); - } - + nsAutoString tmp; + aRv = nsContentUtils::GetUTFOrigin(aPrincipal, tmp); + if (NS_WARN_IF(aRv.Failed())) { return; } - uint32_t appId = aPrincipal->GetAppId(); + // 'null' means an unknown origin (it can be chrome code or it can be some + // about: page). - // If we are in "app code", use manifest URL as unique origin since - // multiple apps can share the same origin but not same broadcast messages. - nsresult rv; - nsCOMPtr appsService = - do_GetService("@mozilla.org/AppsService;1", &rv); - if (NS_WARN_IF(NS_FAILED(rv))) { - aRv.Throw(rv); + aOrigin = tmp; + if (!aOrigin.EqualsASCII("null")) { return; } - appsService->GetManifestURLByLocalId(appId, aOrigin); + nsCOMPtr uri; + aRv = aPrincipal->GetURI(getter_AddRefs(uri)); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + if (NS_WARN_IF(!uri)) { + aRv.Throw(NS_ERROR_FAILURE); + return; + } + + nsAutoCString spec; + aRv = uri->GetSpec(spec); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + aOrigin = NS_ConvertUTF8toUTF16(spec); } nsIPrincipal* GetPrincipalFromWorkerPrivate(WorkerPrivate* aWorkerPrivate) { nsIPrincipal* principal = aWorkerPrivate->GetPrincipal(); if (principal) { return principal; diff --git a/dom/broadcastchannel/tests/file_mozbrowser.html b/dom/broadcastchannel/tests/file_mozbrowser.html new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/file_mozbrowser.html @@ -0,0 +1,20 @@ + + + + + MozBrowser iframe + + +
+ + + diff --git a/dom/broadcastchannel/tests/file_mozbrowser2.html b/dom/broadcastchannel/tests/file_mozbrowser2.html new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/file_mozbrowser2.html @@ -0,0 +1,21 @@ + + + + + MozBrowser iframe + + +
+ + + diff --git a/dom/broadcastchannel/tests/iframe_mozbrowser.html b/dom/broadcastchannel/tests/iframe_mozbrowser.html new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/iframe_mozbrowser.html @@ -0,0 +1,15 @@ + + + + + MozBrowser iframe + + + + + diff --git a/dom/broadcastchannel/tests/iframe_mozbrowser2.html b/dom/broadcastchannel/tests/iframe_mozbrowser2.html new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/iframe_mozbrowser2.html @@ -0,0 +1,15 @@ + + + + + MozBrowser iframe + + + + + diff --git a/dom/broadcastchannel/tests/manifest.webapp b/dom/broadcastchannel/tests/manifest.webapp new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/manifest.webapp @@ -0,0 +1,6 @@ +{ + "name": "BroadcastChannel", + "description": "BroadcastChannel app", + "launch_path": "/tests/dom/broadcastchannel/tests/TESTTOKEN", + "icons": { "128": "default_icon" } +} diff --git a/dom/broadcastchannel/tests/mochitest.ini b/dom/broadcastchannel/tests/mochitest.ini --- a/dom/broadcastchannel/tests/mochitest.ini +++ b/dom/broadcastchannel/tests/mochitest.ini @@ -1,17 +1,25 @@ [DEFAULT] support-files = iframe_broadcastchannel.html broadcastchannel_pref_worker.js broadcastchannel_sharedWorker.js broadcastchannel_worker.js broadcastchannel_worker_alive.js broadcastchannel_worker_any.js + file_mozbrowser.html + file_mozbrowser2.html + iframe_mozbrowser.html + iframe_mozbrowser2.html + server.sjs + manifest.webapp [test_broadcastchannel_any.html] [test_broadcastchannel_basic.html] [test_broadcastchannel_close.html] [test_broadcastchannel_self.html] [test_broadcastchannel_pref.html] [test_broadcastchannel_sharedWorker.html] [test_broadcastchannel_worker.html] [test_broadcastchannel_worker_alive.html] +[test_broadcastchannel_mozbrowser.html] +[test_broadcastchannel_mozbrowser2.html] diff --git a/dom/broadcastchannel/tests/server.sjs b/dom/broadcastchannel/tests/server.sjs new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/server.sjs @@ -0,0 +1,56 @@ +var gBasePath = "tests/dom/broadcastchannel/tests/"; + +function handleRequest(request, response) { + var query = getQuery(request); + + var testToken = ''; + if ('testToken' in query) { + testToken = query.testToken; + } + + var template = 'manifest.webapp'; + if ('template' in query) { + template = query.template; + } + var template = gBasePath + template; + response.setHeader("Content-Type", "application/x-web-app-manifest+json", false); + response.write(readTemplate(template).replace(/TESTTOKEN/g, testToken)); +} + +// Copy-pasted incantations. There ought to be a better way to synchronously read +// a file into a string, but I guess we're trying to discourage that. +function readTemplate(path) { + var file = Components.classes["@mozilla.org/file/directory_service;1"]. + getService(Components.interfaces.nsIProperties). + get("CurWorkD", Components.interfaces.nsILocalFile); + var fis = Components.classes['@mozilla.org/network/file-input-stream;1']. + createInstance(Components.interfaces.nsIFileInputStream); + var cis = Components.classes["@mozilla.org/intl/converter-input-stream;1"]. + createInstance(Components.interfaces.nsIConverterInputStream); + var split = path.split("/"); + for(var i = 0; i < split.length; ++i) { + file.append(split[i]); + } + fis.init(file, -1, -1, false); + cis.init(fis, "UTF-8", 0, 0); + + var data = ""; + let str = {}; + let read = 0; + do { + read = cis.readString(0xffffffff, str); // read as much as we can and put it in str.value + data += str.value; + } while (read != 0); + cis.close(); + return data; +} + +function getQuery(request) { + var query = {}; + request.queryString.split('&').forEach(function (val) { + var [name, value] = val.split('='); + query[name] = unescape(value); + }); + return query; +} + diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser.html b/dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser.html new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser.html @@ -0,0 +1,140 @@ + + + + Test for BroadcastChannel - iframe mozbrowser + + + + + +
+ + + + diff --git a/dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser2.html b/dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser2.html new file mode 100644 --- /dev/null +++ b/dom/broadcastchannel/tests/test_broadcastchannel_mozbrowser2.html @@ -0,0 +1,140 @@ + + + + Test for BroadcastChannel - iframe mozbrowser + + + + + +
+ + + +