Bug 1256652 - [webext] Add webNavigation form_submit transitions implementation and test case. r=krizsa

MozReview-Commit-ID: GiMnQpCpHHm

--HG--
extra : transplant_source : %E5%02vk%3B%95%FC%D8%FF%8AC%E4%A6%A5e_%B4.%EA%DA
This commit is contained in:
Luca Greco 2016-04-15 14:50:27 +02:00
parent 94d2a46537
commit dc5fd2506d
3 changed files with 62 additions and 6 deletions

View File

@ -5,5 +5,8 @@
<iframe src="file_WebNavigation_page2.html" width="200" height="200"></iframe>
<form>
</form>
</body>
</html>

View File

@ -168,6 +168,23 @@ add_task(function* webnav_transitions_props() {
"transitionQualifiers found in the OnCommitted events");
}
// transitionType: form_submit
received = [];
yield loadAndWait(win, "onCompleted", URL, () => {
win.document.querySelector("form").submit();
});
found = received.find((data) => (data.event == "onCommitted" && data.url == URL));
ok(found, "Got the onCommitted event");
if (found) {
is(found.details.transitionType, "form_submit",
"Got the expected 'form_submit' transitionType in the OnCommitted event");
ok(Array.isArray(found.details.transitionQualifiers),
"transitionQualifiers found in the OnCommitted events");
}
// transitionQualifier: server_redirect
received = [];
yield loadAndWait(win, "onCompleted", REDIRECTED, () => { win.location = REDIRECT; });

View File

@ -23,6 +23,35 @@ addMessageListener("Extension:DisableWebNavigation", () => {
removeEventListener("DOMContentLoaded", loadListener);
});
var FormSubmitListener = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
Ci.nsIFormSubmitObserver,
Ci.nsISupportsWeakReference]),
init() {
this.formSubmitWindows = new WeakSet();
Services.obs.addObserver(FormSubmitListener, "earlyformsubmit", false);
},
uninit() {
Services.obs.removeObserver(FormSubmitListener, "earlyformsubmit", false);
this.formSubmitWindows = new WeakSet();
},
notify: function(form, window, actionURI) {
try {
this.formSubmitWindows.add(window);
} catch (e) {
Cu.reportError("Error in FormSubmitListener.notify");
}
},
hasAndForget: function(window) {
let has = this.formSubmitWindows.has(window);
this.formSubmitWindows.delete(window);
return has;
},
};
var WebProgressListener = {
init: function() {
// This WeakMap (DOMWindow -> nsIURI) keeps track of the pathname and hash
@ -125,8 +154,8 @@ var WebProgressListener = {
},
sendDocumentChange({webProgress, locationURI, request}) {
let {loadType} = webProgress;
let frameTransitionData = this.getFrameTransitionData({loadType, request});
let {loadType, DOMWindow} = webProgress;
let frameTransitionData = this.getFrameTransitionData({loadType, request, DOMWindow});
let data = {
frameTransitionData,
@ -139,7 +168,7 @@ var WebProgressListener = {
},
sendHistoryChange({webProgress, previousURI, locationURI, request}) {
let {loadType} = webProgress;
let {loadType, DOMWindow} = webProgress;
let isHistoryStateUpdated = false;
let isReferenceFragmentUpdated = false;
@ -163,7 +192,7 @@ var WebProgressListener = {
}
if (isHistoryStateUpdated || isReferenceFragmentUpdated) {
let frameTransitionData = this.getFrameTransitionData({loadType, request});
let frameTransitionData = this.getFrameTransitionData({loadType, request, DOMWindow});
let data = {
frameTransitionData,
@ -177,7 +206,7 @@ var WebProgressListener = {
}
},
getFrameTransitionData({loadType, request}) {
getFrameTransitionData({loadType, request, DOMWindow}) {
let frameTransitionData = {};
if (loadType & Ci.nsIDocShell.LOAD_CMD_HISTORY) {
@ -194,24 +223,31 @@ var WebProgressListener = {
}
}
if (FormSubmitListener.hasAndForget(DOMWindow)) {
frameTransitionData.form_submit = true;
}
return frameTransitionData;
},
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]),
};
var disabled = false;
WebProgressListener.init();
FormSubmitListener.init();
addEventListener("unload", () => {
if (!disabled) {
disabled = true;
WebProgressListener.uninit();
FormSubmitListener.uninit();
}
});
addMessageListener("Extension:DisableWebNavigation", () => {
if (!disabled) {
disabled = true;
WebProgressListener.uninit();
FormSubmitListener.uninit();
}
});