mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 14:22:01 +00:00
Bug 1223831 - SpecialPowers API to create files in an e10s-compatible way. r=jmaher,baku
This commit is contained in:
parent
826cd3d4e3
commit
79d5d6cd4d
@ -3,6 +3,7 @@ skip-if = buildapp == 'mulet' || buildapp == 'b2g'
|
|||||||
[test_TestsRunningAfterSimpleTestFinish.html]
|
[test_TestsRunningAfterSimpleTestFinish.html]
|
||||||
skip-if = true #depends on fix for bug 1048446
|
skip-if = true #depends on fix for bug 1048446
|
||||||
[test_add_task.html]
|
[test_add_task.html]
|
||||||
|
[test_createFiles.html]
|
||||||
[test_sanity.html]
|
[test_sanity.html]
|
||||||
[test_sanityException.html]
|
[test_sanityException.html]
|
||||||
[test_sanityException2.html]
|
[test_sanityException2.html]
|
||||||
|
70
testing/mochitest/tests/Harness_sanity/test_createFiles.html
Normal file
70
testing/mochitest/tests/Harness_sanity/test_createFiles.html
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Test for SpecialPowers.createFiles</title>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="content" class="testbody">
|
||||||
|
<script type="text/javascript">
|
||||||
|
// Creating one file, followed by failing to create a file.
|
||||||
|
function test1() {
|
||||||
|
let fdata = "this is same data for a file";
|
||||||
|
SpecialPowers.createFiles([{name: "test1.txt", data:fdata}],
|
||||||
|
function (files) {
|
||||||
|
is(files.length, 1, "Created 1 file");
|
||||||
|
let f = files[0];
|
||||||
|
is("[object File]", f.toString(), "first thing in array is a file");
|
||||||
|
is(f.size, fdata.length, "test1 size of first file should be length of its data");
|
||||||
|
is("test1.txt", f.name, "test1 test file should have the right name");
|
||||||
|
test2();
|
||||||
|
},
|
||||||
|
function (msg) { ok(false, "Should be able to create a file without an error"); test2(); }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Failing to create a file, followed by creating a file.
|
||||||
|
function test2() {
|
||||||
|
function test3Check(passed) {
|
||||||
|
ok(passed, "Should trigger the error handler for a bad file name.");
|
||||||
|
test3();
|
||||||
|
};
|
||||||
|
|
||||||
|
SpecialPowers.createFiles([{name: "/\/\/\/\/\/\/\/\/\/\/\invalidname",}],
|
||||||
|
function () { test3Check(false); },
|
||||||
|
function (msg) { test3Check(true); }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating two files at the same time.
|
||||||
|
function test3() {
|
||||||
|
let f1data = "hello";
|
||||||
|
SpecialPowers.createFiles([{name: "test3_file.txt", data:f1data}, {name: "emptyfile.txt"}],
|
||||||
|
function (files) {
|
||||||
|
is(files.length, 2, "Expected two files to be created");
|
||||||
|
let f1 = files[0];
|
||||||
|
let f2 = files[1];
|
||||||
|
is("[object File]", f1.toString(), "first thing in array is a file");
|
||||||
|
is("[object File]", f2.toString(), "second thing in array is a file");
|
||||||
|
is("test3_file.txt", f1.name, "first test3 test file should have the right name");
|
||||||
|
is("emptyfile.txt", f2.name, "second test3 test file should have the right name");
|
||||||
|
is(f1.size, f1data.length, "size of first file should be length of its data");
|
||||||
|
is(f2.size, 0, "size of second file should be 0");
|
||||||
|
SimpleTest.finish();
|
||||||
|
},
|
||||||
|
function (msg) {
|
||||||
|
ok(false, "Failed to create files: " + msg);
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
test1();
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1025,6 +1025,8 @@ SimpleTest.finish = function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var afterCleanup = function() {
|
var afterCleanup = function() {
|
||||||
|
SpecialPowers.removeFiles();
|
||||||
|
|
||||||
if (SpecialPowers.DOMWindowUtils.isTestControllingRefreshes) {
|
if (SpecialPowers.DOMWindowUtils.isTestControllingRefreshes) {
|
||||||
SimpleTest.ok(false, "test left refresh driver under test control");
|
SimpleTest.ok(false, "test left refresh driver under test control");
|
||||||
SpecialPowers.DOMWindowUtils.restoreNormalRefresh();
|
SpecialPowers.DOMWindowUtils.restoreNormalRefresh();
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||||
|
Components.utils.importGlobalProperties(['File']);
|
||||||
|
|
||||||
if (typeof(Cc) == "undefined") {
|
if (typeof(Cc) == "undefined") {
|
||||||
const Cc = Components.classes;
|
const Cc = Components.classes;
|
||||||
@ -81,6 +82,8 @@ SpecialPowersObserver.prototype = new SpecialPowersObserverAPI();
|
|||||||
this._messageManager.addMessageListener("SPPingService", this);
|
this._messageManager.addMessageListener("SPPingService", this);
|
||||||
this._messageManager.addMessageListener("SpecialPowers.Quit", this);
|
this._messageManager.addMessageListener("SpecialPowers.Quit", this);
|
||||||
this._messageManager.addMessageListener("SpecialPowers.Focus", this);
|
this._messageManager.addMessageListener("SpecialPowers.Focus", this);
|
||||||
|
this._messageManager.addMessageListener("SpecialPowers.CreateFiles", this);
|
||||||
|
this._messageManager.addMessageListener("SpecialPowers.RemoveFiles", this);
|
||||||
this._messageManager.addMessageListener("SPPermissionManager", this);
|
this._messageManager.addMessageListener("SPPermissionManager", this);
|
||||||
this._messageManager.addMessageListener("SPWebAppService", this);
|
this._messageManager.addMessageListener("SPWebAppService", this);
|
||||||
this._messageManager.addMessageListener("SPObserverService", this);
|
this._messageManager.addMessageListener("SPObserverService", this);
|
||||||
@ -98,6 +101,7 @@ SpecialPowersObserver.prototype = new SpecialPowersObserverAPI();
|
|||||||
this._messageManager.loadFrameScript(CHILD_SCRIPT_API, true);
|
this._messageManager.loadFrameScript(CHILD_SCRIPT_API, true);
|
||||||
this._messageManager.loadFrameScript(CHILD_SCRIPT, true);
|
this._messageManager.loadFrameScript(CHILD_SCRIPT, true);
|
||||||
this._isFrameScriptLoaded = true;
|
this._isFrameScriptLoaded = true;
|
||||||
|
this._createdFiles = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -161,6 +165,8 @@ SpecialPowersObserver.prototype = new SpecialPowersObserverAPI();
|
|||||||
this._messageManager.removeMessageListener("SPPingService", this);
|
this._messageManager.removeMessageListener("SPPingService", this);
|
||||||
this._messageManager.removeMessageListener("SpecialPowers.Quit", this);
|
this._messageManager.removeMessageListener("SpecialPowers.Quit", this);
|
||||||
this._messageManager.removeMessageListener("SpecialPowers.Focus", this);
|
this._messageManager.removeMessageListener("SpecialPowers.Focus", this);
|
||||||
|
this._messageManager.removeMessageListener("SpecialPowers.CreateFiles", this);
|
||||||
|
this._messageManager.removeMessageListener("SpecialPowers.RemoveFiles", this);
|
||||||
this._messageManager.removeMessageListener("SPPermissionManager", this);
|
this._messageManager.removeMessageListener("SPPermissionManager", this);
|
||||||
this._messageManager.removeMessageListener("SPWebAppService", this);
|
this._messageManager.removeMessageListener("SPWebAppService", this);
|
||||||
this._messageManager.removeMessageListener("SPObserverService", this);
|
this._messageManager.removeMessageListener("SPObserverService", this);
|
||||||
@ -265,6 +271,50 @@ SpecialPowersObserver.prototype = new SpecialPowersObserverAPI();
|
|||||||
case "SpecialPowers.Focus":
|
case "SpecialPowers.Focus":
|
||||||
aMessage.target.focus();
|
aMessage.target.focus();
|
||||||
break;
|
break;
|
||||||
|
case "SpecialPowers.CreateFiles":
|
||||||
|
let filePaths = new Array;
|
||||||
|
if (!this.createdFiles) {
|
||||||
|
this._createdFiles = new Array;
|
||||||
|
}
|
||||||
|
let createdFiles = this._createdFiles;
|
||||||
|
try {
|
||||||
|
aMessage.data.forEach(function(request) {
|
||||||
|
let testFile = Services.dirsvc.get("ProfD", Ci.nsIFile);
|
||||||
|
testFile.append(request.name);
|
||||||
|
let outStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
|
||||||
|
outStream.init(testFile, 0x02 | 0x08 | 0x20, // PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE
|
||||||
|
0666, 0);
|
||||||
|
if (request.data) {
|
||||||
|
outStream.write(request.data, request.data.length);
|
||||||
|
outStream.close();
|
||||||
|
}
|
||||||
|
filePaths.push(new File(testFile.path));
|
||||||
|
createdFiles.push(testFile);
|
||||||
|
});
|
||||||
|
aMessage.target
|
||||||
|
.QueryInterface(Ci.nsIFrameLoaderOwner)
|
||||||
|
.frameLoader
|
||||||
|
.messageManager
|
||||||
|
.sendAsyncMessage("SpecialPowers.FilesCreated", filePaths);
|
||||||
|
} catch (e) {
|
||||||
|
aMessage.target
|
||||||
|
.QueryInterface(Ci.nsIFrameLoaderOwner)
|
||||||
|
.frameLoader
|
||||||
|
.messageManager
|
||||||
|
.sendAsyncMessage("SpecialPowers.FilesError", e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "SpecialPowers.RemoveFiles":
|
||||||
|
if (this._createdFiles) {
|
||||||
|
this._createdFiles.forEach(function (testFile) {
|
||||||
|
try {
|
||||||
|
testFile.remove(false);
|
||||||
|
} catch (e) {}
|
||||||
|
});
|
||||||
|
this._createdFiles = null;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return this._receiveMessage(aMessage);
|
return this._receiveMessage(aMessage);
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,8 @@ function SpecialPowers(window) {
|
|||||||
this._pongHandlers = [];
|
this._pongHandlers = [];
|
||||||
this._messageListener = this._messageReceived.bind(this);
|
this._messageListener = this._messageReceived.bind(this);
|
||||||
this._grandChildFrameMM = null;
|
this._grandChildFrameMM = null;
|
||||||
|
this._createFilesOnError = null;
|
||||||
|
this._createFilesOnSuccess = null;
|
||||||
this.SP_SYNC_MESSAGES = ["SPChromeScriptMessage",
|
this.SP_SYNC_MESSAGES = ["SPChromeScriptMessage",
|
||||||
"SPLoadChromeScript",
|
"SPLoadChromeScript",
|
||||||
"SPObserverService",
|
"SPObserverService",
|
||||||
@ -36,6 +38,8 @@ function SpecialPowers(window) {
|
|||||||
|
|
||||||
this.SP_ASYNC_MESSAGES = ["SpecialPowers.Focus",
|
this.SP_ASYNC_MESSAGES = ["SpecialPowers.Focus",
|
||||||
"SpecialPowers.Quit",
|
"SpecialPowers.Quit",
|
||||||
|
"SpecialPowers.CreateFiles",
|
||||||
|
"SpecialPowers.RemoveFiles",
|
||||||
"SPPingService",
|
"SPPingService",
|
||||||
"SPQuotaManager",
|
"SPQuotaManager",
|
||||||
"SPLoadExtension",
|
"SPLoadExtension",
|
||||||
@ -43,6 +47,8 @@ function SpecialPowers(window) {
|
|||||||
"SPUnloadExtension",
|
"SPUnloadExtension",
|
||||||
"SPExtensionMessage"];
|
"SPExtensionMessage"];
|
||||||
addMessageListener("SPPingService", this._messageListener);
|
addMessageListener("SPPingService", this._messageListener);
|
||||||
|
addMessageListener("SpecialPowers.FilesCreated", this._messageListener);
|
||||||
|
addMessageListener("SpecialPowers.FilesError", this._messageListener);
|
||||||
let self = this;
|
let self = this;
|
||||||
Services.obs.addObserver(function onInnerWindowDestroyed(subject, topic, data) {
|
Services.obs.addObserver(function onInnerWindowDestroyed(subject, topic, data) {
|
||||||
var id = subject.QueryInterface(Components.interfaces.nsISupportsPRUint64).data;
|
var id = subject.QueryInterface(Components.interfaces.nsISupportsPRUint64).data;
|
||||||
@ -50,6 +56,8 @@ function SpecialPowers(window) {
|
|||||||
Services.obs.removeObserver(onInnerWindowDestroyed, "inner-window-destroyed");
|
Services.obs.removeObserver(onInnerWindowDestroyed, "inner-window-destroyed");
|
||||||
try {
|
try {
|
||||||
removeMessageListener("SPPingService", self._messageListener);
|
removeMessageListener("SPPingService", self._messageListener);
|
||||||
|
removeMessageListener("SpecialPowers.FilesCreated", self._messageListener);
|
||||||
|
removeMessageListener("SpecialPowers.FilesError", self._messageListener);
|
||||||
} catch (e if e.result == Components.results.NS_ERROR_ILLEGAL_VALUE) {
|
} catch (e if e.result == Components.results.NS_ERROR_ILLEGAL_VALUE) {
|
||||||
// Ignore the exception which the message manager has been destroyed.
|
// Ignore the exception which the message manager has been destroyed.
|
||||||
;
|
;
|
||||||
@ -122,7 +130,26 @@ SpecialPowers.prototype._messageReceived = function(aMessage) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "SpecialPowers.FilesCreated":
|
||||||
|
var handler = this._createFilesOnSuccess;
|
||||||
|
this._createFilesOnSuccess = null;
|
||||||
|
this._createFilesOnError = null;
|
||||||
|
if (handler) {
|
||||||
|
handler(aMessage.data);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "SpecialPowers.FilesError":
|
||||||
|
var handler = this._createFilesOnError;
|
||||||
|
this._createFilesOnSuccess = null;
|
||||||
|
this._createFilesOnError = null;
|
||||||
|
if (handler) {
|
||||||
|
handler(aMessage.data);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -130,6 +157,27 @@ SpecialPowers.prototype.quit = function() {
|
|||||||
sendAsyncMessage("SpecialPowers.Quit", {});
|
sendAsyncMessage("SpecialPowers.Quit", {});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// fileRequests is an array of file requests. Each file request is an object.
|
||||||
|
// A request must have a field |name|, which gives the base of the name of the
|
||||||
|
// file to be created in the profile directory. If the request has a |data| field
|
||||||
|
// then that data will be written to the file.
|
||||||
|
SpecialPowers.prototype.createFiles = function(fileRequests, onCreation, onError) {
|
||||||
|
if (this._createFilesOnSuccess || this._createFilesOnError) {
|
||||||
|
onError("Already waiting for SpecialPowers.createFiles() to finish.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._createFilesOnSuccess = onCreation;
|
||||||
|
this._createFilesOnError = onError;
|
||||||
|
sendAsyncMessage("SpecialPowers.CreateFiles", fileRequests);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove the files that were created using |SpecialPowers.createFiles()|.
|
||||||
|
// This will be automatically called by |SimpleTest.finish()|.
|
||||||
|
SpecialPowers.prototype.removeFiles = function() {
|
||||||
|
sendAsyncMessage("SpecialPowers.RemoveFiles", {});
|
||||||
|
};
|
||||||
|
|
||||||
SpecialPowers.prototype.executeAfterFlushingMessageQueue = function(aCallback) {
|
SpecialPowers.prototype.executeAfterFlushingMessageQueue = function(aCallback) {
|
||||||
this._pongHandlers.push(aCallback);
|
this._pongHandlers.push(aCallback);
|
||||||
sendAsyncMessage("SPPingService", { op: "ping" });
|
sendAsyncMessage("SPPingService", { op: "ping" });
|
||||||
|
Loading…
Reference in New Issue
Block a user