mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-06 07:17:30 +09:00
Bug 846635 - Use asynchronous getCharsetForURI in getShortcutOrURI
Issue #121
This commit is contained in:
parent
09f98d848b
commit
d8637395c5
4 changed files with 305 additions and 260 deletions
|
|
@ -263,151 +263,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 webnav = Ci.nsIWebNavigation;
|
||||
let flags = webnav.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP |
|
||||
webnav.LOAD_FLAGS_FIXUP_SCHEME_TYPOS;
|
||||
// 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;
|
||||
gBrowser.loadURIWithFlags(url, flags, null, null, postData);
|
||||
}
|
||||
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();
|
||||
// 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;
|
||||
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 (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 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 (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();
|
||||
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 {
|
||||
this.handleRevert();
|
||||
let params = { allowThirdPartyFixup: true,
|
||||
postData: postData,
|
||||
initiatingDoc: document };
|
||||
openUILinkIn(url, where, params);
|
||||
if (matchLastLocationChange) {
|
||||
loadCurrent();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
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…
Add table
Add a link
Reference in a new issue