/*
 * 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
  }-*/;
}
