| Index: chrome/browser/resources/ntp4/card_slider.js
|
| diff --git a/chrome/browser/resources/ntp4/card_slider.js b/chrome/browser/resources/ntp4/card_slider.js
|
| deleted file mode 100644
|
| index ebe0cb60b2482f0b6c2cdb52e8dd5cfe3cbd79bb..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/ntp4/card_slider.js
|
| +++ /dev/null
|
| @@ -1,459 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -/**
|
| - * @fileoverview Card slider implementation. Allows you to create interactions
|
| - * that have items that can slide left to right to reveal additional items.
|
| - * Works by adding the necessary event handlers to a specific DOM structure
|
| - * including a frame, container and cards.
|
| - * - The frame defines the boundary of one item. Each card will be expanded to
|
| - * fill the width of the frame. This element is also overflow hidden so that
|
| - * the additional items left / right do not trigger horizontal scrolling.
|
| - * - The container is what all the touch events are attached to. This element
|
| - * will be expanded to be the width of all cards.
|
| - * - The cards are the individual viewable items. There should be one card for
|
| - * each item in the list. Only one card will be visible at a time. Two cards
|
| - * will be visible while you are transitioning between cards.
|
| - *
|
| - * This class is designed to work well on any hardware-accelerated touch device.
|
| - * It should still work on pre-hardware accelerated devices it just won't feel
|
| - * very good. It should also work well with a mouse.
|
| - */
|
| -
|
| -
|
| -// Use an anonymous function to enable strict mode just for this file (which
|
| -// will be concatenated with other files when embedded in Chrome
|
| -var CardSlider = (function() {
|
| - 'use strict';
|
| -
|
| - /**
|
| - * @constructor
|
| - * @param {!Element} frame The bounding rectangle that cards are visible in.
|
| - * @param {!Element} container The surrounding element that will have event
|
| - * listeners attached to it.
|
| - * @param {number} cardWidth The width of each card should have.
|
| - */
|
| - function CardSlider(frame, container, cardWidth) {
|
| - /**
|
| - * @type {!Element}
|
| - * @private
|
| - */
|
| - this.frame_ = frame;
|
| -
|
| - /**
|
| - * @type {!Element}
|
| - * @private
|
| - */
|
| - this.container_ = container;
|
| -
|
| - /**
|
| - * Array of card elements.
|
| - * @type {!Array.<!Element>}
|
| - * @private
|
| - */
|
| - this.cards_ = [];
|
| -
|
| - /**
|
| - * Index of currently shown card.
|
| - * @type {number}
|
| - * @private
|
| - */
|
| - this.currentCard_ = 0;
|
| -
|
| - /**
|
| - * @type {number}
|
| - * @private
|
| - */
|
| - this.cardWidth_ = cardWidth;
|
| -
|
| - /**
|
| - * @type {!TouchHandler}
|
| - * @private
|
| - */
|
| - this.touchHandler_ = new TouchHandler(this.container_);
|
| -
|
| - }
|
| -
|
| - /**
|
| - * Events fired by the slider.
|
| - * Events are fired at the container.
|
| - */
|
| - CardSlider.EventType = {
|
| - // Fired when the user slides to another card.
|
| - CARD_CHANGED: 'cardSlider:card_changed'
|
| - };
|
| -
|
| -
|
| - /**
|
| - * The time to transition between cards when animating. Measured in ms.
|
| - * @type {number}
|
| - * @private
|
| - * @const
|
| - */
|
| - CardSlider.TRANSITION_TIME_ = 200;
|
| -
|
| -
|
| - /**
|
| - * The minimum velocity required to transition cards if they did not drag past
|
| - * the halfway point between cards. Measured in pixels / ms.
|
| - * @type {number}
|
| - * @private
|
| - * @const
|
| - */
|
| - CardSlider.TRANSITION_VELOCITY_THRESHOLD_ = 0.2;
|
| -
|
| -
|
| - CardSlider.prototype = {
|
| - /**
|
| - * The current left offset of the container relative to the frame.
|
| - * @type {number}
|
| - * @private
|
| - */
|
| - currentLeft_: 0,
|
| -
|
| - /**
|
| - * Initialize all elements and event handlers. Must call after construction
|
| - * and before usage.
|
| - */
|
| - initialize: function() {
|
| - var view = this.container_.ownerDocument.defaultView;
|
| - assert(view.getComputedStyle(this.container_).display == '-webkit-box',
|
| - 'Container should be display -webkit-box.');
|
| - assert(view.getComputedStyle(this.frame_).overflow == 'hidden',
|
| - 'Frame should be overflow hidden.');
|
| - assert(view.getComputedStyle(this.container_).position == 'static',
|
| - 'Container should be position static.');
|
| -
|
| - this.updateCardWidths_();
|
| -
|
| - this.mouseWheelScrollAmount_ = 0;
|
| - this.mouseWheelCardSelected_ = false;
|
| - this.mouseWheelIsContinuous_ = false;
|
| - this.scrollClearTimeout_ = null;
|
| - this.frame_.addEventListener('mousewheel',
|
| - this.onMouseWheel_.bind(this));
|
| -
|
| - if (document.documentElement.getAttribute('touchui')) {
|
| - this.container_.addEventListener(TouchHandler.EventType.TOUCH_START,
|
| - this.onTouchStart_.bind(this));
|
| - this.container_.addEventListener(TouchHandler.EventType.DRAG_START,
|
| - this.onDragStart_.bind(this));
|
| - this.container_.addEventListener(TouchHandler.EventType.DRAG_MOVE,
|
| - this.onDragMove_.bind(this));
|
| - this.container_.addEventListener(TouchHandler.EventType.DRAG_END,
|
| - this.onDragEnd_.bind(this));
|
| -
|
| - this.touchHandler_.enable(/* opt_capture */ false);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Use in cases where the width of the frame has changed in order to update
|
| - * the width of cards. For example should be used when orientation changes
|
| - * in full width sliders.
|
| - * @param {number} newCardWidth Width all cards should have, in pixels.
|
| - */
|
| - resize: function(newCardWidth) {
|
| - if (newCardWidth != this.cardWidth_) {
|
| - this.cardWidth_ = newCardWidth;
|
| -
|
| - this.updateCardWidths_();
|
| -
|
| - // Must upate the transform on the container to show the correct card.
|
| - this.transformToCurrentCard_();
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Sets the cards used. Can be called more than once to switch card sets.
|
| - * @param {!Array.<!Element>} cards The individual viewable cards.
|
| - * @param {number} index Index of the card to in the new set of cards to
|
| - * navigate to.
|
| - */
|
| - setCards: function(cards, index) {
|
| - assert(index >= 0 && index < cards.length,
|
| - 'Invalid index in CardSlider#setCards');
|
| - this.cards_ = cards;
|
| -
|
| - this.updateCardWidths_();
|
| -
|
| - // Jump to the given card index.
|
| - this.selectCard(index);
|
| - },
|
| -
|
| - /**
|
| - * Updates the width of each card.
|
| - * @private
|
| - */
|
| - updateCardWidths_: function() {
|
| - for (var i = 0, card; card = this.cards_[i]; i++)
|
| - card.style.width = this.cardWidth_ + 'px';
|
| - },
|
| -
|
| - /**
|
| - * Returns the index of the current card.
|
| - * @return {number} index of the current card.
|
| - */
|
| - get currentCard() {
|
| - return this.currentCard_;
|
| - },
|
| -
|
| - /**
|
| - * Allows setting the current card index.
|
| - * @param {number} index A new index to set the current index to.
|
| - * @return {number} The new index after having been set.
|
| - */
|
| - set currentCard(index) {
|
| - return (this.currentCard_ = index);
|
| - },
|
| -
|
| - /**
|
| - * Returns the number of cards.
|
| - * @return {number} number of cards.
|
| - */
|
| - get cardCount() {
|
| - return this.cards_.length;
|
| - },
|
| -
|
| - /**
|
| - * Returns the current card itself.
|
| - * @return {!Element} the currently shown card.
|
| - */
|
| - get currentCardValue() {
|
| - return this.cards_[this.currentCard_];
|
| - },
|
| -
|
| - /**
|
| - * Handle horizontal scrolls to flip between pages.
|
| - * @private
|
| - */
|
| - onMouseWheel_: function(e) {
|
| - if (e.wheelDeltaX == 0)
|
| - return;
|
| -
|
| - // Prevent OS X 10.7+ history swiping on the NTP.
|
| - e.preventDefault();
|
| -
|
| - // Continuous devices such as an Apple Touchpad or Apple MagicMouse will
|
| - // send arbitrary delta values. Conversly, standard mousewheels will
|
| - // send delta values in increments of 120. (There is of course a small
|
| - // chance we mistake a continuous device for a non-continuous device.
|
| - // Unfortunately there isn't a better way to do this until real touch
|
| - // events are available to desktop clients.)
|
| - var DISCRETE_DELTA = 120;
|
| - if (e.wheelDeltaX % DISCRETE_DELTA)
|
| - this.mouseWheelIsContinuous_ = true;
|
| -
|
| - if (this.mouseWheelIsContinuous_) {
|
| - // For continuous devices, detect a page swipe when the accumulated
|
| - // delta matches a pre-defined threshhold. After changing the page,
|
| - // ignore wheel events for a short time before repeating this process.
|
| - if (this.mouseWheelCardSelected_) return;
|
| - this.mouseWheelScrollAmount_ += e.wheelDeltaX;
|
| - if (Math.abs(this.mouseWheelScrollAmount_) >= 600) {
|
| - var pagesToScroll = this.mouseWheelScrollAmount_ > 0 ? 1 : -1;
|
| - if (!ntp4.isRTL())
|
| - pagesToScroll *= -1;
|
| - var newCardIndex = this.currentCard + pagesToScroll;
|
| - newCardIndex = Math.min(this.cards_.length - 1,
|
| - Math.max(0, newCardIndex));
|
| - this.selectCard(newCardIndex, true);
|
| - this.mouseWheelCardSelected_ = true;
|
| - }
|
| - } else {
|
| - // For discrete devices, consider each wheel tick a page change.
|
| - var pagesToScroll = e.wheelDeltaX / DISCRETE_DELTA;
|
| - if (!ntp4.isRTL())
|
| - pagesToScroll *= -1;
|
| - var newCardIndex = this.currentCard + pagesToScroll;
|
| - newCardIndex = Math.min(this.cards_.length - 1,
|
| - Math.max(0, newCardIndex));
|
| - this.selectCard(newCardIndex, true);
|
| - }
|
| -
|
| - // We got a mouse wheel event, so cancel any pending scroll wheel timeout.
|
| - if (this.scrollClearTimeout_ != null)
|
| - clearTimeout(this.scrollClearTimeout_);
|
| - // If we didn't use up all the scroll, hold onto it for a little bit, but
|
| - // drop it after a delay.
|
| - if (this.mouseWheelScrollAmount_ != 0) {
|
| - this.scrollClearTimeout_ =
|
| - setTimeout(this.clearMouseWheelScroll_.bind(this), 500);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Resets the amount of horizontal scroll we've seen to 0. See
|
| - * onMouseWheel_.
|
| - * @private
|
| - */
|
| - clearMouseWheelScroll_: function() {
|
| - this.mouseWheelScrollAmount_ = 0;
|
| - this.mouseWheelCardSelected_ = false;
|
| - },
|
| -
|
| - /**
|
| - * Selects a new card, ensuring that it is a valid index, transforming the
|
| - * view and possibly calling the change card callback.
|
| - * @param {number} newCardIndex Index of card to show.
|
| - * @param {boolean=} opt_animate If true will animate transition from
|
| - * current position to new position.
|
| - */
|
| - selectCard: function(newCardIndex, opt_animate) {
|
| - var previousCard = this.currentCardValue;
|
| -
|
| - var isChangingCard =
|
| - !this.cards_[newCardIndex].classList.contains('selected-card');
|
| -
|
| - if (isChangingCard) {
|
| - previousCard.classList.remove('selected-card');
|
| - // If we have a new card index and it is valid then update the left
|
| - // position and current card index.
|
| - this.currentCard_ = newCardIndex;
|
| - this.currentCardValue.classList.add('selected-card');
|
| - }
|
| -
|
| - this.transformToCurrentCard_(opt_animate);
|
| -
|
| - if (isChangingCard) {
|
| - var event = document.createEvent('Event');
|
| - event.initEvent(CardSlider.EventType.CARD_CHANGED, true, true);
|
| - event.cardSlider = this;
|
| - this.container_.dispatchEvent(event);
|
| -
|
| - // We also dispatch an event on the cards themselves.
|
| - if (previousCard) {
|
| - cr.dispatchSimpleEvent(previousCard, 'carddeselected',
|
| - true, true);
|
| - }
|
| - cr.dispatchSimpleEvent(this.currentCardValue, 'cardselected',
|
| - true, true);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * Selects a card from the stack. Passes through to selectCard.
|
| - * @param {Node} newCard The card that should be selected.
|
| - * @param {boolean=} opt_animate Whether to animate.
|
| - */
|
| - selectCardByValue: function(newCard, opt_animate) {
|
| - var i = this.cards_.indexOf(newCard);
|
| - assert(i != -1);
|
| - this.selectCard(i, opt_animate);
|
| - },
|
| -
|
| - /**
|
| - * Centers the view on the card denoted by this.currentCard. Can either
|
| - * animate to that card or snap to it.
|
| - * @param {boolean=} opt_animate If true will animate transition from
|
| - * current position to new position.
|
| - * @private
|
| - */
|
| - transformToCurrentCard_: function(opt_animate) {
|
| - this.currentLeft_ = -this.cardWidth_ *
|
| - (ntp4.isRTL() ? this.cards_.length - this.currentCard - 1 :
|
| - this.currentCard);
|
| -
|
| - // Animate to the current card, which will either transition if the
|
| - // current card is new, or reset the existing card if we didn't drag
|
| - // enough to change cards.
|
| - var transition = '';
|
| - if (opt_animate) {
|
| - transition = '-webkit-transform ' + CardSlider.TRANSITION_TIME_ +
|
| - 'ms ease-in-out';
|
| - }
|
| - this.container_.style.WebkitTransition = transition;
|
| - this.translateTo_(this.currentLeft_);
|
| - },
|
| -
|
| - /**
|
| - * Moves the view to the specified position.
|
| - * @param {number} x Horizontal position to move to.
|
| - * @private
|
| - */
|
| - translateTo_: function(x) {
|
| - // We use a webkitTransform to slide because this is GPU accelerated on
|
| - // Chrome and iOS. Once Chrome does GPU acceleration on the position
|
| - // fixed-layout elements we could simply set the element's position to
|
| - // fixed and modify 'left' instead.
|
| - this.container_.style.WebkitTransform = 'translate3d(' + x + 'px, 0, 0)';
|
| - },
|
| -
|
| - /* Touch ******************************************************************/
|
| -
|
| - /**
|
| - * Clear any transition that is in progress and enable dragging for the
|
| - * touch.
|
| - * @param {!TouchHandler.Event} e The TouchHandler event.
|
| - * @private
|
| - */
|
| - onTouchStart_: function(e) {
|
| - this.container_.style.WebkitTransition = '';
|
| - e.enableDrag = true;
|
| - },
|
| -
|
| - /**
|
| - * Tell the TouchHandler that dragging is acceptable when the user begins by
|
| - * scrolling horizontally.
|
| - * @param {!TouchHandler.Event} e The TouchHandler event.
|
| - * @private
|
| - */
|
| - onDragStart_: function(e) {
|
| - e.enableDrag = Math.abs(e.dragDeltaX) > Math.abs(e.dragDeltaY);
|
| - },
|
| -
|
| - /**
|
| - * On each drag move event reposition the container appropriately so the
|
| - * cards look like they are sliding.
|
| - * @param {!TouchHandler.Event} e The TouchHandler event.
|
| - * @private
|
| - */
|
| - onDragMove_: function(e) {
|
| - var deltaX = e.dragDeltaX;
|
| - // If dragging beyond the first or last card then apply a backoff so the
|
| - // dragging feels stickier than usual.
|
| - if (!this.currentCard && deltaX > 0 ||
|
| - this.currentCard == (this.cards_.length - 1) && deltaX < 0) {
|
| - deltaX /= 2;
|
| - }
|
| - this.translateTo_(this.currentLeft_ + deltaX);
|
| - },
|
| -
|
| - /**
|
| - * On drag end events we may want to transition to another card, depending
|
| - * on the ending position of the drag and the velocity of the drag.
|
| - * @param {!TouchHandler.Event} e The TouchHandler event.
|
| - * @private
|
| - */
|
| - onDragEnd_: function(e) {
|
| - var deltaX = e.dragDeltaX;
|
| - var velocity = this.touchHandler_.getEndVelocity().x;
|
| - var newX = this.currentLeft_ + deltaX;
|
| - var newCardIndex = Math.round(-newX / this.cardWidth_);
|
| -
|
| - if (newCardIndex == this.currentCard && Math.abs(velocity) >
|
| - CardSlider.TRANSITION_VELOCITY_THRESHOLD_) {
|
| - // If the drag wasn't far enough to change cards but the velocity was
|
| - // high enough to transition anyways. If the velocity is to the left
|
| - // (negative) then the user wishes to go right (card +1).
|
| - newCardIndex += velocity > 0 ? -1 : 1;
|
| - }
|
| -
|
| - this.selectCard(newCardIndex, /* animate */ true);
|
| - },
|
| -
|
| - /**
|
| - * Cancel any current touch/slide as if we saw a touch end
|
| - */
|
| - cancelTouch: function() {
|
| - // Stop listening to any current touch
|
| - this.touchHandler_.cancelTouch();
|
| -
|
| - // Ensure we're at a card bounary
|
| - this.transformToCurrentCard_(true);
|
| - },
|
| - };
|
| -
|
| - return CardSlider;
|
| -})();
|
|
|