Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4825)

Unified Diff: chrome/browser/resources/md_history/app.crisper.js

Issue 2352293002: MD History: Replace app-route with a custom router (Closed)
Patch Set: Delete stray newline Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/resources/md_history/app.js ('k') | chrome/browser/resources/md_history/app.vulcanized.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/resources/md_history/app.crisper.js
diff --git a/chrome/browser/resources/md_history/app.crisper.js b/chrome/browser/resources/md_history/app.crisper.js
index 39c72ed5189bb4fa38fe12fc5742018e5a5586d8..e6c08baa1f5371681f39411a52f209fb17b4ecca 100644
--- a/chrome/browser/resources/md_history/app.crisper.js
+++ b/chrome/browser/resources/md_history/app.crisper.js
@@ -507,612 +507,49 @@ cr.define('cr.ui', function() {
};
});
-(function() {
- 'use strict';
- Polymer({
- is: 'iron-location',
- properties: {
- path: {
- type: String,
- notify: true,
- value: function() {
- return window.decodeURIComponent(window.location.pathname);
- }
- },
- query: {
- type: String,
- notify: true,
- value: function() {
- return window.decodeURIComponent(window.location.search.slice(1));
- }
- },
- hash: {
- type: String,
- notify: true,
- value: function() {
- return window.decodeURIComponent(window.location.hash.slice(1));
- }
- },
- dwellTime: {
- type: Number,
- value: 2e3
- },
- urlSpaceRegex: {
- type: String,
- value: ''
- },
- _urlSpaceRegExp: {
- computed: '_makeRegExp(urlSpaceRegex)'
- },
- _lastChangedAt: {
- type: Number
- },
- _initialized: {
- type: Boolean,
- value: false
- }
- },
- hostAttributes: {
- hidden: true
- },
- observers: [ '_updateUrl(path, query, hash)' ],
- attached: function() {
- this.listen(window, 'hashchange', '_hashChanged');
- this.listen(window, 'location-changed', '_urlChanged');
- this.listen(window, 'popstate', '_urlChanged');
- this.listen(document.body, 'click', '_globalOnClick');
- this._lastChangedAt = window.performance.now() - (this.dwellTime - 200);
- this._initialized = true;
- this._urlChanged();
- },
- detached: function() {
- this.unlisten(window, 'hashchange', '_hashChanged');
- this.unlisten(window, 'location-changed', '_urlChanged');
- this.unlisten(window, 'popstate', '_urlChanged');
- this.unlisten(document.body, 'click', '_globalOnClick');
- this._initialized = false;
- },
- _hashChanged: function() {
- this.hash = window.decodeURIComponent(window.location.hash.substring(1));
- },
- _urlChanged: function() {
- this._dontUpdateUrl = true;
- this._hashChanged();
- this.path = window.decodeURIComponent(window.location.pathname);
- this.query = window.decodeURIComponent(window.location.search.substring(1));
- this._dontUpdateUrl = false;
- this._updateUrl();
- },
- _getUrl: function() {
- var partiallyEncodedPath = window.encodeURI(this.path).replace(/\#/g, '%23').replace(/\?/g, '%3F');
- var partiallyEncodedQuery = '';
- if (this.query) {
- partiallyEncodedQuery = '?' + window.encodeURI(this.query).replace(/\#/g, '%23');
- }
- var partiallyEncodedHash = '';
- if (this.hash) {
- partiallyEncodedHash = '#' + window.encodeURI(this.hash);
- }
- return partiallyEncodedPath + partiallyEncodedQuery + partiallyEncodedHash;
- },
- _updateUrl: function() {
- if (this._dontUpdateUrl || !this._initialized) {
- return;
- }
- if (this.path === window.decodeURIComponent(window.location.pathname) && this.query === window.decodeURIComponent(window.location.search.substring(1)) && this.hash === window.decodeURIComponent(window.location.hash.substring(1))) {
- return;
- }
- var newUrl = this._getUrl();
- var fullNewUrl = new URL(newUrl, window.location.protocol + '//' + window.location.host).href;
- var now = window.performance.now();
- var shouldReplace = this._lastChangedAt + this.dwellTime > now;
- this._lastChangedAt = now;
- if (shouldReplace) {
- window.history.replaceState({}, '', fullNewUrl);
- } else {
- window.history.pushState({}, '', fullNewUrl);
- }
- this.fire('location-changed', {}, {
- node: window
- });
- },
- _globalOnClick: function(event) {
- if (event.defaultPrevented) {
- return;
- }
- var href = this._getSameOriginLinkHref(event);
- if (!href) {
- return;
- }
- event.preventDefault();
- if (href === window.location.href) {
- return;
- }
- window.history.pushState({}, '', href);
- this.fire('location-changed', {}, {
- node: window
- });
- },
- _getSameOriginLinkHref: function(event) {
- if (event.button !== 0) {
- return null;
- }
- if (event.metaKey || event.ctrlKey) {
- return null;
- }
- var eventPath = Polymer.dom(event).path;
- var anchor = null;
- for (var i = 0; i < eventPath.length; i++) {
- var element = eventPath[i];
- if (element.tagName === 'A' && element.href) {
- anchor = element;
- break;
- }
- }
- if (!anchor) {
- return null;
- }
- if (anchor.target === '_blank') {
- return null;
- }
- if ((anchor.target === '_top' || anchor.target === '_parent') && window.top !== window) {
- return null;
- }
- var href = anchor.href;
- var url;
- if (document.baseURI != null) {
- url = new URL(href, document.baseURI);
- } else {
- url = new URL(href);
- }
- var origin;
- if (window.location.origin) {
- origin = window.location.origin;
- } else {
- origin = window.location.protocol + '//' + window.location.hostname;
- if (window.location.port) {
- origin += ':' + window.location.port;
- }
- }
- if (url.origin !== origin) {
- return null;
- }
- var normalizedHref = url.pathname + url.search + url.hash;
- if (this._urlSpaceRegExp && !this._urlSpaceRegExp.test(normalizedHref)) {
- return null;
- }
- var fullNormalizedHref = new URL(normalizedHref, window.location.href).href;
- return fullNormalizedHref;
- },
- _makeRegExp: function(urlSpaceRegex) {
- return RegExp(urlSpaceRegex);
- }
- });
-})();
-
-'use strict';
-
Polymer({
- is: 'iron-query-params',
+ is: 'iron-media-query',
properties: {
- paramsString: {
+ queryMatches: {
+ type: Boolean,
+ value: false,
+ readOnly: true,
+ notify: true
+ },
+ query: {
type: String,
- notify: true,
- observer: 'paramsStringChanged'
+ observer: 'queryChanged'
},
- paramsObject: {
- type: Object,
- notify: true,
+ full: {
+ type: Boolean,
+ value: false
+ },
+ _boundMQHandler: {
value: function() {
- return {};
+ return this.queryHandler.bind(this);
}
},
- _dontReact: {
- type: Boolean,
- value: false
+ _mq: {
+ value: null
}
},
- hostAttributes: {
- hidden: true
+ attached: function() {
+ this.style.display = 'none';
+ this.queryChanged();
},
- observers: [ 'paramsObjectChanged(paramsObject.*)' ],
- paramsStringChanged: function() {
- this._dontReact = true;
- this.paramsObject = this._decodeParams(this.paramsString);
- this._dontReact = false;
+ detached: function() {
+ this._remove();
},
- paramsObjectChanged: function() {
- if (this._dontReact) {
- return;
+ _add: function() {
+ if (this._mq) {
+ this._mq.addListener(this._boundMQHandler);
}
- this.paramsString = this._encodeParams(this.paramsObject);
},
- _encodeParams: function(params) {
- var encodedParams = [];
- for (var key in params) {
- var value = params[key];
- if (value === '') {
- encodedParams.push(encodeURIComponent(key));
- } else if (value) {
- encodedParams.push(encodeURIComponent(key) + '=' + encodeURIComponent(value.toString()));
- }
+ _remove: function() {
+ if (this._mq) {
+ this._mq.removeListener(this._boundMQHandler);
}
- return encodedParams.join('&');
- },
- _decodeParams: function(paramString) {
- var params = {};
- paramString = (paramString || '').replace(/\+/g, '%20');
- var paramList = paramString.split('&');
- for (var i = 0; i < paramList.length; i++) {
- var param = paramList[i].split('=');
- if (param[0]) {
- params[decodeURIComponent(param[0])] = decodeURIComponent(param[1] || '');
- }
- }
- return params;
- }
-});
-
-'use strict';
-
-Polymer.AppRouteConverterBehavior = {
- properties: {
- route: {
- type: Object,
- notify: true
- },
- queryParams: {
- type: Object,
- notify: true
- },
- path: {
- type: String,
- notify: true
- }
- },
- observers: [ '_locationChanged(path, queryParams)', '_routeChanged(route.prefix, route.path)', '_routeQueryParamsChanged(route.__queryParams)' ],
- created: function() {
- this.linkPaths('route.__queryParams', 'queryParams');
- this.linkPaths('queryParams', 'route.__queryParams');
- },
- _locationChanged: function() {
- if (this.route && this.route.path === this.path && this.queryParams === this.route.__queryParams) {
- return;
- }
- this.route = {
- prefix: '',
- path: this.path,
- __queryParams: this.queryParams
- };
- },
- _routeChanged: function() {
- if (!this.route) {
- return;
- }
- this.path = this.route.prefix + this.route.path;
- },
- _routeQueryParamsChanged: function(queryParams) {
- if (!this.route) {
- return;
- }
- this.queryParams = queryParams;
- }
-};
-
-'use strict';
-
-Polymer({
- is: 'app-location',
- properties: {
- route: {
- type: Object,
- notify: true
- },
- useHashAsPath: {
- type: Boolean,
- value: false
- },
- urlSpaceRegex: {
- type: String,
- notify: true
- },
- __queryParams: {
- type: Object
- },
- __path: {
- type: String
- },
- __query: {
- type: String
- },
- __hash: {
- type: String
- },
- path: {
- type: String,
- observer: '__onPathChanged'
- }
- },
- behaviors: [ Polymer.AppRouteConverterBehavior ],
- observers: [ '__computeRoutePath(useHashAsPath, __hash, __path)' ],
- __computeRoutePath: function() {
- this.path = this.useHashAsPath ? this.__hash : this.__path;
- },
- __onPathChanged: function() {
- if (!this._readied) {
- return;
- }
- if (this.useHashAsPath) {
- this.__hash = this.path;
- } else {
- this.__path = this.path;
- }
- }
-});
-
-'use strict';
-
-Polymer({
- is: 'app-route',
- properties: {
- route: {
- type: Object,
- notify: true
- },
- pattern: {
- type: String
- },
- data: {
- type: Object,
- value: function() {
- return {};
- },
- notify: true
- },
- queryParams: {
- type: Object,
- value: function() {
- return {};
- },
- notify: true
- },
- tail: {
- type: Object,
- value: function() {
- return {
- path: null,
- prefix: null,
- __queryParams: null
- };
- },
- notify: true
- },
- active: {
- type: Boolean,
- notify: true,
- readOnly: true
- },
- _queryParamsUpdating: {
- type: Boolean,
- value: false
- },
- _matched: {
- type: String,
- value: ''
- }
- },
- observers: [ '__tryToMatch(route.path, pattern)', '__updatePathOnDataChange(data.*)', '__tailPathChanged(tail.path)', '__routeQueryParamsChanged(route.__queryParams)', '__tailQueryParamsChanged(tail.__queryParams)', '__queryParamsChanged(queryParams.*)' ],
- created: function() {
- this.linkPaths('route.__queryParams', 'tail.__queryParams');
- this.linkPaths('tail.__queryParams', 'route.__queryParams');
- },
- __routeQueryParamsChanged: function(queryParams) {
- if (queryParams && this.tail) {
- this.set('tail.__queryParams', queryParams);
- if (!this.active || this._queryParamsUpdating) {
- return;
- }
- var copyOfQueryParams = {};
- var anythingChanged = false;
- for (var key in queryParams) {
- copyOfQueryParams[key] = queryParams[key];
- if (anythingChanged || !this.queryParams || queryParams[key] !== this.queryParams[key]) {
- anythingChanged = true;
- }
- }
- for (var key in this.queryParams) {
- if (anythingChanged || !(key in queryParams)) {
- anythingChanged = true;
- break;
- }
- }
- if (!anythingChanged) {
- return;
- }
- this._queryParamsUpdating = true;
- this.set('queryParams', copyOfQueryParams);
- this._queryParamsUpdating = false;
- }
- },
- __tailQueryParamsChanged: function(queryParams) {
- if (queryParams && this.route) {
- this.set('route.__queryParams', queryParams);
- }
- },
- __queryParamsChanged: function(changes) {
- if (!this.active || this._queryParamsUpdating) {
- return;
- }
- this.set('route.__' + changes.path, changes.value);
- },
- __resetProperties: function() {
- this._setActive(false);
- this._matched = null;
- },
- __tryToMatch: function() {
- if (!this.route) {
- return;
- }
- var path = this.route.path;
- var pattern = this.pattern;
- if (!pattern) {
- return;
- }
- if (!path) {
- this.__resetProperties();
- return;
- }
- var remainingPieces = path.split('/');
- var patternPieces = pattern.split('/');
- var matched = [];
- var namedMatches = {};
- for (var i = 0; i < patternPieces.length; i++) {
- var patternPiece = patternPieces[i];
- if (!patternPiece && patternPiece !== '') {
- break;
- }
- var pathPiece = remainingPieces.shift();
- if (!pathPiece && pathPiece !== '') {
- this.__resetProperties();
- return;
- }
- matched.push(pathPiece);
- if (patternPiece.charAt(0) == ':') {
- namedMatches[patternPiece.slice(1)] = pathPiece;
- } else if (patternPiece !== pathPiece) {
- this.__resetProperties();
- return;
- }
- }
- this._matched = matched.join('/');
- var propertyUpdates = {};
- if (!this.active) {
- propertyUpdates.active = true;
- }
- var tailPrefix = this.route.prefix + this._matched;
- var tailPath = remainingPieces.join('/');
- if (remainingPieces.length > 0) {
- tailPath = '/' + tailPath;
- }
- if (!this.tail || this.tail.prefix !== tailPrefix || this.tail.path !== tailPath) {
- propertyUpdates.tail = {
- prefix: tailPrefix,
- path: tailPath,
- __queryParams: this.route.__queryParams
- };
- }
- propertyUpdates.data = namedMatches;
- this._dataInUrl = {};
- for (var key in namedMatches) {
- this._dataInUrl[key] = namedMatches[key];
- }
- this.__setMulti(propertyUpdates);
- },
- __tailPathChanged: function() {
- if (!this.active) {
- return;
- }
- var tailPath = this.tail.path;
- var newPath = this._matched;
- if (tailPath) {
- if (tailPath.charAt(0) !== '/') {
- tailPath = '/' + tailPath;
- }
- newPath += tailPath;
- }
- this.set('route.path', newPath);
- },
- __updatePathOnDataChange: function() {
- if (!this.route || !this.active) {
- return;
- }
- var newPath = this.__getLink({});
- var oldPath = this.__getLink(this._dataInUrl);
- if (newPath === oldPath) {
- return;
- }
- this.set('route.path', newPath);
- },
- __getLink: function(overrideValues) {
- var values = {
- tail: null
- };
- for (var key in this.data) {
- values[key] = this.data[key];
- }
- for (var key in overrideValues) {
- values[key] = overrideValues[key];
- }
- var patternPieces = this.pattern.split('/');
- var interp = patternPieces.map(function(value) {
- if (value[0] == ':') {
- value = values[value.slice(1)];
- }
- return value;
- }, this);
- if (values.tail && values.tail.path) {
- if (interp.length > 0 && values.tail.path.charAt(0) === '/') {
- interp.push(values.tail.path.slice(1));
- } else {
- interp.push(values.tail.path);
- }
- }
- return interp.join('/');
- },
- __setMulti: function(setObj) {
- for (var property in setObj) {
- this._propertySetter(property, setObj[property]);
- }
- for (var property in setObj) {
- this._pathEffector(property, this[property]);
- this._notifyPathUp(property, this[property]);
- }
- }
-});
-
-Polymer({
- is: 'iron-media-query',
- properties: {
- queryMatches: {
- type: Boolean,
- value: false,
- readOnly: true,
- notify: true
- },
- query: {
- type: String,
- observer: 'queryChanged'
- },
- full: {
- type: Boolean,
- value: false
- },
- _boundMQHandler: {
- value: function() {
- return this.queryHandler.bind(this);
- }
- },
- _mq: {
- value: null
- }
- },
- attached: function() {
- this.style.display = 'none';
- this.queryChanged();
- },
- detached: function() {
- this._remove();
- },
- _add: function() {
- if (this._mq) {
- this._mq.addListener(this._boundMQHandler);
- }
- },
- _remove: function() {
- if (this._mq) {
- this._mq.removeListener(this._boundMQHandler);
- }
- this._mq = null;
+ this._mq = null;
},
queryChanged: function() {
this._remove();
@@ -3660,6 +3097,7 @@ Polymer({
},
searchTerm: {
type: String,
+ observer: 'searchTermChanged_',
notify: true
},
spinnerActive: {
@@ -3691,15 +3129,20 @@ Polymer({
}
}
},
+ get searchField() {
+ return this.$['main-toolbar'].getSearchField();
+ },
+ showSearchField: function() {
+ this.searchField.showAndFocus();
+ },
changeToolbarView_: function() {
this.itemsSelected_ = this.count > 0;
},
- setSearchTerm: function(search) {
- if (this.searchTerm == search) return;
- this.searchTerm = search;
- var searchField = this.$['main-toolbar'].getSearchField();
- searchField.showAndFocus();
- searchField.setValue(search);
+ searchTermChanged_: function() {
+ if (this.searchField.getValue() != this.searchTerm) {
+ this.searchField.showAndFocus();
+ this.searchField.setValue(this.searchTerm);
+ }
},
onMenuPromoShown_: function() {
md_history.BrowserService.getInstance().menuPromoShown();
@@ -3718,12 +3161,6 @@ Polymer({
onDeleteTap_: function() {
this.fire('delete-selected');
},
- get searchBar() {
- return this.$['main-toolbar'].getSearchField();
- },
- showSearchField: function() {
- this.$['main-toolbar'].getSearchField().showAndFocus();
- },
deletingAllowed_: function() {
return loadTimeData.getBoolean('allowDeletingHistory');
},
@@ -5225,79 +4662,469 @@ var HistoryListBehavior = {
}
};
-// Copyright 2015 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.
+// Copyright 2015 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.
+Polymer({
+ is: 'history-list',
+ behaviors: [ HistoryListBehavior ],
+ properties: {
+ searchedTerm: {
+ type: String,
+ value: ''
+ },
+ querying: Boolean,
+ historyData_: Array,
+ resultLoadingDisabled_: {
+ type: Boolean,
+ value: false
+ },
+ lastFocused_: Object
+ },
+ listeners: {
+ scroll: 'notifyListScroll_',
+ 'remove-bookmark-stars': 'removeBookmarkStars_'
+ },
+ attached: function() {
+ this.$['infinite-list'].notifyResize();
+ this.$['infinite-list'].scrollTarget = this;
+ this.$['scroll-threshold'].scrollTarget = this;
+ },
+ removeBookmarkStars_: function(e) {
+ var url = e.detail;
+ if (this.historyData_ === undefined) return;
+ for (var i = 0; i < this.historyData_.length; i++) {
+ if (this.historyData_[i].url == url) this.set('historyData_.' + i + '.starred', false);
+ }
+ },
+ disableResultLoading: function() {
+ this.resultLoadingDisabled_ = true;
+ },
+ addNewResults: function(historyResults, incremental) {
+ var results = historyResults.slice();
+ this.$['scroll-threshold'].clearTriggers();
+ if (!incremental) {
+ this.resultLoadingDisabled_ = false;
+ if (this.historyData_) this.splice('historyData_', 0, this.historyData_.length);
+ this.fire('unselect-all');
+ }
+ if (this.historyData_) {
+ results.unshift('historyData_');
+ this.push.apply(this, results);
+ } else {
+ this.set('historyData_', results);
+ }
+ },
+ loadMoreData_: function() {
+ if (this.resultLoadingDisabled_ || this.querying) return;
+ this.fire('load-more-history');
+ },
+ needsTimeGap_: function(item, index, length) {
+ return md_history.HistoryItem.needsTimeGap(this.historyData_, index, this.searchedTerm);
+ },
+ isCardStart_: function(item, i, length) {
+ if (length == 0 || i > length - 1) return false;
+ return i == 0 || this.historyData_[i].dateRelativeDay != this.historyData_[i - 1].dateRelativeDay;
+ },
+ isCardEnd_: function(item, i, length) {
+ if (length == 0 || i > length - 1) return false;
+ return i == length - 1 || this.historyData_[i].dateRelativeDay != this.historyData_[i + 1].dateRelativeDay;
+ },
+ notifyListScroll_: function() {
+ this.fire('history-list-scrolled');
+ },
+ pathForItem_: function(index) {
+ return 'historyData_.' + index;
+ }
+});
+
+// Copyright 2016 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.
+Polymer({
+ is: 'history-list-container',
+ properties: {
+ selectedPage_: String,
+ grouped: Boolean,
+ groupedRange: {
+ type: Number,
+ observer: 'groupedRangeChanged_'
+ },
+ queryState: Object,
+ queryResult: Object
+ },
+ observers: [ 'searchTermChanged_(queryState.searchTerm)' ],
+ listeners: {
+ 'history-list-scrolled': 'closeMenu_',
+ 'load-more-history': 'loadMoreHistory_',
+ 'toggle-menu': 'toggleMenu_'
+ },
+ historyResult: function(info, results) {
+ this.initializeResults_(info, results);
+ this.closeMenu_();
+ if (this.selectedPage_ == 'grouped-list') {
+ this.$$('#grouped-list').historyData = results;
+ return;
+ }
+ var list = this.$['infinite-list'];
+ list.addNewResults(results, this.queryState.incremental);
+ if (info.finished) list.disableResultLoading();
+ },
+ queryHistory: function(incremental) {
+ var queryState = this.queryState;
+ var noResults = !this.queryResult || this.queryResult.results == null;
+ if (queryState.queryingDisabled || !this.queryState.searchTerm && noResults) {
+ return;
+ }
+ var dialog = this.$.dialog.getIfExists();
+ if (!incremental && dialog && dialog.open) dialog.close();
+ this.set('queryState.querying', true);
+ this.set('queryState.incremental', incremental);
+ var lastVisitTime = 0;
+ if (incremental) {
+ var lastVisit = this.queryResult.results.slice(-1)[0];
+ lastVisitTime = lastVisit ? lastVisit.time : 0;
+ }
+ var maxResults = this.groupedRange == HistoryRange.ALL_TIME ? RESULTS_PER_PAGE : 0;
+ chrome.send('queryHistory', [ queryState.searchTerm, queryState.groupedOffset, queryState.range, lastVisitTime, maxResults ]);
+ },
+ historyDeleted: function() {
+ if (this.getSelectedItemCount() > 0) return;
+ this.queryHistory(false);
+ },
+ getContentScrollTarget: function() {
+ return this.getSelectedList_();
+ },
+ getSelectedItemCount: function() {
+ return this.getSelectedList_().selectedPaths.size;
+ },
+ unselectAllItems: function(count) {
+ var selectedList = this.getSelectedList_();
+ if (selectedList) selectedList.unselectAllItems(count);
+ },
+ deleteSelectedWithPrompt: function() {
+ if (!loadTimeData.getBoolean('allowDeletingHistory')) return;
+ var browserService = md_history.BrowserService.getInstance();
+ browserService.recordAction('RemoveSelected');
+ if (this.queryState.searchTerm != '') browserService.recordAction('SearchResultRemove');
+ this.$.dialog.get().showModal();
+ },
+ groupedRangeChanged_: function(range, oldRange) {
+ this.selectedPage_ = range == HistoryRange.ALL_TIME ? 'infinite-list' : 'grouped-list';
+ if (oldRange == undefined) return;
+ this.queryHistory(false);
+ this.fire('history-view-changed');
+ },
+ searchTermChanged_: function() {
+ this.queryHistory(false);
+ if (this.queryState.searchTerm) md_history.BrowserService.getInstance().recordAction('Search');
+ },
+ loadMoreHistory_: function() {
+ this.queryHistory(true);
+ },
+ initializeResults_: function(info, results) {
+ if (results.length == 0) return;
+ var currentDate = results[0].dateRelativeDay;
+ for (var i = 0; i < results.length; i++) {
+ results[i].selected = false;
+ results[i].readableTimestamp = info.term == '' ? results[i].dateTimeOfDay : results[i].dateShort;
+ if (results[i].dateRelativeDay != currentDate) {
+ currentDate = results[i].dateRelativeDay;
+ }
+ }
+ },
+ onDialogConfirmTap_: function() {
+ md_history.BrowserService.getInstance().recordAction('ConfirmRemoveSelected');
+ this.getSelectedList_().deleteSelected();
+ var dialog = assert(this.$.dialog.getIfExists());
+ dialog.close();
+ },
+ onDialogCancelTap_: function() {
+ md_history.BrowserService.getInstance().recordAction('CancelRemoveSelected');
+ var dialog = assert(this.$.dialog.getIfExists());
+ dialog.close();
+ },
+ closeMenu_: function() {
+ var menu = this.$.sharedMenu.getIfExists();
+ if (menu) menu.closeMenu();
+ },
+ toggleMenu_: function(e) {
+ var target = e.detail.target;
+ var menu = this.$.sharedMenu.get();
+ menu.toggleMenu(target, e.detail);
+ },
+ onMoreFromSiteTap_: function() {
+ md_history.BrowserService.getInstance().recordAction('EntryMenuShowMoreFromSite');
+ var menu = assert(this.$.sharedMenu.getIfExists());
+ this.set('queryState.searchTerm', menu.itemData.item.domain);
+ menu.closeMenu();
+ },
+ onRemoveFromHistoryTap_: function() {
+ var browserService = md_history.BrowserService.getInstance();
+ browserService.recordAction('EntryMenuRemoveFromHistory');
+ var menu = assert(this.$.sharedMenu.getIfExists());
+ var itemData = menu.itemData;
+ browserService.deleteItems([ itemData.item ]).then(function(items) {
+ this.getSelectedList_().removeItemsByPath([ itemData.path ]);
+ this.fire('unselect-all');
+ var index = itemData.index;
+ if (index == undefined) return;
+ var browserService = md_history.BrowserService.getInstance();
+ browserService.recordHistogram('HistoryPage.RemoveEntryPosition', index, UMA_MAX_BUCKET_VALUE);
+ if (index <= UMA_MAX_SUBSET_BUCKET_VALUE) {
+ browserService.recordHistogram('HistoryPage.RemoveEntryPositionSubset', index, UMA_MAX_SUBSET_BUCKET_VALUE);
+ }
+ }.bind(this));
+ menu.closeMenu();
+ },
+ getSelectedList_: function() {
+ return this.$.content.selectedItem;
+ }
+});
+
+(function() {
+ 'use strict';
+ Polymer({
+ is: 'iron-location',
+ properties: {
+ path: {
+ type: String,
+ notify: true,
+ value: function() {
+ return window.decodeURIComponent(window.location.pathname);
+ }
+ },
+ query: {
+ type: String,
+ notify: true,
+ value: function() {
+ return window.decodeURIComponent(window.location.search.slice(1));
+ }
+ },
+ hash: {
+ type: String,
+ notify: true,
+ value: function() {
+ return window.decodeURIComponent(window.location.hash.slice(1));
+ }
+ },
+ dwellTime: {
+ type: Number,
+ value: 2e3
+ },
+ urlSpaceRegex: {
+ type: String,
+ value: ''
+ },
+ _urlSpaceRegExp: {
+ computed: '_makeRegExp(urlSpaceRegex)'
+ },
+ _lastChangedAt: {
+ type: Number
+ },
+ _initialized: {
+ type: Boolean,
+ value: false
+ }
+ },
+ hostAttributes: {
+ hidden: true
+ },
+ observers: [ '_updateUrl(path, query, hash)' ],
+ attached: function() {
+ this.listen(window, 'hashchange', '_hashChanged');
+ this.listen(window, 'location-changed', '_urlChanged');
+ this.listen(window, 'popstate', '_urlChanged');
+ this.listen(document.body, 'click', '_globalOnClick');
+ this._lastChangedAt = window.performance.now() - (this.dwellTime - 200);
+ this._initialized = true;
+ this._urlChanged();
+ },
+ detached: function() {
+ this.unlisten(window, 'hashchange', '_hashChanged');
+ this.unlisten(window, 'location-changed', '_urlChanged');
+ this.unlisten(window, 'popstate', '_urlChanged');
+ this.unlisten(document.body, 'click', '_globalOnClick');
+ this._initialized = false;
+ },
+ _hashChanged: function() {
+ this.hash = window.decodeURIComponent(window.location.hash.substring(1));
+ },
+ _urlChanged: function() {
+ this._dontUpdateUrl = true;
+ this._hashChanged();
+ this.path = window.decodeURIComponent(window.location.pathname);
+ this.query = window.decodeURIComponent(window.location.search.substring(1));
+ this._dontUpdateUrl = false;
+ this._updateUrl();
+ },
+ _getUrl: function() {
+ var partiallyEncodedPath = window.encodeURI(this.path).replace(/\#/g, '%23').replace(/\?/g, '%3F');
+ var partiallyEncodedQuery = '';
+ if (this.query) {
+ partiallyEncodedQuery = '?' + window.encodeURI(this.query).replace(/\#/g, '%23');
+ }
+ var partiallyEncodedHash = '';
+ if (this.hash) {
+ partiallyEncodedHash = '#' + window.encodeURI(this.hash);
+ }
+ return partiallyEncodedPath + partiallyEncodedQuery + partiallyEncodedHash;
+ },
+ _updateUrl: function() {
+ if (this._dontUpdateUrl || !this._initialized) {
+ return;
+ }
+ if (this.path === window.decodeURIComponent(window.location.pathname) && this.query === window.decodeURIComponent(window.location.search.substring(1)) && this.hash === window.decodeURIComponent(window.location.hash.substring(1))) {
+ return;
+ }
+ var newUrl = this._getUrl();
+ var fullNewUrl = new URL(newUrl, window.location.protocol + '//' + window.location.host).href;
+ var now = window.performance.now();
+ var shouldReplace = this._lastChangedAt + this.dwellTime > now;
+ this._lastChangedAt = now;
+ if (shouldReplace) {
+ window.history.replaceState({}, '', fullNewUrl);
+ } else {
+ window.history.pushState({}, '', fullNewUrl);
+ }
+ this.fire('location-changed', {}, {
+ node: window
+ });
+ },
+ _globalOnClick: function(event) {
+ if (event.defaultPrevented) {
+ return;
+ }
+ var href = this._getSameOriginLinkHref(event);
+ if (!href) {
+ return;
+ }
+ event.preventDefault();
+ if (href === window.location.href) {
+ return;
+ }
+ window.history.pushState({}, '', href);
+ this.fire('location-changed', {}, {
+ node: window
+ });
+ },
+ _getSameOriginLinkHref: function(event) {
+ if (event.button !== 0) {
+ return null;
+ }
+ if (event.metaKey || event.ctrlKey) {
+ return null;
+ }
+ var eventPath = Polymer.dom(event).path;
+ var anchor = null;
+ for (var i = 0; i < eventPath.length; i++) {
+ var element = eventPath[i];
+ if (element.tagName === 'A' && element.href) {
+ anchor = element;
+ break;
+ }
+ }
+ if (!anchor) {
+ return null;
+ }
+ if (anchor.target === '_blank') {
+ return null;
+ }
+ if ((anchor.target === '_top' || anchor.target === '_parent') && window.top !== window) {
+ return null;
+ }
+ var href = anchor.href;
+ var url;
+ if (document.baseURI != null) {
+ url = new URL(href, document.baseURI);
+ } else {
+ url = new URL(href);
+ }
+ var origin;
+ if (window.location.origin) {
+ origin = window.location.origin;
+ } else {
+ origin = window.location.protocol + '//' + window.location.hostname;
+ if (window.location.port) {
+ origin += ':' + window.location.port;
+ }
+ }
+ if (url.origin !== origin) {
+ return null;
+ }
+ var normalizedHref = url.pathname + url.search + url.hash;
+ if (this._urlSpaceRegExp && !this._urlSpaceRegExp.test(normalizedHref)) {
+ return null;
+ }
+ var fullNormalizedHref = new URL(normalizedHref, window.location.href).href;
+ return fullNormalizedHref;
+ },
+ _makeRegExp: function(urlSpaceRegex) {
+ return RegExp(urlSpaceRegex);
+ }
+ });
+})();
+
+'use strict';
+
Polymer({
- is: 'history-list',
- behaviors: [ HistoryListBehavior ],
+ is: 'iron-query-params',
properties: {
- searchedTerm: {
+ paramsString: {
type: String,
- value: ''
+ notify: true,
+ observer: 'paramsStringChanged'
},
- querying: Boolean,
- historyData_: Array,
- resultLoadingDisabled_: {
+ paramsObject: {
+ type: Object,
+ notify: true,
+ value: function() {
+ return {};
+ }
+ },
+ _dontReact: {
type: Boolean,
value: false
- },
- lastFocused_: Object
+ }
},
- listeners: {
- scroll: 'notifyListScroll_',
- 'remove-bookmark-stars': 'removeBookmarkStars_'
+ hostAttributes: {
+ hidden: true
},
- attached: function() {
- this.$['infinite-list'].notifyResize();
- this.$['infinite-list'].scrollTarget = this;
- this.$['scroll-threshold'].scrollTarget = this;
+ observers: [ 'paramsObjectChanged(paramsObject.*)' ],
+ paramsStringChanged: function() {
+ this._dontReact = true;
+ this.paramsObject = this._decodeParams(this.paramsString);
+ this._dontReact = false;
},
- removeBookmarkStars_: function(e) {
- var url = e.detail;
- if (this.historyData_ === undefined) return;
- for (var i = 0; i < this.historyData_.length; i++) {
- if (this.historyData_[i].url == url) this.set('historyData_.' + i + '.starred', false);
+ paramsObjectChanged: function() {
+ if (this._dontReact) {
+ return;
}
+ this.paramsString = this._encodeParams(this.paramsObject);
},
- disableResultLoading: function() {
- this.resultLoadingDisabled_ = true;
- },
- addNewResults: function(historyResults, incremental) {
- var results = historyResults.slice();
- this.$['scroll-threshold'].clearTriggers();
- if (!incremental) {
- this.resultLoadingDisabled_ = false;
- if (this.historyData_) this.splice('historyData_', 0, this.historyData_.length);
- this.fire('unselect-all');
- }
- if (this.historyData_) {
- results.unshift('historyData_');
- this.push.apply(this, results);
- } else {
- this.set('historyData_', results);
+ _encodeParams: function(params) {
+ var encodedParams = [];
+ for (var key in params) {
+ var value = params[key];
+ if (value === '') {
+ encodedParams.push(encodeURIComponent(key));
+ } else if (value) {
+ encodedParams.push(encodeURIComponent(key) + '=' + encodeURIComponent(value.toString()));
+ }
}
+ return encodedParams.join('&');
},
- loadMoreData_: function() {
- if (this.resultLoadingDisabled_ || this.querying) return;
- this.fire('load-more-history');
- },
- needsTimeGap_: function(item, index, length) {
- return md_history.HistoryItem.needsTimeGap(this.historyData_, index, this.searchedTerm);
- },
- isCardStart_: function(item, i, length) {
- if (length == 0 || i > length - 1) return false;
- return i == 0 || this.historyData_[i].dateRelativeDay != this.historyData_[i - 1].dateRelativeDay;
- },
- isCardEnd_: function(item, i, length) {
- if (length == 0 || i > length - 1) return false;
- return i == length - 1 || this.historyData_[i].dateRelativeDay != this.historyData_[i + 1].dateRelativeDay;
- },
- notifyListScroll_: function() {
- this.fire('history-list-scrolled');
- },
- pathForItem_: function(index) {
- return 'historyData_.' + index;
+ _decodeParams: function(paramString) {
+ var params = {};
+ paramString = (paramString || '').replace(/\+/g, '%20');
+ var paramList = paramString.split('&');
+ for (var i = 0; i < paramList.length; i++) {
+ var param = paramList[i].split('=');
+ if (param[0]) {
+ params[decodeURIComponent(param[0])] = decodeURIComponent(param[1] || '');
+ }
+ }
+ return params;
}
});
@@ -5305,140 +5132,42 @@ Polymer({
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Polymer({
- is: 'history-list-container',
+ is: 'history-router',
properties: {
- selectedPage_: String,
- grouped: Boolean,
- groupedRange: {
- type: Number,
- observer: 'groupedRangeChanged_'
+ selectedPage: {
+ type: String,
+ observer: 'serializePath_',
+ notify: true
},
- queryState: Object,
- queryResult: Object
- },
- listeners: {
- 'history-list-scrolled': 'closeMenu_',
- 'load-more-history': 'loadMoreHistory_',
- 'toggle-menu': 'toggleMenu_'
- },
- historyResult: function(info, results) {
- this.initializeResults_(info, results);
- this.closeMenu_();
- if (this.selectedPage_ == 'grouped-list') {
- this.$$('#grouped-list').historyData = results;
- return;
- }
- var list = this.$['infinite-list'];
- list.addNewResults(results, this.queryState.incremental);
- if (info.finished) list.disableResultLoading();
- },
- queryHistory: function(incremental) {
- var queryState = this.queryState;
- var noResults = !this.queryResult || this.queryResult.results == null;
- if (queryState.queryingDisabled || !this.queryState.searchTerm && noResults) {
- return;
- }
- var dialog = this.$.dialog.getIfExists();
- if (!incremental && dialog && dialog.open) dialog.close();
- this.set('queryState.querying', true);
- this.set('queryState.incremental', incremental);
- var lastVisitTime = 0;
- if (incremental) {
- var lastVisit = this.queryResult.results.slice(-1)[0];
- lastVisitTime = lastVisit ? lastVisit.time : 0;
- }
- var maxResults = this.groupedRange == HistoryRange.ALL_TIME ? RESULTS_PER_PAGE : 0;
- chrome.send('queryHistory', [ queryState.searchTerm, queryState.groupedOffset, queryState.range, lastVisitTime, maxResults ]);
- },
- historyDeleted: function() {
- if (this.getSelectedItemCount() > 0) return;
- this.queryHistory(false);
- },
- getContentScrollTarget: function() {
- return this.getSelectedList_();
- },
- getSelectedItemCount: function() {
- return this.getSelectedList_().selectedPaths.size;
- },
- unselectAllItems: function(count) {
- var selectedList = this.getSelectedList_();
- if (selectedList) selectedList.unselectAllItems(count);
- },
- deleteSelectedWithPrompt: function() {
- if (!loadTimeData.getBoolean('allowDeletingHistory')) return;
- var browserService = md_history.BrowserService.getInstance();
- browserService.recordAction('RemoveSelected');
- if (this.queryState.searchTerm != '') browserService.recordAction('SearchResultRemove');
- this.$.dialog.get().showModal();
- },
- groupedRangeChanged_: function(range, oldRange) {
- this.selectedPage_ = range == HistoryRange.ALL_TIME ? 'infinite-list' : 'grouped-list';
- if (oldRange == undefined) return;
- this.queryHistory(false);
- this.fire('history-view-changed');
- },
- loadMoreHistory_: function() {
- this.queryHistory(true);
+ queryState: {
+ type: Object,
+ notify: true
+ },
+ path_: {
+ type: String,
+ observer: 'pathChanged_'
+ },
+ queryParams_: Object
},
- initializeResults_: function(info, results) {
- if (results.length == 0) return;
- var currentDate = results[0].dateRelativeDay;
- for (var i = 0; i < results.length; i++) {
- results[i].selected = false;
- results[i].readableTimestamp = info.term == '' ? results[i].dateTimeOfDay : results[i].dateShort;
- if (results[i].dateRelativeDay != currentDate) {
- currentDate = results[i].dateRelativeDay;
- }
+ observers: [ 'queryParamsChanged_(queryParams_.*)', 'searchTermChanged_(queryState.searchTerm)' ],
+ attached: function() {
+ if (window.location.hash) {
+ window.location.href = window.location.href.split('#')[0] + '?' + window.location.hash.substr(1);
}
},
- onDialogConfirmTap_: function() {
- md_history.BrowserService.getInstance().recordAction('ConfirmRemoveSelected');
- this.getSelectedList_().deleteSelected();
- var dialog = assert(this.$.dialog.getIfExists());
- dialog.close();
- },
- onDialogCancelTap_: function() {
- md_history.BrowserService.getInstance().recordAction('CancelRemoveSelected');
- var dialog = assert(this.$.dialog.getIfExists());
- dialog.close();
- },
- closeMenu_: function() {
- var menu = this.$.sharedMenu.getIfExists();
- if (menu) menu.closeMenu();
- },
- toggleMenu_: function(e) {
- var target = e.detail.target;
- var menu = this.$.sharedMenu.get();
- menu.toggleMenu(target, e.detail);
+ serializePath_: function() {
+ var page = this.selectedPage == 'history' ? '' : this.selectedPage;
+ this.path_ = '/' + page;
},
- onMoreFromSiteTap_: function() {
- md_history.BrowserService.getInstance().recordAction('EntryMenuShowMoreFromSite');
- var menu = assert(this.$.sharedMenu.getIfExists());
- this.fire('search-domain', {
- domain: menu.itemData.item.domain
- });
- menu.closeMenu();
+ pathChanged_: function() {
+ var sections = this.path_.substr(1).split('/');
+ this.selectedPage = sections[0] || 'history';
},
- onRemoveFromHistoryTap_: function() {
- var browserService = md_history.BrowserService.getInstance();
- browserService.recordAction('EntryMenuRemoveFromHistory');
- var menu = assert(this.$.sharedMenu.getIfExists());
- var itemData = menu.itemData;
- browserService.deleteItems([ itemData.item ]).then(function(items) {
- this.getSelectedList_().removeItemsByPath([ itemData.path ]);
- this.fire('unselect-all');
- var index = itemData.index;
- if (index == undefined) return;
- var browserService = md_history.BrowserService.getInstance();
- browserService.recordHistogram('HistoryPage.RemoveEntryPosition', index, UMA_MAX_BUCKET_VALUE);
- if (index <= UMA_MAX_SUBSET_BUCKET_VALUE) {
- browserService.recordHistogram('HistoryPage.RemoveEntryPositionSubset', index, UMA_MAX_SUBSET_BUCKET_VALUE);
- }
- }.bind(this));
- menu.closeMenu();
+ queryParamsChanged_: function() {
+ this.set('queryState.searchTerm', this.queryParams_.q || '');
},
- getSelectedList_: function() {
- return this.$.content.selectedItem;
+ searchTermChanged_: function() {
+ this.set('queryParams_.q', this.queryState.searchTerm || null);
}
});
@@ -5555,7 +5284,6 @@ Polymer({
type: String,
notify: true
},
- route: Object,
showFooter: Boolean,
drawer: {
type: Boolean,
@@ -5578,8 +5306,8 @@ Polymer({
this.$['cbd-ripple'].upAction();
e.preventDefault();
},
- getQueryString_: function(route) {
- return window.location.search;
+ onItemClick_: function(e) {
+ e.preventDefault();
}
});
@@ -5609,7 +5337,7 @@ Polymer({
hasSyncedResults: Boolean,
selectedPage_: {
type: String,
- observer: 'unselectAll'
+ observer: 'selectedPageChanged_'
},
grouped_: {
type: Boolean,
@@ -5644,8 +5372,6 @@ Polymer({
};
}
},
- routeData_: Object,
- queryParams_: Object,
hasDrawer_: Boolean,
isUserSignedIn_: {
type: Boolean,
@@ -5657,13 +5383,11 @@ Polymer({
notify: true
}
},
- observers: [ 'routeDataChanged_(routeData_.page)', 'selectedPageChanged_(selectedPage_)', 'searchTermChanged_(queryState_.searchTerm)', 'searchQueryParamChanged_(queryParams_.q)' ],
listeners: {
'cr-menu-tap': 'onMenuTap_',
'history-checkbox-select': 'checkboxSelected',
'unselect-all': 'unselectAll',
'delete-selected': 'deleteSelected',
- 'search-domain': 'searchDomain_',
'history-close-drawer': 'closeDrawer_',
'history-view-changed': 'historyViewChanged_'
},
@@ -5672,9 +5396,6 @@ Polymer({
cr.ui.decorate('command', cr.ui.Command);
document.addEventListener('canExecute', this.onCanExecute_.bind(this));
document.addEventListener('command', this.onCommand_.bind(this));
- if (window.location.hash) {
- window.location.href = window.location.href.split('#')[0] + '?' + window.location.hash.substr(1);
- }
},
onFirstRender: function() {
setTimeout(function() {
@@ -5686,7 +5407,7 @@ Polymer({
md_history.ensureLazyLoaded();
},
_scrollHandler: function() {
- this.toolbarShadow_ = this.scrollTarget.scrollTop != 0;
+ if (this.scrollTarget) this.toolbarShadow_ = this.scrollTarget.scrollTop != 0;
},
onMenuTap_: function() {
var drawer = this.$$('#drawer');
@@ -5715,9 +5436,6 @@ Polymer({
focusToolbarSearchField: function() {
this.$.toolbar.showSearchField();
},
- searchDomain_: function(e) {
- this.$.toolbar.setSearchTerm(e.detail.domain);
- },
onCanExecute_: function(e) {
e = e;
switch (e.command.id) {
@@ -5726,7 +5444,7 @@ Polymer({
break;
case 'slash-command':
- e.canExecute = !this.$.toolbar.searchBar.isSearchFocused();
+ e.canExecute = !this.$.toolbar.searchField.isSearchFocused();
break;
case 'delete-command':
@@ -5734,14 +5452,6 @@ Polymer({
break;
}
},
- searchTermChanged_: function(searchTerm) {
- this.set('queryParams_.q', searchTerm || null);
- this.$['history'].queryHistory(false);
- if (this.queryState_.searchTerm) md_history.BrowserService.getInstance().recordAction('Search');
- },
- searchQueryParamChanged_: function(searchQuery) {
- this.$.toolbar.setSearchTerm(searchQuery || '');
- },
onCommand_: function(e) {
if (e.command.id == 'find-command' || e.command.id == 'slash-command') this.focusToolbarSearchField();
if (e.command.id == 'delete-command') this.deleteSelected();
@@ -5769,15 +5479,13 @@ Polymer({
showSyncNotice_: function(hasSyncedResults, selectedPage) {
return hasSyncedResults && selectedPage != 'syncedTabs';
},
- routeDataChanged_: function(page) {
- this.selectedPage_ = page;
- },
- selectedPageChanged_: function(selectedPage) {
- this.set('routeData_.page', selectedPage);
+ selectedPageChanged_: function() {
+ this.unselectAll();
this.historyViewChanged_();
},
historyViewChanged_: function() {
requestAnimationFrame(function() {
+ if (!this.$.content.selectedItem) return;
this.scrollTarget = this.$.content.selectedItem.getContentScrollTarget();
this._scrollHandler();
}.bind(this));
« no previous file with comments | « chrome/browser/resources/md_history/app.js ('k') | chrome/browser/resources/md_history/app.vulcanized.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698