blob: 720356f49f522fde7f946e818537bb3a12bbc13e [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.user.client.impl;
/**
* History implementation for Mozilla-based browsers.
*/
class HistoryImplMozilla extends HistoryImplTimer {
@Override
protected String decodeFragment(String encodedFragment) {
// IE11 chooses the firefox permutation
// make sure we use the code from HistoryImpl instead of relying on FF behaviour
if (isIE11()) {
return super.decodeFragment(encodedFragment);
}
// Mozilla browsers pre-decode the result of location.hash, so there's no
// need to decode it again (which would in fact be incorrect).
return encodedFragment;
}
/**
* When the historyToken is blank or null, we are not able to set
* $wnd.location.hash to the empty string, due to a bug in Mozilla. Every time
* $wnd.location.hash is set to the empty string, one of the characters at the
* end of the URL stored in $wnd.location is 'eaten'. To get around this bug,
* we generate the module's URL, and we append a '#' character onto the end.
* Without the '#' character at the end of the URL, Mozilla would reload the
* page from the server.
*/
@Override
protected native void nativeUpdate(String historyToken) /*-{
if (historyToken.length == 0) {
var s = $wnd.location.href;
// Pull off any hash.
var i = s.indexOf('#');
if (i != -1)
s = s.substring(0, i);
$wnd.location = s + '#';
} else {
$wnd.location.hash = this.@com.google.gwt.user.client.impl.HistoryImpl::encodeFragment(Ljava/lang/String;)(historyToken);
}
}-*/;
private native boolean isIE11() /*-{
return $wnd.navigator.userAgent.indexOf('Trident') != -1
}-*/;
}