mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-01-09 05:14:24 +00:00
Bug 846635 - Use asynchronous getCharsetForURI in getShortcutOrURI. r=mano
This commit is contained in:
parent
2d149e7643
commit
457bfb1407
@ -9,6 +9,9 @@ let Cu = Components.utils;
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource:///modules/RecentWindow.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Task",
|
||||
"resource://gre/modules/Task.jsm");
|
||||
|
||||
const nsIWebNavigation = Ci.nsIWebNavigation;
|
||||
|
||||
var gCharsetMenu = null;
|
||||
@ -1925,88 +1928,89 @@ function loadURI(uri, referrer, postData, allowThirdPartyFixup) {
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
function getShortcutOrURI(aURL, aPostDataRef, aMayInheritPrincipal) {
|
||||
// Initialize outparam to false
|
||||
if (aMayInheritPrincipal)
|
||||
aMayInheritPrincipal.value = false;
|
||||
function getShortcutOrURIAndPostData(aURL) {
|
||||
return Task.spawn(function() {
|
||||
let mayInheritPrincipal = false;
|
||||
let postData = null;
|
||||
let shortcutURL = null;
|
||||
let keyword = aURL;
|
||||
let param = "";
|
||||
|
||||
var shortcutURL = null;
|
||||
var keyword = aURL;
|
||||
var param = "";
|
||||
|
||||
var offset = aURL.indexOf(" ");
|
||||
if (offset > 0) {
|
||||
keyword = aURL.substr(0, offset);
|
||||
param = aURL.substr(offset + 1);
|
||||
}
|
||||
|
||||
if (!aPostDataRef)
|
||||
aPostDataRef = {};
|
||||
|
||||
var engine = Services.search.getEngineByAlias(keyword);
|
||||
if (engine) {
|
||||
var submission = engine.getSubmission(param);
|
||||
aPostDataRef.value = submission.postData;
|
||||
return submission.uri.spec;
|
||||
}
|
||||
|
||||
[shortcutURL, aPostDataRef.value] =
|
||||
PlacesUtils.getURLAndPostDataForKeyword(keyword);
|
||||
|
||||
if (!shortcutURL)
|
||||
return aURL;
|
||||
|
||||
var postData = "";
|
||||
if (aPostDataRef.value)
|
||||
postData = unescape(aPostDataRef.value);
|
||||
|
||||
if (/%s/i.test(shortcutURL) || /%s/i.test(postData)) {
|
||||
var charset = "";
|
||||
const re = /^(.*)\&mozcharset=([a-zA-Z][_\-a-zA-Z0-9]+)\s*$/;
|
||||
var matches = shortcutURL.match(re);
|
||||
if (matches)
|
||||
[, shortcutURL, charset] = matches;
|
||||
else {
|
||||
// Try to get the saved character-set.
|
||||
try {
|
||||
// makeURI throws if URI is invalid.
|
||||
// Will return an empty string if character-set is not found.
|
||||
charset = PlacesUtils.history.getCharsetForURI(makeURI(shortcutURL));
|
||||
} catch (e) {}
|
||||
let offset = aURL.indexOf(" ");
|
||||
if (offset > 0) {
|
||||
keyword = aURL.substr(0, offset);
|
||||
param = aURL.substr(offset + 1);
|
||||
}
|
||||
|
||||
// encodeURIComponent produces UTF-8, and cannot be used for other charsets.
|
||||
// escape() works in those cases, but it doesn't uri-encode +, @, and /.
|
||||
// Therefore we need to manually replace these ASCII characters by their
|
||||
// encodeURIComponent result, to match the behavior of nsEscape() with
|
||||
// url_XPAlphas
|
||||
var encodedParam = "";
|
||||
if (charset && charset != "UTF-8")
|
||||
encodedParam = escape(convertFromUnicode(charset, param)).
|
||||
replace(/[+@\/]+/g, encodeURIComponent);
|
||||
else // Default charset is UTF-8
|
||||
encodedParam = encodeURIComponent(param);
|
||||
let engine = Services.search.getEngineByAlias(keyword);
|
||||
if (engine) {
|
||||
let submission = engine.getSubmission(param);
|
||||
postData = submission.postData;
|
||||
throw new Task.Result({ postData: submission.postData,
|
||||
url: submission.uri.spec,
|
||||
mayInheritPrincipal: mayInheritPrincipal });
|
||||
}
|
||||
|
||||
shortcutURL = shortcutURL.replace(/%s/g, encodedParam).replace(/%S/g, param);
|
||||
[shortcutURL, postData] =
|
||||
PlacesUtils.getURLAndPostDataForKeyword(keyword);
|
||||
|
||||
if (/%s/i.test(postData)) // POST keyword
|
||||
aPostDataRef.value = getPostDataStream(postData, param, encodedParam,
|
||||
"application/x-www-form-urlencoded");
|
||||
}
|
||||
else if (param) {
|
||||
// This keyword doesn't take a parameter, but one was provided. Just return
|
||||
// the original URL.
|
||||
aPostDataRef.value = null;
|
||||
if (!shortcutURL)
|
||||
throw new Task.Result({ postData: postData, url: aURL,
|
||||
mayInheritPrincipal: mayInheritPrincipal });
|
||||
|
||||
return aURL;
|
||||
}
|
||||
let escapedPostData = "";
|
||||
if (postData)
|
||||
escapedPostData = unescape(postData);
|
||||
|
||||
// This URL came from a bookmark, so it's safe to let it inherit the current
|
||||
// document's principal.
|
||||
if (aMayInheritPrincipal)
|
||||
aMayInheritPrincipal.value = true;
|
||||
if (/%s/i.test(shortcutURL) || /%s/i.test(escapedPostData)) {
|
||||
let charset = "";
|
||||
const re = /^(.*)\&mozcharset=([a-zA-Z][_\-a-zA-Z0-9]+)\s*$/;
|
||||
let matches = shortcutURL.match(re);
|
||||
if (matches)
|
||||
[, shortcutURL, charset] = matches;
|
||||
else {
|
||||
// Try to get the saved character-set.
|
||||
try {
|
||||
// makeURI throws if URI is invalid.
|
||||
// Will return an empty string if character-set is not found.
|
||||
charset = yield PlacesUtils.getCharsetForURI(makeURI(shortcutURL));
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
return shortcutURL;
|
||||
// encodeURIComponent produces UTF-8, and cannot be used for other charsets.
|
||||
// escape() works in those cases, but it doesn't uri-encode +, @, and /.
|
||||
// Therefore we need to manually replace these ASCII characters by their
|
||||
// encodeURIComponent result, to match the behavior of nsEscape() with
|
||||
// url_XPAlphas
|
||||
let encodedParam = "";
|
||||
if (charset && charset != "UTF-8")
|
||||
encodedParam = escape(convertFromUnicode(charset, param)).
|
||||
replace(/[+@\/]+/g, encodeURIComponent);
|
||||
else // Default charset is UTF-8
|
||||
encodedParam = encodeURIComponent(param);
|
||||
|
||||
shortcutURL = shortcutURL.replace(/%s/g, encodedParam).replace(/%S/g, param);
|
||||
|
||||
if (/%s/i.test(escapedPostData)) // POST keyword
|
||||
postData = getPostDataStream(escapedPostData, param, encodedParam,
|
||||
"application/x-www-form-urlencoded");
|
||||
}
|
||||
else if (param) {
|
||||
// This keyword doesn't take a parameter, but one was provided. Just return
|
||||
// the original URL.
|
||||
postData = null;
|
||||
|
||||
throw new Task.Result({ postData: postData, url: aURL,
|
||||
mayInheritPrincipal: mayInheritPrincipal });
|
||||
}
|
||||
|
||||
// This URL came from a bookmark, so it's safe to let it inherit the current
|
||||
// document's principal.
|
||||
mayInheritPrincipal = true;
|
||||
|
||||
throw new Task.Result({ postData: postData, url: shortcutURL,
|
||||
mayInheritPrincipal: mayInheritPrincipal });
|
||||
});
|
||||
}
|
||||
|
||||
function getPostDataStream(aStringData, aKeyword, aEncKeyword, aType) {
|
||||
@ -2843,12 +2847,13 @@ var newTabButtonObserver = {
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
let url = browserDragAndDrop.drop(aEvent, { });
|
||||
var postData = {};
|
||||
url = getShortcutOrURI(url, postData);
|
||||
if (url) {
|
||||
// allow third-party services to fixup this URL
|
||||
openNewTabWith(url, null, postData.value, aEvent, true);
|
||||
}
|
||||
Task.spawn(function() {
|
||||
let data = yield getShortcutOrURIAndPostData(url);
|
||||
if (data.url) {
|
||||
// allow third-party services to fixup this URL
|
||||
openNewTabWith(data.url, null, data.postData, aEvent, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -2863,12 +2868,13 @@ var newWindowButtonObserver = {
|
||||
onDrop: function (aEvent)
|
||||
{
|
||||
let url = browserDragAndDrop.drop(aEvent, { });
|
||||
var postData = {};
|
||||
url = getShortcutOrURI(url, postData);
|
||||
if (url) {
|
||||
// allow third-party services to fixup this URL
|
||||
openNewWindowWith(url, null, postData.value, true);
|
||||
}
|
||||
Task.spawn(function() {
|
||||
let data = yield getShortcutOrURIAndPostData(url);
|
||||
if (data.url) {
|
||||
// allow third-party services to fixup this URL
|
||||
openNewWindowWith(data.url, null, data.postData, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -5239,36 +5245,52 @@ function middleMousePaste(event) {
|
||||
// bar's behavior (stripsurroundingwhitespace)
|
||||
clipboard = clipboard.replace(/\s*\n\s*/g, "");
|
||||
|
||||
let mayInheritPrincipal = { value: false };
|
||||
let url = getShortcutOrURI(clipboard, mayInheritPrincipal);
|
||||
try {
|
||||
makeURI(url);
|
||||
} catch (ex) {
|
||||
// Not a valid URI.
|
||||
return;
|
||||
// if it's not the current tab, we don't need to do anything because the
|
||||
// browser doesn't exist.
|
||||
let where = whereToOpenLink(event, true, false);
|
||||
let lastLocationChange;
|
||||
if (where == "current") {
|
||||
lastLocationChange = gBrowser.selectedBrowser.lastLocationChange;
|
||||
}
|
||||
|
||||
try {
|
||||
addToUrlbarHistory(url);
|
||||
} catch (ex) {
|
||||
// Things may go wrong when adding url to session history,
|
||||
// but don't let that interfere with the loading of the url.
|
||||
Cu.reportError(ex);
|
||||
}
|
||||
Task.spawn(function() {
|
||||
let data = yield getShortcutOrURIAndPostData(clipboard);
|
||||
try {
|
||||
makeURI(data.url);
|
||||
} catch (ex) {
|
||||
// Not a valid URI.
|
||||
return;
|
||||
}
|
||||
|
||||
openUILink(url, event,
|
||||
{ ignoreButton: true,
|
||||
disallowInheritPrincipal: !mayInheritPrincipal.value });
|
||||
try {
|
||||
addToUrlbarHistory(data.url);
|
||||
} catch (ex) {
|
||||
// Things may go wrong when adding url to session history,
|
||||
// but don't let that interfere with the loading of the url.
|
||||
Cu.reportError(ex);
|
||||
}
|
||||
|
||||
if (where != "current" ||
|
||||
lastLocationChange == gBrowser.selectedBrowser.lastLocationChange) {
|
||||
openUILink(data.url, event,
|
||||
{ ignoreButton: true,
|
||||
disallowInheritPrincipal: !data.mayInheritPrincipal });
|
||||
}
|
||||
});
|
||||
|
||||
event.stopPropagation();
|
||||
}
|
||||
|
||||
function handleDroppedLink(event, url, name)
|
||||
{
|
||||
let postData = { };
|
||||
let uri = getShortcutOrURI(url, postData);
|
||||
if (uri)
|
||||
loadURI(uri, null, postData.value, false);
|
||||
let lastLocationChange = gBrowser.selectedBrowser.lastLocationChange;
|
||||
|
||||
Task.spawn(function() {
|
||||
let data = yield getShortcutOrURIAndPostData(url);
|
||||
if (data.url &&
|
||||
lastLocationChange == gBrowser.selectedBrowser.lastLocationChange)
|
||||
loadURI(data.url, null, data.postData, false);
|
||||
});
|
||||
|
||||
// Keep the event from being handled by the dragDrop listeners
|
||||
// built-in to gecko if they happen to be above us.
|
||||
@ -5391,7 +5413,6 @@ function charsetLoadListener() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var gPageStyleMenu = {
|
||||
|
||||
_getAllStyleSheets: function (frameset) {
|
||||
|
@ -16,6 +16,7 @@ try {
|
||||
}
|
||||
|
||||
Components.utils.import("resource:///modules/openLocationLastURL.jsm", openLocationModule);
|
||||
Components.utils.import("resource://gre/modules/Task.jsm");
|
||||
let gOpenLocationLastURL = new openLocationModule.OpenLocationLastURL(window.opener);
|
||||
|
||||
function onLoad()
|
||||
@ -61,44 +62,52 @@ function doEnabling()
|
||||
|
||||
function open()
|
||||
{
|
||||
var url;
|
||||
var postData = {};
|
||||
var mayInheritPrincipal = {value: false};
|
||||
if (browser)
|
||||
url = browser.getShortcutOrURI(dialog.input.value, postData, mayInheritPrincipal);
|
||||
else
|
||||
url = dialog.input.value;
|
||||
Task.spawn(function() {
|
||||
let url;
|
||||
let postData = null;
|
||||
let mayInheritPrincipal = false;
|
||||
|
||||
try {
|
||||
// Whichever target we use for the load, we allow third-party services to
|
||||
// fixup the URI
|
||||
switch (dialog.openWhereList.value) {
|
||||
case "0":
|
||||
var webNav = Components.interfaces.nsIWebNavigation;
|
||||
var flags = webNav.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP;
|
||||
if (!mayInheritPrincipal.value)
|
||||
flags |= webNav.LOAD_FLAGS_DISALLOW_INHERIT_OWNER;
|
||||
browser.gBrowser.loadURIWithFlags(url, flags, null, null, postData.value);
|
||||
break;
|
||||
case "1":
|
||||
window.opener.delayedOpenWindow(getBrowserURL(), "all,dialog=no",
|
||||
url, postData.value, null, null, true);
|
||||
break;
|
||||
case "3":
|
||||
browser.delayedOpenTab(url, null, null, postData.value, true);
|
||||
break;
|
||||
if (browser) {
|
||||
let data = yield browser.getShortcutOrURIAndPostData(dialog.input.value);
|
||||
url = data.url;
|
||||
postData = data.postData;
|
||||
mayInheritPrincipal = data.mayInheritPrincipal;
|
||||
} else {
|
||||
url = dialog.input.value;
|
||||
}
|
||||
}
|
||||
catch(exception) {
|
||||
}
|
||||
|
||||
if (pref) {
|
||||
gOpenLocationLastURL.value = dialog.input.value;
|
||||
pref.setIntPref("general.open_location.last_window_choice", dialog.openWhereList.value);
|
||||
}
|
||||
try {
|
||||
// Whichever target we use for the load, we allow third-party services to
|
||||
// fixup the URI
|
||||
switch (dialog.openWhereList.value) {
|
||||
case "0":
|
||||
var webNav = Components.interfaces.nsIWebNavigation;
|
||||
var flags = webNav.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP;
|
||||
if (!mayInheritPrincipal)
|
||||
flags |= webNav.LOAD_FLAGS_DISALLOW_INHERIT_OWNER;
|
||||
browser.gBrowser.loadURIWithFlags(url, flags, null, null, postData);
|
||||
break;
|
||||
case "1":
|
||||
window.opener.delayedOpenWindow(getBrowserURL(), "all,dialog=no",
|
||||
url, postData, null, null, true);
|
||||
break;
|
||||
case "3":
|
||||
browser.delayedOpenTab(url, null, null, postData, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch(exception) {
|
||||
}
|
||||
|
||||
if (pref) {
|
||||
gOpenLocationLastURL.value = dialog.input.value;
|
||||
pref.setIntPref("general.open_location.last_window_choice", dialog.openWhereList.value);
|
||||
}
|
||||
|
||||
// Delay closing slightly to avoid timing bug on Linux.
|
||||
window.close();
|
||||
});
|
||||
|
||||
// Delay closing slightly to avoid timing bug on Linux.
|
||||
window.close();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -679,8 +679,10 @@
|
||||
aFlags]);
|
||||
}
|
||||
|
||||
if (topLevel)
|
||||
if (topLevel) {
|
||||
this.mBrowser.lastURI = aLocation;
|
||||
this.mBrowser.lastLocationChange = Date.now();
|
||||
}
|
||||
},
|
||||
|
||||
onStatusChange: function (aWebProgress, aRequest, aStatus, aMessage) {
|
||||
|
@ -167,7 +167,7 @@ let gReplacedMethods = [
|
||||
"gatherTextUnder",
|
||||
"saveURL",
|
||||
"openLinkIn",
|
||||
"getShortcutOrURI",
|
||||
"getShortcutOrURIAndPostData",
|
||||
];
|
||||
|
||||
// Reference to the new window.
|
||||
@ -232,8 +232,8 @@ let gClickHandler = {
|
||||
function wrapperMethod(aInvokedMethods, aMethodName) {
|
||||
return function () {
|
||||
aInvokedMethods.push(aMethodName);
|
||||
// At least getShortcutOrURI requires to return url that is the first param.
|
||||
return arguments[0];
|
||||
// At least getShortcutOrURIAndPostData requires to return url
|
||||
return (aMethodName == "getShortcutOrURIAndPostData") ? arguments.url : arguments[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -85,33 +85,33 @@ var testData = [
|
||||
new keywordResult("http://bmget/?esc=%2B%2F%40&raw=+/@", null)],
|
||||
|
||||
// Test using a non-bmKeywordData object, to test the behavior of
|
||||
// getShortcutOrURI for non-keywords (setupKeywords only adds keywords for
|
||||
// getShortcutOrURIAndPostData for non-keywords (setupKeywords only adds keywords for
|
||||
// bmKeywordData objects)
|
||||
[{keyword: "http://gavinsharp.com"},
|
||||
new keywordResult(null, null, true)]
|
||||
];
|
||||
|
||||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
setupKeywords();
|
||||
|
||||
for each (var item in testData) {
|
||||
var [data, result] = item;
|
||||
Task.spawn(function() {
|
||||
for each (var item in testData) {
|
||||
let [data, result] = item;
|
||||
|
||||
var postData = {};
|
||||
var query = data.keyword;
|
||||
if (data.searchWord)
|
||||
query += " " + data.searchWord;
|
||||
var mayInheritPrincipal = {};
|
||||
var url = getShortcutOrURI(query, postData, mayInheritPrincipal);
|
||||
|
||||
// null result.url means we should expect the same query we sent in
|
||||
var expected = result.url || query;
|
||||
is(url, expected, "got correct URL for " + data.keyword);
|
||||
is(getPostDataString(postData.value), result.postData, "got correct postData for " + data.keyword);
|
||||
is(mayInheritPrincipal.value, !result.isUnsafe, "got correct mayInheritPrincipal for " + data.keyword);
|
||||
}
|
||||
|
||||
cleanupKeywords();
|
||||
let query = data.keyword;
|
||||
if (data.searchWord)
|
||||
query += " " + data.searchWord;
|
||||
let returnedData = yield getShortcutOrURIAndPostData(query);
|
||||
// null result.url means we should expect the same query we sent in
|
||||
let expected = result.url || query;
|
||||
is(returnedData.url, expected, "got correct URL for " + data.keyword);
|
||||
is(getPostDataString(returnedData.postData), result.postData, "got correct postData for " + data.keyword);
|
||||
is(returnedData.mayInheritPrincipal, !result.isUnsafe, "got correct mayInheritPrincipal for " + data.keyword);
|
||||
}
|
||||
cleanupKeywords();
|
||||
}).then(finish);
|
||||
}
|
||||
|
||||
var gBMFolder = null;
|
||||
|
@ -258,155 +258,165 @@
|
||||
var postData = null;
|
||||
|
||||
var action = this._parseActionUrl(url);
|
||||
if (action) {
|
||||
url = action.param;
|
||||
if (this.hasAttribute("actiontype")) {
|
||||
if (action.type == "switchtab") {
|
||||
this.handleRevert();
|
||||
let prevTab = gBrowser.selectedTab;
|
||||
if (switchToTabHavingURI(url) &&
|
||||
isTabEmpty(prevTab))
|
||||
gBrowser.removeTab(prevTab);
|
||||
let lastLocationChange = gBrowser.selectedBrowser.lastLocationChange;
|
||||
Task.spawn(function() {
|
||||
let matchLastLocationChange = true;
|
||||
if (action) {
|
||||
url = action.param;
|
||||
if (this.hasAttribute("actiontype")) {
|
||||
if (action.type == "switchtab") {
|
||||
this.handleRevert();
|
||||
let prevTab = gBrowser.selectedTab;
|
||||
if (switchToTabHavingURI(url) &&
|
||||
isTabEmpty(prevTab))
|
||||
gBrowser.removeTab(prevTab);
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
[url, postData, mayInheritPrincipal] = this._canonizeURL(aTriggeringEvent);
|
||||
if (!url)
|
||||
return;
|
||||
}
|
||||
else {
|
||||
[url, postData, mayInheritPrincipal] = yield this._canonizeURL(aTriggeringEvent);
|
||||
matchLastLocationChange = (lastLocationChange ==
|
||||
gBrowser.selectedBrowser.lastLocationChange);
|
||||
if (!url)
|
||||
return;
|
||||
}
|
||||
|
||||
this.value = url;
|
||||
gBrowser.userTypedValue = url;
|
||||
try {
|
||||
addToUrlbarHistory(url);
|
||||
} catch (ex) {
|
||||
// Things may go wrong when adding url to session history,
|
||||
// but don't let that interfere with the loading of the url.
|
||||
Cu.reportError(ex);
|
||||
}
|
||||
this.value = url;
|
||||
gBrowser.userTypedValue = url;
|
||||
try {
|
||||
addToUrlbarHistory(url);
|
||||
} catch (ex) {
|
||||
// Things may go wrong when adding url to session history,
|
||||
// but don't let that interfere with the loading of the url.
|
||||
Cu.reportError(ex);
|
||||
}
|
||||
|
||||
function loadCurrent() {
|
||||
let flags = Ci.nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP;
|
||||
// Pass LOAD_FLAGS_DISALLOW_INHERIT_OWNER to prevent any loads from
|
||||
// inheriting the currently loaded document's principal, unless this
|
||||
// URL is marked as safe to inherit (e.g. came from a bookmark
|
||||
// keyword).
|
||||
if (!mayInheritPrincipal)
|
||||
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_DISALLOW_INHERIT_OWNER;
|
||||
// If the value wasn't typed, we know that we decoded the value as
|
||||
// UTF-8 (see losslessDecodeURI)
|
||||
if (!this.valueIsTyped)
|
||||
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_URI_IS_UTF8;
|
||||
gBrowser.loadURIWithFlags(url, flags, null, null, postData);
|
||||
}
|
||||
|
||||
// Focus the content area before triggering loads, since if the load
|
||||
// occurs in a new tab, we want focus to be restored to the content
|
||||
// area when the current tab is re-selected.
|
||||
gBrowser.selectedBrowser.focus();
|
||||
|
||||
let isMouseEvent = aTriggeringEvent instanceof MouseEvent;
|
||||
let altEnter = !isMouseEvent && aTriggeringEvent && aTriggeringEvent.altKey;
|
||||
|
||||
if (altEnter) {
|
||||
// XXX This was added a long time ago, and I'm not sure why it is
|
||||
// necessary. Alt+Enter's default action might cause a system beep,
|
||||
// or something like that?
|
||||
aTriggeringEvent.preventDefault();
|
||||
aTriggeringEvent.stopPropagation();
|
||||
}
|
||||
|
||||
// If the current tab is empty, ignore Alt+Enter (just reuse this tab)
|
||||
altEnter = altEnter && !isTabEmpty(gBrowser.selectedTab);
|
||||
|
||||
if (isMouseEvent || altEnter) {
|
||||
// Use the standard UI link behaviors for clicks or Alt+Enter
|
||||
let where = "tab";
|
||||
if (isMouseEvent)
|
||||
where = whereToOpenLink(aTriggeringEvent, false, false);
|
||||
|
||||
if (where == "current") {
|
||||
loadCurrent();
|
||||
} else {
|
||||
this.handleRevert();
|
||||
let params = { allowThirdPartyFixup: true,
|
||||
postData: postData,
|
||||
initiatingDoc: document };
|
||||
function loadCurrent() {
|
||||
let flags = Ci.nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP;
|
||||
// Pass LOAD_FLAGS_DISALLOW_INHERIT_OWNER to prevent any loads from
|
||||
// inheriting the currently loaded document's principal, unless this
|
||||
// URL is marked as safe to inherit (e.g. came from a bookmark
|
||||
// keyword).
|
||||
if (!mayInheritPrincipal)
|
||||
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_DISALLOW_INHERIT_OWNER;
|
||||
// If the value wasn't typed, we know that we decoded the value as
|
||||
// UTF-8 (see losslessDecodeURI)
|
||||
if (!this.valueIsTyped)
|
||||
params.isUTF8 = true;
|
||||
openUILinkIn(url, where, params);
|
||||
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_URI_IS_UTF8;
|
||||
gBrowser.loadURIWithFlags(url, flags, null, null, postData);
|
||||
}
|
||||
} else {
|
||||
loadCurrent();
|
||||
}
|
||||
|
||||
// Focus the content area before triggering loads, since if the load
|
||||
// occurs in a new tab, we want focus to be restored to the content
|
||||
// area when the current tab is re-selected.
|
||||
gBrowser.selectedBrowser.focus();
|
||||
|
||||
let isMouseEvent = aTriggeringEvent instanceof MouseEvent;
|
||||
let altEnter = !isMouseEvent && aTriggeringEvent && aTriggeringEvent.altKey;
|
||||
|
||||
if (altEnter) {
|
||||
// XXX This was added a long time ago, and I'm not sure why it is
|
||||
// necessary. Alt+Enter's default action might cause a system beep,
|
||||
// or something like that?
|
||||
aTriggeringEvent.preventDefault();
|
||||
aTriggeringEvent.stopPropagation();
|
||||
}
|
||||
|
||||
// If the current tab is empty, ignore Alt+Enter (just reuse this tab)
|
||||
altEnter = altEnter && !isTabEmpty(gBrowser.selectedTab);
|
||||
|
||||
if (isMouseEvent || altEnter) {
|
||||
// Use the standard UI link behaviors for clicks or Alt+Enter
|
||||
let where = "tab";
|
||||
if (isMouseEvent)
|
||||
where = whereToOpenLink(aTriggeringEvent, false, false);
|
||||
|
||||
if (where == "current") {
|
||||
if (matchLastLocationChange) {
|
||||
loadCurrent();
|
||||
}
|
||||
} else {
|
||||
this.handleRevert();
|
||||
let params = { allowThirdPartyFixup: true,
|
||||
postData: postData,
|
||||
initiatingDoc: document };
|
||||
if (!this.valueIsTyped)
|
||||
params.isUTF8 = true;
|
||||
openUILinkIn(url, where, params);
|
||||
}
|
||||
} else {
|
||||
if (matchLastLocationChange) {
|
||||
loadCurrent();
|
||||
}
|
||||
}
|
||||
}.bind(this));
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
<method name="_canonizeURL">
|
||||
<parameter name="aTriggeringEvent"/>
|
||||
<body><![CDATA[
|
||||
var url = this.value;
|
||||
if (!url)
|
||||
return ["", null, false];
|
||||
return Task.spawn(function() {
|
||||
var url = this.value;
|
||||
if (!url)
|
||||
throw new Task.Result(["", null, false]);
|
||||
|
||||
// Only add the suffix when the URL bar value isn't already "URL-like",
|
||||
// and only if we get a keyboard event, to match user expectations.
|
||||
if (/^\s*[^.:\/\s]+(?:\/.*|\s*)$/i.test(url) &&
|
||||
(aTriggeringEvent instanceof KeyEvent)) {
|
||||
// Only add the suffix when the URL bar value isn't already "URL-like",
|
||||
// and only if we get a keyboard event, to match user expectations.
|
||||
if (/^\s*[^.:\/\s]+(?:\/.*|\s*)$/i.test(url) &&
|
||||
(aTriggeringEvent instanceof KeyEvent)) {
|
||||
#ifdef XP_MACOSX
|
||||
let accel = aTriggeringEvent.metaKey;
|
||||
let accel = aTriggeringEvent.metaKey;
|
||||
#else
|
||||
let accel = aTriggeringEvent.ctrlKey;
|
||||
let accel = aTriggeringEvent.ctrlKey;
|
||||
#endif
|
||||
let shift = aTriggeringEvent.shiftKey;
|
||||
let shift = aTriggeringEvent.shiftKey;
|
||||
|
||||
let suffix = "";
|
||||
let suffix = "";
|
||||
|
||||
switch (true) {
|
||||
case (accel && shift):
|
||||
suffix = ".org/";
|
||||
break;
|
||||
case (shift):
|
||||
suffix = ".net/";
|
||||
break;
|
||||
case (accel):
|
||||
try {
|
||||
suffix = gPrefService.getCharPref("browser.fixup.alternate.suffix");
|
||||
if (suffix.charAt(suffix.length - 1) != "/")
|
||||
suffix += "/";
|
||||
} catch(e) {
|
||||
suffix = ".com/";
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (suffix) {
|
||||
// trim leading/trailing spaces (bug 233205)
|
||||
url = url.trim();
|
||||
|
||||
// Tack www. and suffix on. If user has appended directories, insert
|
||||
// suffix before them (bug 279035). Be careful not to get two slashes.
|
||||
|
||||
let firstSlash = url.indexOf("/");
|
||||
|
||||
if (firstSlash >= 0) {
|
||||
url = url.substring(0, firstSlash) + suffix +
|
||||
url.substring(firstSlash + 1);
|
||||
} else {
|
||||
url = url + suffix;
|
||||
switch (true) {
|
||||
case (accel && shift):
|
||||
suffix = ".org/";
|
||||
break;
|
||||
case (shift):
|
||||
suffix = ".net/";
|
||||
break;
|
||||
case (accel):
|
||||
try {
|
||||
suffix = gPrefService.getCharPref("browser.fixup.alternate.suffix");
|
||||
if (suffix.charAt(suffix.length - 1) != "/")
|
||||
suffix += "/";
|
||||
} catch(e) {
|
||||
suffix = ".com/";
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
url = "http://www." + url;
|
||||
if (suffix) {
|
||||
// trim leading/trailing spaces (bug 233205)
|
||||
url = url.trim();
|
||||
|
||||
// Tack www. and suffix on. If user has appended directories, insert
|
||||
// suffix before them (bug 279035). Be careful not to get two slashes.
|
||||
|
||||
let firstSlash = url.indexOf("/");
|
||||
|
||||
if (firstSlash >= 0) {
|
||||
url = url.substring(0, firstSlash) + suffix +
|
||||
url.substring(firstSlash + 1);
|
||||
} else {
|
||||
url = url + suffix;
|
||||
}
|
||||
|
||||
url = "http://www." + url;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var postData = {};
|
||||
var mayInheritPrincipal = { value: false };
|
||||
url = getShortcutOrURI(url, postData, mayInheritPrincipal);
|
||||
let data = yield getShortcutOrURIAndPostData(url);
|
||||
|
||||
return [url, postData.value, mayInheritPrincipal.value];
|
||||
throw new Task.Result([data.url, data.postData, data.mayInheritPrincipal]);
|
||||
}.bind(this));
|
||||
]]></body>
|
||||
</method>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user