зеркало из https://github.com/mozilla/gecko-dev.git
Bug 302575 - URL bar gets confused about what URI is loaded. patch by Florian Queze <florian@mozilla.com> and Gavin Sharp. r=gavin, sr=neil.
This commit is contained in:
Родитель
c66569bd06
Коммит
5f7c7f2aca
|
@ -1323,7 +1323,7 @@ function gotoHistoryIndex(aEvent)
|
||||||
// Normal click. Go there in the current tab and update session history.
|
// Normal click. Go there in the current tab and update session history.
|
||||||
|
|
||||||
try {
|
try {
|
||||||
getWebNavigation().gotoIndex(index);
|
getBrowser().gotoIndex(index);
|
||||||
}
|
}
|
||||||
catch(ex) {
|
catch(ex) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -1348,7 +1348,7 @@ function BrowserForward(aEvent, aIgnoreAlt)
|
||||||
|
|
||||||
if (where == "current") {
|
if (where == "current") {
|
||||||
try {
|
try {
|
||||||
getWebNavigation().goForward();
|
getBrowser().goForward();
|
||||||
}
|
}
|
||||||
catch(ex) {
|
catch(ex) {
|
||||||
}
|
}
|
||||||
|
@ -1368,7 +1368,7 @@ function BrowserBack(aEvent, aIgnoreAlt)
|
||||||
|
|
||||||
if (where == "current") {
|
if (where == "current") {
|
||||||
try {
|
try {
|
||||||
getWebNavigation().goBack();
|
getBrowser().goBack();
|
||||||
}
|
}
|
||||||
catch(ex) {
|
catch(ex) {
|
||||||
}
|
}
|
||||||
|
@ -1611,7 +1611,7 @@ function loadURI(uri, referrer, postData, allowThirdPartyFixup)
|
||||||
if (allowThirdPartyFixup) {
|
if (allowThirdPartyFixup) {
|
||||||
flags = nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP;
|
flags = nsIWebNavigation.LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP;
|
||||||
}
|
}
|
||||||
getWebNavigation().loadURI(uri, flags, referrer, postData, null);
|
getBrowser().loadURIWithFlags(uri, flags, referrer, null, postData);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3475,10 +3475,6 @@ nsBrowserStatusHandler.prototype =
|
||||||
this.reloadSkipCacheCommand.removeAttribute("disabled");
|
this.reloadSkipCacheCommand.removeAttribute("disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
// The document loaded correctly, clear the value if we should
|
|
||||||
if (browser.userTypedClear > 0 && aRequest)
|
|
||||||
browser.userTypedValue = null;
|
|
||||||
|
|
||||||
if (!gBrowser.mTabbedMode && aWebProgress.isLoadingDocument)
|
if (!gBrowser.mTabbedMode && aWebProgress.isLoadingDocument)
|
||||||
gBrowser.setIcon(gBrowser.mCurrentTab, null);
|
gBrowser.setIcon(gBrowser.mCurrentTab, null);
|
||||||
|
|
||||||
|
@ -3719,13 +3715,6 @@ nsBrowserStatusHandler.prototype =
|
||||||
|
|
||||||
startDocumentLoad : function(aRequest)
|
startDocumentLoad : function(aRequest)
|
||||||
{
|
{
|
||||||
// It's okay to clear what the user typed when we start
|
|
||||||
// loading a document. If the user types, this counter gets
|
|
||||||
// set to zero, if the document load ends without an
|
|
||||||
// onLocationChange, this counter gets decremented
|
|
||||||
// (so we keep it while switching tabs after failed loads)
|
|
||||||
getBrowser().userTypedClear++;
|
|
||||||
|
|
||||||
// clear out feed data
|
// clear out feed data
|
||||||
gBrowser.mCurrentBrowser.feeds = null;
|
gBrowser.mCurrentBrowser.feeds = null;
|
||||||
|
|
||||||
|
@ -3744,11 +3733,6 @@ nsBrowserStatusHandler.prototype =
|
||||||
|
|
||||||
endDocumentLoad : function(aRequest, aStatus)
|
endDocumentLoad : function(aRequest, aStatus)
|
||||||
{
|
{
|
||||||
// The document is done loading, we no longer want the
|
|
||||||
// value cleared.
|
|
||||||
if (getBrowser().userTypedClear > 0)
|
|
||||||
getBrowser().userTypedClear--;
|
|
||||||
|
|
||||||
const nsIChannel = Components.interfaces.nsIChannel;
|
const nsIChannel = Components.interfaces.nsIChannel;
|
||||||
var urlStr = aRequest.QueryInterface(nsIChannel).originalURI.spec;
|
var urlStr = aRequest.QueryInterface(nsIChannel).originalURI.spec;
|
||||||
|
|
||||||
|
@ -3856,8 +3840,8 @@ nsBrowserAccess.prototype =
|
||||||
.QueryInterface(Ci.nsIInterfaceRequestor)
|
.QueryInterface(Ci.nsIInterfaceRequestor)
|
||||||
.getInterface(Ci.nsIDOMWindow);
|
.getInterface(Ci.nsIDOMWindow);
|
||||||
if (aURI) {
|
if (aURI) {
|
||||||
getWebNavigation().loadURI(aURI.spec, loadflags, null,
|
gBrowser.loadURIWithFlags(aURI.spec, loadflags, null,
|
||||||
null, null);
|
null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!gPrefService.getBoolPref("browser.tabs.loadDivertedInBackground"))
|
if(!gPrefService.getBoolPref("browser.tabs.loadDivertedInBackground"))
|
||||||
|
|
|
@ -344,8 +344,11 @@
|
||||||
// set to zero, if the document load ends without an
|
// set to zero, if the document load ends without an
|
||||||
// onLocationChange, this counter gets decremented
|
// onLocationChange, this counter gets decremented
|
||||||
// (so we keep it while switching tabs after failed loads)
|
// (so we keep it while switching tabs after failed loads)
|
||||||
|
// We need to add 2 because loadURIWithFlags may have
|
||||||
|
// cancelled a pending load which would have cleared
|
||||||
|
// its anchor scroll detection temporary increment.
|
||||||
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow)
|
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow)
|
||||||
this.mBrowser.userTypedClear++;
|
this.mBrowser.userTypedClear += 2;
|
||||||
|
|
||||||
if (!this.mBlank) {
|
if (!this.mBlank) {
|
||||||
this.mTab.setAttribute("busy", "true");
|
this.mTab.setAttribute("busy", "true");
|
||||||
|
@ -361,7 +364,9 @@
|
||||||
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow) {
|
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow) {
|
||||||
// The document is done loading, we no longer want the
|
// The document is done loading, we no longer want the
|
||||||
// value cleared.
|
// value cleared.
|
||||||
if (this.mBrowser.userTypedClear > 0)
|
if (this.mBrowser.userTypedClear > 1)
|
||||||
|
this.mBrowser.userTypedClear -= 2;
|
||||||
|
else if (this.mBrowser.userTypedClear > 0)
|
||||||
this.mBrowser.userTypedClear--;
|
this.mBrowser.userTypedClear--;
|
||||||
|
|
||||||
if (!this.mBrowser.mIconURL)
|
if (!this.mBrowser.mIconURL)
|
||||||
|
@ -411,7 +416,7 @@
|
||||||
onLocationChange : function(aWebProgress, aRequest, aLocation)
|
onLocationChange : function(aWebProgress, aRequest, aLocation)
|
||||||
{
|
{
|
||||||
// The document loaded correctly, clear the value if we should
|
// The document loaded correctly, clear the value if we should
|
||||||
if (this.mBrowser.userTypedClear > 0 && aRequest)
|
if (this.mBrowser.userTypedClear > 0)
|
||||||
this.mBrowser.userTypedValue = null;
|
this.mBrowser.userTypedValue = null;
|
||||||
|
|
||||||
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow &&
|
if (aWebProgress.DOMWindow == this.mBrowser.contentWindow &&
|
||||||
|
|
|
@ -89,8 +89,15 @@
|
||||||
<body>
|
<body>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
var webNavigation = this.webNavigation;
|
var webNavigation = this.webNavigation;
|
||||||
if (webNavigation.canGoBack)
|
if (webNavigation.canGoBack) {
|
||||||
webNavigation.goBack();
|
try {
|
||||||
|
this.userTypedClear++;
|
||||||
|
webNavigation.goBack();
|
||||||
|
} finally {
|
||||||
|
if (this.userTypedClear)
|
||||||
|
this.userTypedClear--;
|
||||||
|
}
|
||||||
|
}
|
||||||
]]>
|
]]>
|
||||||
</body>
|
</body>
|
||||||
</method>
|
</method>
|
||||||
|
@ -99,8 +106,15 @@
|
||||||
<body>
|
<body>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
var webNavigation = this.webNavigation;
|
var webNavigation = this.webNavigation;
|
||||||
if (webNavigation.canGoForward)
|
if (webNavigation.canGoForward) {
|
||||||
webNavigation.goForward();
|
try {
|
||||||
|
this.userTypedClear++;
|
||||||
|
webNavigation.goForward();
|
||||||
|
} finally {
|
||||||
|
if (this.userTypedClear)
|
||||||
|
this.userTypedClear--;
|
||||||
|
}
|
||||||
|
}
|
||||||
]]>
|
]]>
|
||||||
</body>
|
</body>
|
||||||
</method>
|
</method>
|
||||||
|
@ -168,7 +182,13 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.mIconURL = null;
|
this.mIconURL = null;
|
||||||
this.webNavigation.loadURI(aURI, aFlags, aReferrerURI, aPostData, null);
|
try {
|
||||||
|
this.userTypedClear++;
|
||||||
|
this.webNavigation.loadURI(aURI, aFlags, aReferrerURI, aPostData, null);
|
||||||
|
} finally {
|
||||||
|
if (this.userTypedClear)
|
||||||
|
this.userTypedClear--;
|
||||||
|
}
|
||||||
]]>
|
]]>
|
||||||
</body>
|
</body>
|
||||||
</method>
|
</method>
|
||||||
|
@ -210,7 +230,13 @@
|
||||||
<parameter name="aIndex"/>
|
<parameter name="aIndex"/>
|
||||||
<body>
|
<body>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
this.webNavigation.gotoIndex(aIndex);
|
try {
|
||||||
|
this.userTypedClear++;
|
||||||
|
this.webNavigation.gotoIndex(aIndex);
|
||||||
|
} finally {
|
||||||
|
if (this.userTypedClear)
|
||||||
|
this.userTypedClear--;
|
||||||
|
}
|
||||||
]]>
|
]]>
|
||||||
</body>
|
</body>
|
||||||
</method>
|
</method>
|
||||||
|
@ -535,6 +561,45 @@
|
||||||
</setter>
|
</setter>
|
||||||
</property>
|
</property>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This field tracks the location bar state. The value that the user typed
|
||||||
|
in to the location bar may not be changed while this field is zero.
|
||||||
|
However invoking a load will temporarily increase this field to allow
|
||||||
|
the location bar to be updated to the new URL.
|
||||||
|
|
||||||
|
Case 1: Anchor scroll
|
||||||
|
The user appends the anchor to the URL. This sets the location bar
|
||||||
|
into typed state, and disables changes to the location bar. The user
|
||||||
|
then requests the scroll. loadURIWithFlags temporarily increases the
|
||||||
|
flag by 1 so that the anchor scroll's location change resets the
|
||||||
|
location bar state.
|
||||||
|
|
||||||
|
Case 2: Interrupted load
|
||||||
|
The user types in and submits the URL. This triggers an asynchronous
|
||||||
|
network load which increases the flag by 2. (The temporary increase
|
||||||
|
from loadURIWithFlags is not noticeable in this case.) When the load
|
||||||
|
is interrupted the flag returns to zero, and the location bar stays
|
||||||
|
in typed state.
|
||||||
|
|
||||||
|
Case 3: New load
|
||||||
|
This works like case 2, but as the load is not interrupted the
|
||||||
|
location changes while the flag is still 2 thus resetting the
|
||||||
|
location bar state.
|
||||||
|
|
||||||
|
Case 4: Corrected load
|
||||||
|
This is a combination of case 2 and case 3, except that the original
|
||||||
|
load is interrupted by the new load. Normally cancelling and starting
|
||||||
|
a new load would reset the flag to 0 and then increase it to 2 again.
|
||||||
|
However both actions occur as a consequence of the loadURIWithFlags
|
||||||
|
invocation, which adds its temporary increase in to the mix. Since
|
||||||
|
the new URL would have been typed in the flag would have been reset
|
||||||
|
before loadURIWithFlags incremented it. The interruption resets the
|
||||||
|
flag to 0 and increases it to 2. Although loadURIWithFlags will
|
||||||
|
decrement the flag it remains at 1 thus allowing the location bar
|
||||||
|
state to be reset when the new load changes the location.
|
||||||
|
This case also applies when loading into a new browser, as this
|
||||||
|
interrupts the default load of about:blank.
|
||||||
|
-->
|
||||||
<field name="userTypedClear">
|
<field name="userTypedClear">
|
||||||
1
|
1
|
||||||
</field>
|
</field>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче