UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

147 lines (146 loc) 5.59 kB
/** * DevExtreme (framework/navigation_devices.js) * Version: 18.2.18 * Build date: Tue Oct 18 2022 * * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; require("../integration/jquery"); var $ = require("jquery"), noop = require("../core/utils/common").noop, window = require("../core/utils/window").getWindow(), Class = require("../core/class"), Callbacks = require("../core/utils/callbacks"), browserAdapters = require("./browser_adapters"), SessionStorage = require("../core/utils/storage").sessionStorage, devices = require("../core/devices"); var SESSION_KEY = "dxPhoneJSApplication"; var HistoryBasedNavigationDevice = Class.inherit({ ctor: function(options) { options = options || {}; this._browserAdapter = options.browserAdapter || this._createBrowserAdapter(options); this.uriChanged = Callbacks(); this._browserAdapter.popState.add(this._onPopState.bind(this)) }, init: noop, getUri: function() { return this._browserAdapter.getHash() }, setUri: function(uri, replaceCurrent) { if (replaceCurrent) { return this._browserAdapter.replaceState(uri) } else { if (uri !== this.getUri()) { return this._browserAdapter.pushState(uri) } else { return $.Deferred().resolve().promise() } } }, back: function() { return this._browserAdapter.back() }, _onPopState: function() { this.uriChanged.fire(this.getUri()) }, _isBuggyAndroid2: function() { var realDevice = devices.real(); var version = realDevice.version; return "android" === realDevice.platform && version.length > 1 && (2 === version[0] && version[1] < 4 || version[0] < 2) }, _isBuggyAndroid4: function() { var realDevice = devices.real(); var version = realDevice.version; return "android" === realDevice.platform && version.length > 1 && 4 === version[0] && 0 === version[1] }, _isWindowsPhone8: function() { var realDevice = devices.real(); return "win" === realDevice.platform && realDevice.phone }, _createBrowserAdapter: function(options) { var result, sourceWindow = options.window || window, supportPushReplace = sourceWindow.history.replaceState && sourceWindow.history.pushState; if (this._isWindowsPhone8()) { result = new browserAdapters.BuggyCordovaWP81BrowserAdapter(options) } else { if (sourceWindow !== sourceWindow.top) { result = new browserAdapters.HistorylessBrowserAdapter(options) } else { if (this._isBuggyAndroid4()) { result = new browserAdapters.BuggyAndroidBrowserAdapter(options) } else { if (this._isBuggyAndroid2() || !supportPushReplace) { result = new browserAdapters.OldBrowserAdapter(options) } else { result = new browserAdapters.DefaultBrowserAdapter(options) } } } } return result } }); var StackBasedNavigationDevice = HistoryBasedNavigationDevice.inherit({ ctor: function(options) { this.callBase(options); this.backInitiated = Callbacks(); this._rootStateHandler = null; $(window).on("unload", this._saveBrowserState) }, init: function() { var that = this; if (that._browserAdapter.canWorkInPureBrowser) { return that._initRootPage().done(function() { if (that._browserAdapter.isRootPage()) { that._browserAdapter.pushState("") } }) } else { return $.Deferred().resolve().promise() } }, setUri: function(uri) { return this.callBase(uri, !this._browserAdapter.isRootPage()) }, _saveBrowserState: function() { var sessionStorage = SessionStorage(); if (sessionStorage) { sessionStorage.setItem(SESSION_KEY, true) } }, _initRootPage: function() { var hash = this.getUri(), sessionStorage = SessionStorage(); if (!sessionStorage || sessionStorage.getItem(SESSION_KEY)) { return $.Deferred().resolve().promise() } sessionStorage.removeItem(SESSION_KEY); this._browserAdapter.createRootPage(); return this._browserAdapter.pushState(hash) }, _onPopState: function() { if (this._browserAdapter.isRootPage()) { if (this._rootStateHandler) { this._rootStateHandler() } else { this.backInitiated.fire() } } else { if (!this._rootStateHandler) { this._createRootStateHandler() } this.back() } }, _createRootStateHandler: function() { var uri = this.getUri(); this._rootStateHandler = function() { this.uriChanged.fire(uri); this._rootStateHandler = null } } }); exports.HistoryBasedNavigationDevice = HistoryBasedNavigationDevice; exports.StackBasedNavigationDevice = StackBasedNavigationDevice;