Use urlbarChangeTracker instead of userTypedClear to track address bar changes

This commit is contained in:
JustOff 2018-04-28 14:41:28 +03:00 • committed by Roy Tam
commit ce9848de49
2 changed files with 20 additions and 29 deletions

View file

@ -570,6 +570,12 @@
const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener; const nsIWebProgressListener = Components.interfaces.nsIWebProgressListener;
const nsIChannel = Components.interfaces.nsIChannel; const nsIChannel = Components.interfaces.nsIChannel;
let location, originalLocation;
try {
aRequest.QueryInterface(nsIChannel)
location = aRequest.URI;
originalLocation = aRequest.originalURI;
} catch (ex) {}
if (aStateFlags & nsIWebProgressListener.STATE_START) { if (aStateFlags & nsIWebProgressListener.STATE_START) {
this.mRequestCount++; this.mRequestCount++;
@ -588,16 +594,8 @@
if (aStateFlags & nsIWebProgressListener.STATE_START && if (aStateFlags & nsIWebProgressListener.STATE_START &&
aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) { aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
// 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)
// 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.isTopLevel) if (aWebProgress.isTopLevel)
this.mBrowser.userTypedClear += 2; this.mBrowser.urlbarChangeTracker.startedLoad();
if (this._shouldShowProgress(aRequest)) { if (this._shouldShowProgress(aRequest)) {
if (!(aStateFlags & nsIWebProgressListener.STATE_RESTORING)) { if (!(aStateFlags & nsIWebProgressListener.STATE_RESTORING)) {
@ -625,8 +623,8 @@
this.mTab.removeAttribute("progress"); this.mTab.removeAttribute("progress");
if (aWebProgress.isTopLevel) { if (aWebProgress.isTopLevel) {
if (!Components.isSuccessCode(aStatus) && let isSuccessful = Components.isSuccessCode(aStatus);
!isTabEmpty(this.mTab)) { if (!isSuccessful && !isTabEmpty(this.mTab)) {
// Restore the current document's location in case the // Restore the current document's location in case the
// request was stopped (possibly from a content script) // request was stopped (possibly from a content script)
// before the location changed. // before the location changed.
@ -635,14 +633,8 @@
if (this.mTab.selected && gURLBar) if (this.mTab.selected && gURLBar)
URLBarSetURI(); URLBarSetURI();
} else { } else if (isSuccessful) {
// The document is done loading, we no longer want the this.mBrowser.urlbarChangeTracker.finishedLoad();
// value cleared.
if (this.mBrowser.userTypedClear > 1)
this.mBrowser.userTypedClear -= 2;
else if (this.mBrowser.userTypedClear > 0)
this.mBrowser.userTypedClear--;
} }
if (!this.mBrowser.mIconURL) if (!this.mBrowser.mIconURL)
@ -652,8 +644,6 @@
if (this.mBlank) if (this.mBlank)
this.mBlank = false; this.mBlank = false;
var location = aRequest.QueryInterface(nsIChannel).URI;
// For keyword URIs clear the user typed value since they will be changed into real URIs // For keyword URIs clear the user typed value since they will be changed into real URIs
if (location.scheme == "keyword") if (location.scheme == "keyword")
this.mBrowser.userTypedValue = null; this.mBrowser.userTypedValue = null;
@ -696,13 +686,12 @@
let topLevel = aWebProgress.isTopLevel; let topLevel = aWebProgress.isTopLevel;
if (topLevel) { if (topLevel) {
// If userTypedClear > 0, the document loaded correctly and we should be // We need to clear the typed value
// clearing the user typed value. We also need to clear the typed value
// if the document failed to load, to make sure the urlbar reflects the // if the document failed to load, to make sure the urlbar reflects the
// failed URI (particularly for SSL errors). However, don't clear the value // failed URI (particularly for SSL errors). However, don't clear the value
// if the error page's URI is about:blank, because that causes complete // if the error page's URI is about:blank, because that causes complete
// loss of urlbar contents for invalid URI errors (see bug 867957). // loss of urlbar contents for invalid URI errors (see bug 867957).
if (this.mBrowser.userTypedClear > 0 || if (this.mBrowser.didStartLoadSinceLastUserTyping() ||
((aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) && ((aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) &&
aLocation.spec != "about:blank")) aLocation.spec != "about:blank"))
this.mBrowser.userTypedValue = null; this.mBrowser.userTypedValue = null;
@ -3027,10 +3016,6 @@
]]></body> ]]></body>
</method> </method>
<property name="userTypedClear"
onget="return this.mCurrentBrowser.userTypedClear;"
onset="return this.mCurrentBrowser.userTypedClear = val;"/>
<property name="userTypedValue" <property name="userTypedValue"
onget="return this.mCurrentBrowser.userTypedValue;" onget="return this.mCurrentBrowser.userTypedValue;"
onset="return this.mCurrentBrowser.userTypedValue = val;"/> onset="return this.mCurrentBrowser.userTypedValue = val;"/>

View file

@ -1951,7 +1951,13 @@ var SessionStoreInternal = {
// userTypedValue. // userTypedValue.
if (browser.userTypedValue) { if (browser.userTypedValue) {
tabData.userTypedValue = browser.userTypedValue; tabData.userTypedValue = browser.userTypedValue;
tabData.userTypedClear = browser.userTypedClear; // We always used to keep track of the loading state as an integer, where
// '0' indicated the user had typed since the last load (or no load was
// ongoing), and any positive value indicated we had started a load since
// the last time the user typed in the URL bar. Mimic this to keep the
// session store representation in sync, even though we now represent this
// more explicitly:
tabData.userTypedClear = browser.didStartLoadSinceLastUserTyping() ? 1 : 0;
} else { } else {
delete tabData.userTypedValue; delete tabData.userTypedValue;
delete tabData.userTypedClear; delete tabData.userTypedClear;