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

Side by Side Diff: chrome/browser/resources/history/history.js

Issue 15969014: History: Update managed user history page (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix browser tests Created 7 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 <include src="../uber/uber_utils.js"> 5 <include src="../uber/uber_utils.js">
6 6
7 /////////////////////////////////////////////////////////////////////////////// 7 ///////////////////////////////////////////////////////////////////////////////
8 // Globals: 8 // Globals:
9 /** @const */ var RESULTS_PER_PAGE = 150; 9 /** @const */ var RESULTS_PER_PAGE = 150;
10 10
11 // Amount of time between pageviews that we consider a 'break' in browsing, 11 // Amount of time between pageviews that we consider a 'break' in browsing,
12 // measured in milliseconds. 12 // measured in milliseconds.
13 /** @const */ var BROWSING_GAP_TIME = 15 * 60 * 1000; 13 /** @const */ var BROWSING_GAP_TIME = 15 * 60 * 1000;
14 14
15 // TODO(glen): Get rid of these global references, replace with a controller 15 // TODO(glen): Get rid of these global references, replace with a controller
16 // or just make the classes own more of the page. 16 // or just make the classes own more of the page.
17 var historyModel; 17 var historyModel;
18 var historyView; 18 var historyView;
19 var pageState; 19 var pageState;
20 var selectionAnchor = -1; 20 var selectionAnchor = -1;
21 var activeVisit = null; 21 var activeVisit = null;
22 22
23 /** @const */ var Command = cr.ui.Command; 23 /** @const */ var Command = cr.ui.Command;
24 /** @const */ var Menu = cr.ui.Menu; 24 /** @const */ var Menu = cr.ui.Menu;
25 /** @const */ var MenuButton = cr.ui.MenuButton; 25 /** @const */ var MenuButton = cr.ui.MenuButton;
26 26
27 /** 27 /**
28 * Enum that shows whether a manual exception is set in managed mode for a 28 * Enum that shows the filtering behavior for a host or URL to a managed user.
29 * host or URL. 29 * Must behave like the FilteringBehavior enum from managed_mode_url_filter.h.
30 * Must behave like the ManualBehavior enum from managed_user_service.h.
31 * @enum {number} 30 * @enum {number}
32 */ 31 */
33 ManagedModeManualBehavior = { 32 ManagedModeFilteringBehavior = {
34 NONE: 0, 33 ALLOW: 0,
35 ALLOW: 1, 34 WARN: 1,
36 BLOCK: 2 35 BLOCK: 2
37 }; 36 };
38 37
39 MenuButton.createDropDownArrows(); 38 MenuButton.createDropDownArrows();
40 39
41 /** 40 /**
42 * Returns true if the mobile (non-desktop) version is being shown. 41 * Returns true if the mobile (non-desktop) version is being shown.
43 * @return {boolean} true if the mobile version is being shown. 42 * @return {boolean} true if the mobile version is being shown.
44 */ 43 */
45 function isMobileVersion() { 44 function isMobileVersion() {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 // two items easily. 78 // two items easily.
80 79
81 this.date = new Date(result.time); 80 this.date = new Date(result.time);
82 81
83 // See comment in BrowsingHistoryHandler::QueryComplete - we won't always 82 // See comment in BrowsingHistoryHandler::QueryComplete - we won't always
84 // get all of these. 83 // get all of these.
85 this.dateRelativeDay = result.dateRelativeDay || ''; 84 this.dateRelativeDay = result.dateRelativeDay || '';
86 this.dateTimeOfDay = result.dateTimeOfDay || ''; 85 this.dateTimeOfDay = result.dateTimeOfDay || '';
87 this.dateShort = result.dateShort || ''; 86 this.dateShort = result.dateShort || '';
88 87
89 // These values represent indicators shown to users in managed mode. 88 // Shows the filtering behavior for that host (only used for managed users).
90 // |*manualBehavior| shows whether the user has manually added an exception 89 // A value of |ManagedModeFilteringBehavior.ALLOW| is not displayed so it is
91 // for that URL or host while |*inContentPack| shows whether that URL or host 90 // used as the default value.
92 // is in a content pack or not. 91 this.hostFilteringBehavior = ManagedModeFilteringBehavior.ALLOW;
93 this.urlManualBehavior = result.urlManualBehavior || 92 if (typeof result.hostFilteringBehavior != 'undefined')
94 ManagedModeManualBehavior.NONE; 93 this.hostFilteringBehavior = result.hostFilteringBehavior;
95 this.hostManualBehavior = result.hostManualBehavior || 94
96 ManagedModeManualBehavior.NONE;
97 this.urlInContentPack = result.urlInContentPack || false;
98 this.hostInContentPack = result.hostInContentPack || false;
99 this.blockedVisit = result.blockedVisit || false; 95 this.blockedVisit = result.blockedVisit || false;
100 96
101 // Whether this is the continuation of a previous day. 97 // Whether this is the continuation of a previous day.
102 this.continued = continued; 98 this.continued = continued;
103 99
104 this.allTimestamps = result.allTimestamps; 100 this.allTimestamps = result.allTimestamps;
105 } 101 }
106 102
107 // Visit, public: ------------------------------------------------------------- 103 // Visit, public: -------------------------------------------------------------
108 104
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 bookmarkSection.classList.add('starred'); 157 bookmarkSection.classList.add('starred');
162 bookmarkSection.addEventListener('click', function f(e) { 158 bookmarkSection.addEventListener('click', function f(e) {
163 bookmarkSection.classList.remove('starred'); 159 bookmarkSection.classList.remove('starred');
164 chrome.send('removeBookmark', [self.url_]); 160 chrome.send('removeBookmark', [self.url_]);
165 bookmarkSection.removeEventListener('click', f); 161 bookmarkSection.removeEventListener('click', f);
166 e.preventDefault(); 162 e.preventDefault();
167 }); 163 });
168 } 164 }
169 entryBox.appendChild(bookmarkSection); 165 entryBox.appendChild(bookmarkSection);
170 166
171 var titleAndDomainWrapper = entryBox.appendChild( 167 var visitEntryWrapper = entryBox.appendChild(document.createElement('div'));
172 createElementWithClassName('div', 'title-and-domain')); 168 if (addTitleFavicon || this.blockedVisit)
169 visitEntryWrapper.classList.add('visit-entry');
173 if (this.blockedVisit) { 170 if (this.blockedVisit) {
174 titleAndDomainWrapper.classList.add('blocked-indicator'); 171 visitEntryWrapper.classList.add('blocked-indicator');
175 titleAndDomainWrapper.appendChild(this.getVisitAttemptDOM_()); 172 visitEntryWrapper.appendChild(this.getVisitAttemptDOM_());
176 } else { 173 } else {
177 titleAndDomainWrapper.appendChild(this.getTitleDOM_()); 174 visitEntryWrapper.appendChild(this.getTitleDOM_());
178 if (addTitleFavicon) 175 if (addTitleFavicon)
179 this.addFaviconToElement_(titleAndDomainWrapper); 176 this.addFaviconToElement_(visitEntryWrapper);
177 visitEntryWrapper.appendChild(domain);
180 } 178 }
181 titleAndDomainWrapper.appendChild(domain);
182 179
183 if (isMobileVersion()) { 180 if (isMobileVersion()) {
184 var removeButton = createElementWithClassName('button', 'remove-entry'); 181 var removeButton = createElementWithClassName('button', 'remove-entry');
185 removeButton.classList.add('custom-appearance'); 182 removeButton.classList.add('custom-appearance');
186 removeButton.addEventListener('click', function(e) { 183 removeButton.addEventListener('click', function(e) {
187 self.removeFromHistory(); 184 self.removeFromHistory();
188 e.stopPropagation(); 185 e.stopPropagation();
189 e.preventDefault(); 186 e.preventDefault();
190 }); 187 });
191 entryBox.appendChild(removeButton); 188 entryBox.appendChild(removeButton);
(...skipping 22 matching lines...) Expand all
214 this.classList.add('contains-focus'); 211 this.classList.add('contains-focus');
215 }, true); 212 }, true);
216 entryBox.addEventListener('blur', function() { 213 entryBox.addEventListener('blur', function() {
217 this.classList.remove('contains-focus'); 214 this.classList.remove('contains-focus');
218 }, true); 215 }, true);
219 216
220 var entryBoxContainer = 217 var entryBoxContainer =
221 createElementWithClassName('div', 'entry-box-container'); 218 createElementWithClassName('div', 'entry-box-container');
222 node.appendChild(entryBoxContainer); 219 node.appendChild(entryBoxContainer);
223 entryBoxContainer.appendChild(entryBox); 220 entryBoxContainer.appendChild(entryBox);
224 if (!isSearchResult && this.model_.isManagedProfile &&
225 this.model_.getGroupByDomain()) {
226 entryBoxContainer.appendChild(
227 getManagedStatusDOM(this.urlManualBehavior, this.urlInContentPack));
228 }
229 221
230 if (isSearchResult) { 222 if (isSearchResult) {
231 time.appendChild(document.createTextNode(this.dateShort)); 223 time.appendChild(document.createTextNode(this.dateShort));
232 var snippet = createElementWithClassName('div', 'snippet'); 224 var snippet = createElementWithClassName('div', 'snippet');
233 this.addHighlightedText_(snippet, 225 this.addHighlightedText_(snippet,
234 this.snippet_, 226 this.snippet_,
235 this.model_.getSearchText()); 227 this.model_.getSearchText());
236 node.appendChild(snippet); 228 node.appendChild(snippet);
237 } else if (useMonthDate) { 229 } else if (useMonthDate) {
238 // Show the day instead of the time. 230 // Show the day instead of the time.
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 }; 319 };
328 320
329 /** 321 /**
330 * Returns the DOM element containing the text for a blocked visit attempt. 322 * Returns the DOM element containing the text for a blocked visit attempt.
331 * @return {Element} DOM representation of the visit attempt. 323 * @return {Element} DOM representation of the visit attempt.
332 * @private 324 * @private
333 */ 325 */
334 Visit.prototype.getVisitAttemptDOM_ = function() { 326 Visit.prototype.getVisitAttemptDOM_ = function() {
335 var node = createElementWithClassName('div', 'title'); 327 var node = createElementWithClassName('div', 'title');
336 node.innerHTML = loadTimeData.getStringF('blockedVisitText', 328 node.innerHTML = loadTimeData.getStringF('blockedVisitText',
337 this.url_, this.id_); 329 this.url_,
330 this.id_,
331 this.getDomainFromURL_(this.url_));
338 return node; 332 return node;
339 }; 333 };
340 334
341 /** 335 /**
342 * Set the favicon for an element. 336 * Set the favicon for an element.
343 * @param {Element} el The DOM element to which to add the icon. 337 * @param {Element} el The DOM element to which to add the icon.
344 * @private 338 * @private
345 */ 339 */
346 Visit.prototype.addFaviconToElement_ = function(el) { 340 Visit.prototype.addFaviconToElement_ = function(el) {
347 var url = isMobileVersion() ? 341 var url = isMobileVersion() ?
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 */ 567 */
574 HistoryModel.prototype.clearModel_ = function() { 568 HistoryModel.prototype.clearModel_ = function() {
575 this.inFlight_ = false; // Whether a query is inflight. 569 this.inFlight_ = false; // Whether a query is inflight.
576 this.searchText_ = ''; 570 this.searchText_ = '';
577 // Whether this user is a managed user. 571 // Whether this user is a managed user.
578 this.isManagedProfile = loadTimeData.getBoolean('isManagedProfile'); 572 this.isManagedProfile = loadTimeData.getBoolean('isManagedProfile');
579 this.deletingHistoryAllowed = loadTimeData.getBoolean('allowDeletingHistory'); 573 this.deletingHistoryAllowed = loadTimeData.getBoolean('allowDeletingHistory');
580 574
581 // Only create checkboxes for editing entries if they can be used either to 575 // Only create checkboxes for editing entries if they can be used either to
582 // delete an entry or to block/allow it. 576 // delete an entry or to block/allow it.
583 this.editingEntriesAllowed = this.deletingHistoryAllowed || 577 this.editingEntriesAllowed = this.deletingHistoryAllowed;
584 this.isManagedProfile;
585 578
586 // Flag to show that the results are grouped by domain or not. 579 // Flag to show that the results are grouped by domain or not.
587 this.groupByDomain_ = false; 580 this.groupByDomain_ = false;
588 // Group domains by default for managed users.
589 if (this.isManagedProfile)
590 this.groupByDomain_ = true;
591 581
592 this.visits_ = []; // Date-sorted list of visits (most recent first). 582 this.visits_ = []; // Date-sorted list of visits (most recent first).
593 this.nextVisitId_ = 0; 583 this.nextVisitId_ = 0;
594 selectionAnchor = -1; 584 selectionAnchor = -1;
595 585
596 // The page that the view wants to see - we only fetch slightly past this 586 // The page that the view wants to see - we only fetch slightly past this
597 // point. If the view requests a page that we don't have data for, we try 587 // point. If the view requests a page that we don't have data for, we try
598 // to fetch it and call back when we're done. 588 // to fetch it and call back when we're done.
599 this.requestedPage_ = 0; 589 this.requestedPage_ = 0;
600 590
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 $('newest-button').addEventListener('click', function() { 716 $('newest-button').addEventListener('click', function() {
727 self.setPage(0); 717 self.setPage(0);
728 }); 718 });
729 $('newer-button').addEventListener('click', function() { 719 $('newer-button').addEventListener('click', function() {
730 self.setPage(self.pageIndex_ - 1); 720 self.setPage(self.pageIndex_ - 1);
731 }); 721 });
732 $('older-button').addEventListener('click', function() { 722 $('older-button').addEventListener('click', function() {
733 self.setPage(self.pageIndex_ + 1); 723 self.setPage(self.pageIndex_ + 1);
734 }); 724 });
735 725
726 var handleRangeChange = function(e) {
727 // Update the results and save the last state.
728 self.setRangeInDays(parseInt(e.target.value, 10));
729 };
730
736 // Add handlers for the range options. 731 // Add handlers for the range options.
737 $('timeframe-filter').addEventListener('change', function(e) { 732 $('timeframe-filter-all').addEventListener('change', handleRangeChange);
738 self.setRangeInDays(parseInt(e.target.value, 10)); 733 $('timeframe-filter-week').addEventListener('change', handleRangeChange);
739 }); 734 $('timeframe-filter-month').addEventListener('change', handleRangeChange);
740
741 $('group-by-domain').addEventListener('click', function(e) {
742 self.setGroupByDomain($('group-by-domain').checked);
743 });
744 735
745 $('range-previous').addEventListener('click', function(e) { 736 $('range-previous').addEventListener('click', function(e) {
746 if (self.getRangeInDays() == HistoryModel.Range.ALL_TIME) 737 if (self.getRangeInDays() == HistoryModel.Range.ALL_TIME)
747 self.setPage(self.pageIndex_ + 1); 738 self.setPage(self.pageIndex_ + 1);
748 else 739 else
749 self.setOffset(self.getOffset() + 1); 740 self.setOffset(self.getOffset() + 1);
750 }); 741 });
751 $('range-next').addEventListener('click', function(e) { 742 $('range-next').addEventListener('click', function(e) {
752 if (self.getRangeInDays() == HistoryModel.Range.ALL_TIME) 743 if (self.getRangeInDays() == HistoryModel.Range.ALL_TIME)
753 self.setPage(self.pageIndex_ - 1); 744 self.setPage(self.pageIndex_ - 1);
754 else 745 else
755 self.setOffset(self.getOffset() - 1); 746 self.setOffset(self.getOffset() - 1);
756 }); 747 });
757 $('range-today').addEventListener('click', function(e) { 748 $('range-today').addEventListener('click', function(e) {
758 if (self.getRangeInDays() == HistoryModel.Range.ALL_TIME) 749 if (self.getRangeInDays() == HistoryModel.Range.ALL_TIME)
759 self.setPage(0); 750 self.setPage(0);
760 else 751 else
761 self.setOffset(0); 752 self.setOffset(0);
762 }); 753 });
763 } 754 }
764 755
765 // HistoryView, public: ------------------------------------------------------- 756 // HistoryView, public: -------------------------------------------------------
766 /** 757 /**
767 * Do a search on a specific term. 758 * Do a search on a specific term.
768 * @param {string} term The string to search for. 759 * @param {string} term The string to search for.
769 */ 760 */
770 HistoryView.prototype.setSearch = function(term) { 761 HistoryView.prototype.setSearch = function(term) {
771 window.scrollTo(0, 0); 762 window.scrollTo(0, 0);
772 this.setPageState(term, 0, this.model_.getGroupByDomain(), 763 this.setPageState(term, 0, this.getRangeInDays(), this.getOffset());
773 this.getRangeInDays(), this.getOffset());
774 }; 764 };
775 765
776 /** 766 /**
777 * Enable or disable results as being grouped by domain.
778 * @param {boolean} groupedByDomain Whether to group by domain or not.
779 */
780 HistoryView.prototype.setGroupByDomain = function(groupedByDomain) {
781 // Group by domain is not currently supported for search results, so reset
782 // the search term if there was one.
783 this.setPageState('', this.pageIndex_, groupedByDomain, this.getRangeInDays(),
784 this.getOffset());
785 };
786
787 /**
788 * Reload the current view. 767 * Reload the current view.
789 */ 768 */
790 HistoryView.prototype.reload = function() { 769 HistoryView.prototype.reload = function() {
791 this.model_.reload(); 770 this.model_.reload();
792 this.updateSelectionEditButtons(); 771 this.updateSelectionEditButtons();
793 this.updateRangeButtons_(); 772 this.updateRangeButtons_();
794 }; 773 };
795 774
796 /** 775 /**
797 * Sets all the parameters for the history page and then reloads the view to 776 * Sets all the parameters for the history page and then reloads the view to
798 * update the results. 777 * update the results.
799 * @param {string} searchText The search string to set. 778 * @param {string} searchText The search string to set.
800 * @param {number} page The page to be viewed. 779 * @param {number} page The page to be viewed.
801 * @param {boolean} groupByDomain Whether the results are grouped or not.
802 * @param {HistoryModel.Range} range The range to view or search over. 780 * @param {HistoryModel.Range} range The range to view or search over.
803 * @param {number} offset Set the begining of the query to the specific offset. 781 * @param {number} offset Set the begining of the query to the specific offset.
804 */ 782 */
805 HistoryView.prototype.setPageState = function(searchText, page, groupByDomain, 783 HistoryView.prototype.setPageState = function(searchText, page, range, offset) {
806 range, offset) {
807 this.clear_(); 784 this.clear_();
808 this.model_.searchText_ = searchText; 785 this.model_.searchText_ = searchText;
809 this.pageIndex_ = page; 786 this.pageIndex_ = page;
810 this.model_.requestedPage_ = page; 787 this.model_.requestedPage_ = page;
811 this.model_.groupByDomain_ = groupByDomain;
812 this.model_.rangeInDays_ = range; 788 this.model_.rangeInDays_ = range;
789 this.model_.groupByDomain_ = false;
790 if (range != HistoryModel.Range.ALL_TIME)
791 this.model_.groupByDomain_ = true;
813 this.model_.offset_ = offset; 792 this.model_.offset_ = offset;
814 this.reload(); 793 this.reload();
815 pageState.setUIState(this.model_.getSearchText(), 794 pageState.setUIState(this.model_.getSearchText(),
816 this.pageIndex_, 795 this.pageIndex_,
817 this.model_.getGroupByDomain(),
818 this.getRangeInDays(), 796 this.getRangeInDays(),
819 this.getOffset()); 797 this.getOffset());
820 }; 798 };
821 799
822 /** 800 /**
823 * Switch to a specified page. 801 * Switch to a specified page.
824 * @param {number} page The page we wish to view. 802 * @param {number} page The page we wish to view.
825 */ 803 */
826 HistoryView.prototype.setPage = function(page) { 804 HistoryView.prototype.setPage = function(page) {
827 // TODO(sergiu): Move this function to setPageState as well and see why one 805 // TODO(sergiu): Move this function to setPageState as well and see why one
828 // of the tests fails when using setPageState. 806 // of the tests fails when using setPageState.
829 this.clear_(); 807 this.clear_();
830 this.pageIndex_ = parseInt(page, 10); 808 this.pageIndex_ = parseInt(page, 10);
831 window.scrollTo(0, 0); 809 window.scrollTo(0, 0);
832 this.model_.requestPage(page); 810 this.model_.requestPage(page);
833 pageState.setUIState(this.model_.getSearchText(), 811 pageState.setUIState(this.model_.getSearchText(),
834 this.pageIndex_, 812 this.pageIndex_,
835 this.model_.getGroupByDomain(),
836 this.getRangeInDays(), 813 this.getRangeInDays(),
837 this.getOffset()); 814 this.getOffset());
838 }; 815 };
839 816
840 /** 817 /**
841 * @return {number} The page number being viewed. 818 * @return {number} The page number being viewed.
842 */ 819 */
843 HistoryView.prototype.getPage = function() { 820 HistoryView.prototype.getPage = function() {
844 return this.pageIndex_; 821 return this.pageIndex_;
845 }; 822 };
846 823
847 /** 824 /**
848 * Set the current range for grouped results. 825 * Set the current range for grouped results.
849 * @param {string} range The number of days to which the range should be set. 826 * @param {string} range The number of days to which the range should be set.
850 */ 827 */
851 HistoryView.prototype.setRangeInDays = function(range) { 828 HistoryView.prototype.setRangeInDays = function(range) {
852 // Set the range, offset and reset the page. 829 // Set the range, offset and reset the page.
853 this.setPageState(this.model_.getSearchText(), 0, 830 this.setPageState(this.model_.getSearchText(), 0, range, 0);
854 this.model_.getGroupByDomain(), range, 0);
855 }; 831 };
856 832
857 /** 833 /**
858 * Get the current range in days. 834 * Get the current range in days.
859 * @return {number} Current range in days from the model. 835 * @return {number} Current range in days from the model.
860 */ 836 */
861 HistoryView.prototype.getRangeInDays = function() { 837 HistoryView.prototype.getRangeInDays = function() {
862 return this.model_.rangeInDays; 838 return this.model_.rangeInDays;
863 }; 839 };
864 840
865 /** 841 /**
866 * Set the current offset for grouped results. 842 * Set the current offset for grouped results.
867 * @param {number} offset Offset to set. 843 * @param {number} offset Offset to set.
868 */ 844 */
869 HistoryView.prototype.setOffset = function(offset) { 845 HistoryView.prototype.setOffset = function(offset) {
870 // If there is another query already in flight wait for that to complete. 846 // If there is another query already in flight wait for that to complete.
871 if (this.model_.inFlight_) 847 if (this.model_.inFlight_)
872 return; 848 return;
873 this.setPageState(this.model_.getSearchText(), 849 this.setPageState(this.model_.getSearchText(),
874 this.pageIndex_, 850 this.pageIndex_,
875 this.model_.getGroupByDomain(),
876 this.getRangeInDays(), 851 this.getRangeInDays(),
877 offset); 852 offset);
878 }; 853 };
879 854
880 /** 855 /**
881 * Get the current offset. 856 * Get the current offset.
882 * @return {number} Current offset from the model. 857 * @return {number} Current offset from the model.
883 */ 858 */
884 HistoryView.prototype.getOffset = function() { 859 HistoryView.prototype.getOffset = function() {
885 return this.model_.offset; 860 return this.model_.offset;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 1001
1027 numberOfVisits.textContent = loadTimeData.getStringF('numberVisits', 1002 numberOfVisits.textContent = loadTimeData.getStringF('numberVisits',
1028 domainVisits.length); 1003 domainVisits.length);
1029 siteDomain.appendChild(numberOfVisits); 1004 siteDomain.appendChild(numberOfVisits);
1030 1005
1031 domainVisits[0].addFaviconToElement_(siteDomain); 1006 domainVisits[0].addFaviconToElement_(siteDomain);
1032 1007
1033 siteDomainWrapper.addEventListener('click', toggleHandler); 1008 siteDomainWrapper.addEventListener('click', toggleHandler);
1034 1009
1035 if (this.model_.isManagedProfile) { 1010 if (this.model_.isManagedProfile) {
1036 // Visit attempts don't make sense for domains so set the last parameter to 1011 siteDomainWrapper.appendChild(
1037 // false. 1012 getManagedStatusDOM(domainVisits[0].hostFilteringBehavior));
1038 siteDomainWrapper.appendChild(getManagedStatusDOM(
1039 domainVisits[0].hostManualBehavior, domainVisits[0].hostInContentPack));
1040 } 1013 }
1041 1014
1042 siteResults.appendChild(siteDomainWrapper); 1015 siteResults.appendChild(siteDomainWrapper);
1043 var resultsList = siteResults.appendChild( 1016 var resultsList = siteResults.appendChild(
1044 createElementWithClassName('ol', 'site-results')); 1017 createElementWithClassName('ol', 'site-results'));
1045 1018
1046 // Collapse until it gets toggled. 1019 // Collapse until it gets toggled.
1047 resultsList.style.height = 0; 1020 resultsList.style.height = 0;
1048 1021
1049 // Add the results for each of the domain. 1022 // Add the results for each of the domain.
1050 var isMonthGroupedResult = this.getRangeInDays() == HistoryModel.Range.MONTH; 1023 var isMonthGroupedResult = this.getRangeInDays() == HistoryModel.Range.MONTH;
1051 for (var j = 0, visit; visit = domainVisits[j]; j++) { 1024 for (var j = 0, visit; visit = domainVisits[j]; j++) {
1052 resultsList.appendChild(visit.getResultDOM({ 1025 resultsList.appendChild(visit.getResultDOM({
1053 useMonthDate: isMonthGroupedResult 1026 useMonthDate: isMonthGroupedResult
1054 })); 1027 }));
1055 this.setVisitRendered_(visit); 1028 this.setVisitRendered_(visit);
1056 } 1029 }
1057 }; 1030 };
1058 1031
1059 /** 1032 /**
1060 * Enables or disables the time range buttons. 1033 * Enables or disables the time range buttons.
1061 * @private 1034 * @private
1062 */ 1035 */
1063 HistoryView.prototype.updateRangeButtons_ = function() { 1036 HistoryView.prototype.updateRangeButtons_ = function() {
1064 // Update the range button to the current value.
1065 $('timeframe-filter').value = this.getRangeInDays();
1066
1067 // The enabled state for the previous, today and next buttons. 1037 // The enabled state for the previous, today and next buttons.
1068 var previousState = false; 1038 var previousState = false;
1069 var todayState = false; 1039 var todayState = false;
1070 var nextState = false; 1040 var nextState = false;
1071 var usePage = (this.getRangeInDays() == HistoryModel.Range.ALL_TIME); 1041 var usePage = (this.getRangeInDays() == HistoryModel.Range.ALL_TIME);
1072 1042
1073 // Use pagination for most recent visits, offset otherwise. 1043 // Use pagination for most recent visits, offset otherwise.
1074 // TODO(sergiu): Maybe send just one variable in the future. 1044 // TODO(sergiu): Maybe send just one variable in the future.
1075 if (usePage) { 1045 if (usePage) {
1076 if (this.getPage() != 0) { 1046 if (this.getPage() != 0) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1124 * @param {Array} visits Visits returned by the query. 1094 * @param {Array} visits Visits returned by the query.
1125 * @param {Element} parentElement Element to which to add the results to. 1095 * @param {Element} parentElement Element to which to add the results to.
1126 * @private 1096 * @private
1127 */ 1097 */
1128 HistoryView.prototype.addMonthResults_ = function(visits, parentElement) { 1098 HistoryView.prototype.addMonthResults_ = function(visits, parentElement) {
1129 if (visits.length == 0) 1099 if (visits.length == 0)
1130 return; 1100 return;
1131 1101
1132 var monthResults = parentElement.appendChild( 1102 var monthResults = parentElement.appendChild(
1133 createElementWithClassName('ol', 'month-results')); 1103 createElementWithClassName('ol', 'month-results'));
1104 // Don't add checkboxes if entries can not be edited.
1105 if (!this.model_.editingEntriesAllowed)
1106 monthResults.classList.add('no-checkboxes');
1107
1134 this.groupVisitsByDomain_(visits, monthResults); 1108 this.groupVisitsByDomain_(visits, monthResults);
1135 }; 1109 };
1136 1110
1137 /** 1111 /**
1138 * Adds the results for a certain day. This includes a title with the day of 1112 * Adds the results for a certain day. This includes a title with the day of
1139 * the results and the results themselves, grouped or not. 1113 * the results and the results themselves, grouped or not.
1140 * @param {Array} visits Visits returned by the query. 1114 * @param {Array} visits Visits returned by the query.
1141 * @param {Element} parentElement Element to which to add the results to. 1115 * @param {Element} parentElement Element to which to add the results to.
1142 * @private 1116 * @private
1143 */ 1117 */
1144 HistoryView.prototype.addDayResults_ = function(visits, parentElement) { 1118 HistoryView.prototype.addDayResults_ = function(visits, parentElement) {
1145 if (visits.length == 0) 1119 if (visits.length == 0)
1146 return; 1120 return;
1147 1121
1148 var firstVisit = visits[0]; 1122 var firstVisit = visits[0];
1149 var day = parentElement.appendChild(createElementWithClassName('h3', 'day')); 1123 var day = parentElement.appendChild(createElementWithClassName('h3', 'day'));
1150 day.appendChild(document.createTextNode(firstVisit.dateRelativeDay)); 1124 day.appendChild(document.createTextNode(firstVisit.dateRelativeDay));
1151 if (firstVisit.continued) { 1125 if (firstVisit.continued) {
1152 day.appendChild(document.createTextNode(' ' + 1126 day.appendChild(document.createTextNode(' ' +
1153 loadTimeData.getString('cont'))); 1127 loadTimeData.getString('cont')));
1154 } 1128 }
1155 var dayResults = parentElement.appendChild( 1129 var dayResults = parentElement.appendChild(
1156 createElementWithClassName('ol', 'day-results')); 1130 createElementWithClassName('ol', 'day-results'));
1157 1131
1132 // Don't add checkboxes if entries can not be edited.
1133 if (!this.model_.editingEntriesAllowed)
1134 dayResults.classList.add('no-checkboxes');
1135
1158 if (this.model_.getGroupByDomain()) { 1136 if (this.model_.getGroupByDomain()) {
1159 this.groupVisitsByDomain_(visits, dayResults); 1137 this.groupVisitsByDomain_(visits, dayResults);
1160 } else { 1138 } else {
1161 var lastTime; 1139 var lastTime;
1162 1140
1163 for (var i = 0, visit; visit = visits[i]; i++) { 1141 for (var i = 0, visit; visit = visits[i]; i++) {
1164 // If enough time has passed between visits, indicate a gap in browsing. 1142 // If enough time has passed between visits, indicate a gap in browsing.
1165 var thisTime = visit.date.getTime(); 1143 var thisTime = visit.date.getTime();
1166 if (lastTime && lastTime - thisTime > BROWSING_GAP_TIME) 1144 if (lastTime && lastTime - thisTime > BROWSING_GAP_TIME)
1167 dayResults.appendChild(createElementWithClassName('li', 'gap')); 1145 dayResults.appendChild(createElementWithClassName('li', 'gap'));
1168 1146
1169 // Insert the visit into the DOM. 1147 // Insert the visit into the DOM.
1170 dayResults.appendChild(visit.getResultDOM({ addTitleFavicon: true })); 1148 dayResults.appendChild(visit.getResultDOM({ addTitleFavicon: true }));
1171 this.setVisitRendered_(visit); 1149 this.setVisitRendered_(visit);
1172 1150
1173 lastTime = thisTime; 1151 lastTime = thisTime;
1174 } 1152 }
1175 } 1153 }
1176 }; 1154 };
1177 1155
1178 /** 1156 /**
1157 * Adds the text that shows the current interval, used for week and month
1158 * results.
1159 * @param {Element} resultsFragment The element to which the interval will be
1160 * added to.
1161 * @private
1162 */
1163 HistoryView.prototype.addTimeframeInterval_ = function(resultsFragment) {
1164 if (this.getRangeInDays() == HistoryModel.Range.ALL_TIME)
1165 return;
1166
1167 // If this is a time range result add some text that shows what is the
1168 // time range for the results the user is viewing.
1169 var timeFrame = resultsFragment.appendChild(
1170 createElementWithClassName('h2', 'timeframe'));
1171 // TODO(sergiu): Figure the best way to show this for the first day of
1172 // the month.
1173 timeFrame.appendChild(document.createTextNode(loadTimeData.getStringF(
1174 'historyInterval',
1175 this.model_.queryStartTime,
1176 this.model_.queryEndTime)));
1177 };
1178
1179 /**
1179 * Update the page with results. 1180 * Update the page with results.
1180 * @param {boolean} doneLoading Whether the current request is complete. 1181 * @param {boolean} doneLoading Whether the current request is complete.
1181 * @private 1182 * @private
1182 */ 1183 */
1183 HistoryView.prototype.displayResults_ = function(doneLoading) { 1184 HistoryView.prototype.displayResults_ = function(doneLoading) {
1184 // Either show a page of results received for the all time results or all the 1185 // Either show a page of results received for the all time results or all the
1185 // received results for the weekly and monthly view. 1186 // received results for the weekly and monthly view.
1186 var results = this.model_.visits_; 1187 var results = this.model_.visits_;
1187 if (this.getRangeInDays() == HistoryModel.Range.ALL_TIME) { 1188 if (this.getRangeInDays() == HistoryModel.Range.ALL_TIME) {
1188 var rangeStart = this.pageIndex_ * RESULTS_PER_PAGE; 1189 var rangeStart = this.pageIndex_ * RESULTS_PER_PAGE;
1189 var rangeEnd = rangeStart + RESULTS_PER_PAGE; 1190 var rangeEnd = rangeStart + RESULTS_PER_PAGE;
1190 results = this.model_.getNumberedRange(rangeStart, rangeEnd); 1191 results = this.model_.getNumberedRange(rangeStart, rangeEnd);
1191 } 1192 }
1192 var searchText = this.model_.getSearchText(); 1193 var searchText = this.model_.getSearchText();
1193 var groupByDomain = this.model_.getGroupByDomain(); 1194 var groupByDomain = this.model_.getGroupByDomain();
1194 1195
1195 if (searchText) { 1196 if (searchText) {
1196 // Add a header for the search results, if there isn't already one. 1197 // Add a header for the search results, if there isn't already one.
1197 if (!this.resultDiv_.querySelector('h3')) { 1198 if (!this.resultDiv_.querySelector('h3')) {
1198 var header = document.createElement('h3'); 1199 var header = document.createElement('h3');
1199 header.textContent = loadTimeData.getStringF('searchResultsFor', 1200 header.textContent = loadTimeData.getStringF('searchResultsFor',
1200 searchText); 1201 searchText);
1201 this.resultDiv_.appendChild(header); 1202 this.resultDiv_.appendChild(header);
1202 } 1203 }
1203 1204
1205 this.addTimeframeInterval_(this.resultDiv_);
1206
1204 var searchResults = createElementWithClassName('ol', 'search-results'); 1207 var searchResults = createElementWithClassName('ol', 'search-results');
1208
1209 // Don't add checkboxes if entries can not be edited.
1210 if (!this.model_.editingEntriesAllowed)
1211 searchResults.classList.add('no-checkboxes');
1212
1205 if (results.length == 0 && doneLoading) { 1213 if (results.length == 0 && doneLoading) {
1206 var noSearchResults = searchResults.appendChild( 1214 var noSearchResults = searchResults.appendChild(
1207 createElementWithClassName('div', 'no-results-message')); 1215 createElementWithClassName('div', 'no-results-message'));
1208 noSearchResults.textContent = loadTimeData.getString('noSearchResults'); 1216 noSearchResults.textContent = loadTimeData.getString('noSearchResults');
1209 } else { 1217 } else {
1210 for (var i = 0, visit; visit = results[i]; i++) { 1218 for (var i = 0, visit; visit = results[i]; i++) {
1211 if (!visit.isRendered) { 1219 if (!visit.isRendered) {
1212 searchResults.appendChild(visit.getResultDOM({ 1220 searchResults.appendChild(visit.getResultDOM({
1213 isSearchResult: true, 1221 isSearchResult: true,
1214 addTitleFavicon: true 1222 addTitleFavicon: true
1215 })); 1223 }));
1216 this.setVisitRendered_(visit); 1224 this.setVisitRendered_(visit);
1217 } 1225 }
1218 } 1226 }
1219 } 1227 }
1220 this.resultDiv_.appendChild(searchResults); 1228 this.resultDiv_.appendChild(searchResults);
1221 } else { 1229 } else {
1222 var resultsFragment = document.createDocumentFragment(); 1230 var resultsFragment = document.createDocumentFragment();
1223 1231
1224 if (this.getRangeInDays() == HistoryModel.Range.WEEK || 1232 this.addTimeframeInterval_(resultsFragment);
1225 this.getRangeInDays() == HistoryModel.Range.MONTH) {
1226 // If this is a time range result add some text that shows what is the
1227 // time range for the results the user is viewing.
1228 var timeFrame = resultsFragment.appendChild(
1229 createElementWithClassName('h2', 'timeframe'));
1230 // TODO(sergiu): Figure the best way to show this for the first day of
1231 // the month.
1232 timeFrame.appendChild(document.createTextNode(loadTimeData.getStringF(
1233 'historyInterval',
1234 this.model_.queryStartTime,
1235 this.model_.queryEndTime)));
1236 }
1237 1233
1238 if (results.length == 0 && doneLoading) { 1234 if (results.length == 0 && doneLoading) {
1239 var noResults = resultsFragment.appendChild( 1235 var noResults = resultsFragment.appendChild(
1240 createElementWithClassName('div', 'no-results-message')); 1236 createElementWithClassName('div', 'no-results-message'));
1241 noResults.textContent = loadTimeData.getString('noResults'); 1237 noResults.textContent = loadTimeData.getString('noResults');
1242 this.resultDiv_.appendChild(resultsFragment); 1238 this.resultDiv_.appendChild(resultsFragment);
1243 this.updateNavBar_(); 1239 this.updateNavBar_();
1244 return; 1240 return;
1245 } 1241 }
1246 1242
(...skipping 23 matching lines...) Expand all
1270 } 1266 }
1271 this.updateNavBar_(); 1267 this.updateNavBar_();
1272 }; 1268 };
1273 1269
1274 /** 1270 /**
1275 * Update the visibility of the page navigation buttons. 1271 * Update the visibility of the page navigation buttons.
1276 * @private 1272 * @private
1277 */ 1273 */
1278 HistoryView.prototype.updateNavBar_ = function() { 1274 HistoryView.prototype.updateNavBar_ = function() {
1279 this.updateRangeButtons_(); 1275 this.updateRangeButtons_();
1280 $('newest-button').hidden = this.pageIndex_ == 0; 1276 if (!loadTimeData.getBoolean('isManagedProfile')) {
1281 $('newer-button').hidden = this.pageIndex_ == 0; 1277 // Managed users have the control bar on top, don't show it on the bottom
1282 $('older-button').hidden = 1278 // as well.
1283 this.model_.rangeInDays_ != HistoryModel.Range.ALL_TIME || 1279 $('newest-button').hidden = this.pageIndex_ == 0;
1284 !this.model_.hasMoreResults(); 1280 $('newer-button').hidden = this.pageIndex_ == 0;
1281 $('older-button').hidden =
1282 this.model_.rangeInDays_ != HistoryModel.Range.ALL_TIME ||
1283 !this.model_.hasMoreResults();
1284 }
1285 }; 1285 };
1286 1286
1287 /** 1287 /**
1288 * Updates the visibility of the 'Clear browsing data' button. 1288 * Updates the visibility of the 'Clear browsing data' button.
1289 * Only used on mobile platforms. 1289 * Only used on mobile platforms.
1290 * @private 1290 * @private
1291 */ 1291 */
1292 HistoryView.prototype.updateClearBrowsingDataButton_ = function() { 1292 HistoryView.prototype.updateClearBrowsingDataButton_ = function() {
1293 // Ideally, we should hide the 'Clear browsing data' button whenever the 1293 // Ideally, we should hide the 'Clear browsing data' button whenever the
1294 // soft keyboard is visible. This is not possible, so instead, hide the 1294 // soft keyboard is visible. This is not possible, so instead, hide the
(...skipping 20 matching lines...) Expand all
1315 this.view = view; 1315 this.view = view;
1316 1316
1317 if (typeof this.checker_ != 'undefined' && this.checker_) { 1317 if (typeof this.checker_ != 'undefined' && this.checker_) {
1318 clearInterval(this.checker_); 1318 clearInterval(this.checker_);
1319 } 1319 }
1320 1320
1321 // TODO(glen): Replace this with a bound method so we don't need 1321 // TODO(glen): Replace this with a bound method so we don't need
1322 // public model and view. 1322 // public model and view.
1323 this.checker_ = window.setInterval(function(stateObj) { 1323 this.checker_ = window.setInterval(function(stateObj) {
1324 var hashData = stateObj.getHashData(); 1324 var hashData = stateObj.getHashData();
1325 var isGroupedByDomain = hashData.grouped == 'true';
1326 var page = parseInt(hashData.page, 10); 1325 var page = parseInt(hashData.page, 10);
1327 var range = parseInt(hashData.range, 10); 1326 var range = parseInt(hashData.range, 10);
1328 var offset = parseInt(hashData.offset, 10); 1327 var offset = parseInt(hashData.offset, 10);
1329 if (hashData.q != stateObj.model.getSearchText() || 1328 if (hashData.q != stateObj.model.getSearchText() ||
1330 page != stateObj.view.getPage() || 1329 page != stateObj.view.getPage() ||
1331 isGroupedByDomain != stateObj.view.model_.getGroupByDomain() ||
1332 range != stateObj.model.rangeInDays || 1330 range != stateObj.model.rangeInDays ||
1333 offset != stateObj.model.offset) { 1331 offset != stateObj.model.offset) {
1334 stateObj.view.setPageState(hashData.q, page, isGroupedByDomain, 1332 stateObj.view.setPageState(hashData.q, page, range, offset);
1335 range, offset);
1336 } 1333 }
1337 }, 50, this); 1334 }, 50, this);
1338 } 1335 }
1339 1336
1340 /** 1337 /**
1341 * Holds the singleton instance. 1338 * Holds the singleton instance.
1342 */ 1339 */
1343 PageState.instance = null; 1340 PageState.instance = null;
1344 1341
1345 /** 1342 /**
(...skipping 21 matching lines...) Expand all
1367 1364
1368 return result; 1365 return result;
1369 }; 1366 };
1370 1367
1371 /** 1368 /**
1372 * Set the hash to a specified state, this will create an entry in the 1369 * Set the hash to a specified state, this will create an entry in the
1373 * session history so the back button cycles through hash states, which 1370 * session history so the back button cycles through hash states, which
1374 * are then picked up by our listener. 1371 * are then picked up by our listener.
1375 * @param {string} term The current search string. 1372 * @param {string} term The current search string.
1376 * @param {number} page The page currently being viewed. 1373 * @param {number} page The page currently being viewed.
1377 * @param {boolean} grouped Whether the results are grouped or not.
1378 * @param {HistoryModel.Range} range The range to view or search over. 1374 * @param {HistoryModel.Range} range The range to view or search over.
1379 * @param {number} offset Set the begining of the query to the specific offset. 1375 * @param {number} offset Set the begining of the query to the specific offset.
1380 */ 1376 */
1381 PageState.prototype.setUIState = function(term, page, grouped, range, offset) { 1377 PageState.prototype.setUIState = function(term, page, range, offset) {
1382 // Make sure the form looks pretty. 1378 // Make sure the form looks pretty.
1383 $('search-field').value = term; 1379 $('search-field').value = term;
1384 $('group-by-domain').checked = grouped;
1385 var hash = this.getHashData(); 1380 var hash = this.getHashData();
1386 if (hash.q != term || hash.page != page || hash.grouped != grouped || 1381 if (hash.q != term || hash.page != page || hash.range != range ||
1387 hash.range != range || hash.offset != offset) { 1382 hash.offset != offset) {
1388 window.location.hash = PageState.getHashString( 1383 window.location.hash = PageState.getHashString(term, page, range, offset);
1389 term, page, grouped, range, offset);
1390 } 1384 }
1391 }; 1385 };
1392 1386
1393 /** 1387 /**
1394 * Static method to get the hash string for a specified state 1388 * Static method to get the hash string for a specified state
1395 * @param {string} term The current search string. 1389 * @param {string} term The current search string.
1396 * @param {number} page The page currently being viewed. 1390 * @param {number} page The page currently being viewed.
1397 * @param {boolean} grouped Whether the results are grouped or not.
1398 * @param {HistoryModel.Range} range The range to view or search over. 1391 * @param {HistoryModel.Range} range The range to view or search over.
1399 * @param {number} offset Set the begining of the query to the specific offset. 1392 * @param {number} offset Set the begining of the query to the specific offset.
1400 * @return {string} The string to be used in a hash. 1393 * @return {string} The string to be used in a hash.
1401 */ 1394 */
1402 PageState.getHashString = function(term, page, grouped, range, offset) { 1395 PageState.getHashString = function(term, page, range, offset) {
1403 // Omit elements that are empty. 1396 // Omit elements that are empty.
1404 var newHash = []; 1397 var newHash = [];
1405 1398
1406 if (term) 1399 if (term)
1407 newHash.push('q=' + encodeURIComponent(term)); 1400 newHash.push('q=' + encodeURIComponent(term));
1408 1401
1409 if (page) 1402 if (page)
1410 newHash.push('page=' + page); 1403 newHash.push('page=' + page);
1411 1404
1412 if (grouped)
1413 newHash.push('grouped=' + grouped);
1414
1415 if (range) 1405 if (range)
1416 newHash.push('range=' + range); 1406 newHash.push('range=' + range);
1417 1407
1418 if (offset) 1408 if (offset)
1419 newHash.push('offset=' + offset); 1409 newHash.push('offset=' + offset);
1420 1410
1421 return newHash.join('&'); 1411 return newHash.join('&');
1422 }; 1412 };
1423 1413
1424 /////////////////////////////////////////////////////////////////////////////// 1414 ///////////////////////////////////////////////////////////////////////////////
1425 // Document Functions: 1415 // Document Functions:
1426 /** 1416 /**
1427 * Window onload handler, sets up the page. 1417 * Window onload handler, sets up the page.
1428 */ 1418 */
1429 function load() { 1419 function load() {
1430 uber.onContentFrameLoaded(); 1420 uber.onContentFrameLoaded();
1431 1421
1432 var searchField = $('search-field'); 1422 var searchField = $('search-field');
1433 1423
1434 historyModel = new HistoryModel(); 1424 historyModel = new HistoryModel();
1435 historyView = new HistoryView(historyModel); 1425 historyView = new HistoryView(historyModel);
1436 pageState = new PageState(historyModel, historyView); 1426 pageState = new PageState(historyModel, historyView);
1437 1427
1438 // Create default view. 1428 // Create default view.
1439 var hashData = pageState.getHashData(); 1429 var hashData = pageState.getHashData();
1440 var grouped = (hashData.grouped == 'true') || historyModel.getGroupByDomain(); 1430 var grouped = (hashData.grouped == 'true') || historyModel.getGroupByDomain();
1441 var page = parseInt(hashData.page, 10) || historyView.getPage(); 1431 var page = parseInt(hashData.page, 10) || historyView.getPage();
1442 var range = parseInt(hashData.range, 10) || historyView.getRangeInDays(); 1432 var range = parseInt(hashData.range, 10) || historyView.getRangeInDays();
1443 var offset = parseInt(hashData.offset, 10) || historyView.getOffset(); 1433 var offset = parseInt(hashData.offset, 10) || historyView.getOffset();
1444 historyView.setPageState(hashData.q, page, grouped, range, offset); 1434 historyView.setPageState(hashData.q, page, range, offset);
1445 1435
1446 if ($('overlay')) 1436 if ($('overlay'))
1447 cr.ui.overlay.setupOverlay($('overlay')); 1437 cr.ui.overlay.setupOverlay($('overlay'));
1448 1438
1449 var doSearch = function(e) { 1439 var doSearch = function(e) {
1450 // Disable the group by domain control when a search is active.
1451 $('group-by-domain').disabled = (searchField.value != '');
1452 historyView.setSearch(searchField.value); 1440 historyView.setSearch(searchField.value);
1453 1441
1454 if (isMobileVersion()) 1442 if (isMobileVersion())
1455 searchField.blur(); // Dismiss the keyboard. 1443 searchField.blur(); // Dismiss the keyboard.
1456 }; 1444 };
1457 1445
1458 var mayRemoveVisits = loadTimeData.getBoolean('allowDeletingHistory'); 1446 var mayRemoveVisits = loadTimeData.getBoolean('allowDeletingHistory');
1459 $('remove-visit').disabled = !mayRemoveVisits; 1447 $('remove-visit').disabled = !mayRemoveVisits;
1460 1448
1461 if (mayRemoveVisits) { 1449 if (mayRemoveVisits) {
1462 $('remove-visit').addEventListener('activate', function(e) { 1450 $('remove-visit').addEventListener('activate', function(e) {
1463 activeVisit.removeFromHistory(); 1451 activeVisit.removeFromHistory();
1464 activeVisit = null; 1452 activeVisit = null;
1465 }); 1453 });
1466 } 1454 }
1467 1455
1468 searchField.addEventListener('search', doSearch); 1456 searchField.addEventListener('search', doSearch);
1469 $('search-button').addEventListener('click', doSearch); 1457 $('search-button').addEventListener('click', doSearch);
1470 1458
1471 $('more-from-site').addEventListener('activate', function(e) { 1459 $('more-from-site').addEventListener('activate', function(e) {
1472 activeVisit.showMoreFromSite_(); 1460 activeVisit.showMoreFromSite_();
1473 activeVisit = null; 1461 activeVisit = null;
1474 }); 1462 });
1475 1463
1476 // Only show the controls if the command line switch is activated. 1464 // Only show the controls if the command line switch is activated.
1477 if (loadTimeData.getBoolean('groupByDomain') || 1465 if (loadTimeData.getBoolean('groupByDomain') ||
1478 loadTimeData.getBoolean('isManagedProfile')) { 1466 loadTimeData.getBoolean('isManagedProfile')) {
1467 // Hide the top container which has the "Clear browsing data" and "Remove
1468 // selected entries" buttons since they're unavailable in managed mode
1469 $('top-container').hidden = true;
1470 $('history-page').classList.add('big-topbar-page');
1479 $('filter-controls').hidden = false; 1471 $('filter-controls').hidden = false;
1480 } 1472 }
1481 1473
1482 var title = loadTimeData.getString('title'); 1474 var title = loadTimeData.getString('title');
1483 uber.invokeMethodOnParent('setTitle', {title: title}); 1475 uber.invokeMethodOnParent('setTitle', {title: title});
1484 1476
1485 // Adjust the position of the notification bar when the window size changes. 1477 // Adjust the position of the notification bar when the window size changes.
1486 window.addEventListener('resize', 1478 window.addEventListener('resize',
1487 historyView.positionNotificationBar.bind(historyView)); 1479 historyView.positionNotificationBar.bind(historyView));
1488 1480
(...skipping 19 matching lines...) Expand all
1508 } else { 1500 } else {
1509 window.addEventListener('message', function(e) { 1501 window.addEventListener('message', function(e) {
1510 if (e.data.method == 'frameSelected') 1502 if (e.data.method == 'frameSelected')
1511 searchField.focus(); 1503 searchField.focus();
1512 }); 1504 });
1513 searchField.focus(); 1505 searchField.focus();
1514 } 1506 }
1515 } 1507 }
1516 1508
1517 /** 1509 /**
1518 * Updates the whitelist status labels of a host/URL entry to the current 1510 * Updates the managed filter status labels of a host/URL entry to the current
1519 * value. 1511 * value.
1520 * @param {Element} statusElement The div which contains the status labels. 1512 * @param {Element} statusElement The div which contains the status labels.
1521 * @param {Object} newStatus A dictionary with two entries: 1513 * @param {ManagedModeFilteringBehavior} newStatus The filter status of the
1522 * - |inContentPack|: whether the current domain/URL is allowed by a 1514 * current domain/URL.
1523 * content pack.
1524 * - |manualBehavior|: The manual status of the current domain/URL.
1525 */ 1515 */
1526 function updateHostStatus(statusElement, newStatus) { 1516 function updateHostStatus(statusElement, newStatus) {
1527 var inContentPackDiv = statusElement.querySelector('.in-content-pack'); 1517 var filteringBehaviorDiv =
1528 inContentPackDiv.className = 'in-content-pack'; 1518 statusElement.querySelector('.filtering-behavior');
1529 1519 // Reset to the base class first, then add modifier classes if needed.
1530 if (newStatus['inContentPack']) { 1520 filteringBehaviorDiv.className = 'filtering-behavior';
1531 if (newStatus['manualBehavior'] != ManagedModeManualBehavior.NONE) 1521 if (newStatus == ManagedModeFilteringBehavior.BLOCK) {
1532 inContentPackDiv.classList.add('in-content-pack-passive'); 1522 filteringBehaviorDiv.textContent =
1533 else 1523 loadTimeData.getString('filterBlocked');
1534 inContentPackDiv.classList.add('in-content-pack-active'); 1524 filteringBehaviorDiv.classList.add('filter-blocked');
1535 } 1525 } else {
1536 1526 filteringBehaviorDiv.textContent = '';
1537 if ('manualBehavior' in newStatus) {
1538 var manualBehaviorDiv = statusElement.querySelector('.manual-behavior');
1539 // Reset to the base class first, then add modifier classes if needed.
1540 manualBehaviorDiv.className = 'manual-behavior';
1541 switch (newStatus['manualBehavior']) {
1542 case ManagedModeManualBehavior.NONE:
1543 manualBehaviorDiv.textContent = '';
1544 break;
1545 case ManagedModeManualBehavior.ALLOW:
1546 manualBehaviorDiv.textContent = loadTimeData.getString('filterAllowed');
1547 manualBehaviorDiv.classList.add('filter-allowed');
1548 break;
1549 case ManagedModeManualBehavior.BLOCK:
1550 manualBehaviorDiv.textContent = loadTimeData.getString('filterBlocked');
1551 manualBehaviorDiv.classList.add('filter-blocked');
1552 break;
1553 }
1554 } 1527 }
1555 } 1528 }
1556 1529
1557 /** 1530 /**
1558 * Click handler for the 'Clear browsing data' dialog. 1531 * Click handler for the 'Clear browsing data' dialog.
1559 * @param {Event} e The click event. 1532 * @param {Event} e The click event.
1560 */ 1533 */
1561 function openClearBrowsingData(e) { 1534 function openClearBrowsingData(e) {
1562 chrome.send('clearBrowsingData'); 1535 chrome.send('clearBrowsingData');
1563 } 1536 }
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1783 innerArrow.classList.add('expand'); 1756 innerArrow.classList.add('expand');
1784 } else { 1757 } else {
1785 innerResultList.style.height = 0; 1758 innerResultList.style.height = 0;
1786 innerArrow.classList.remove('expand'); 1759 innerArrow.classList.remove('expand');
1787 innerArrow.classList.add('collapse'); 1760 innerArrow.classList.add('collapse');
1788 } 1761 }
1789 } 1762 }
1790 1763
1791 /** 1764 /**
1792 * Builds the DOM elements to show the managed status of a domain/URL. 1765 * Builds the DOM elements to show the managed status of a domain/URL.
1793 * @param {ManagedModeManualBehavior} manualBehavior The manual behavior for 1766 * @param {ManagedModeFilteringBehavior} filteringBehavior The filter behavior
1794 * this item. 1767 * for this item.
1795 * @param {boolean} inContentPack Whether this element is in a content pack or
1796 * not.
1797 * @return {Element} Returns the DOM elements which show the status. 1768 * @return {Element} Returns the DOM elements which show the status.
1798 */ 1769 */
1799 function getManagedStatusDOM(manualBehavior, inContentPack) { 1770 function getManagedStatusDOM(filteringBehavior) {
1800 var filterStatusDiv = createElementWithClassName('div', 'filter-status'); 1771 var filterStatusDiv = createElementWithClassName('div', 'filter-status');
1801 var inContentPackDiv = createElementWithClassName('div', 'in-content-pack'); 1772 var filteringBehaviorDiv =
1802 inContentPackDiv.textContent = loadTimeData.getString('inContentPack'); 1773 createElementWithClassName('div', 'filtering-behavior');
1803 var manualBehaviorDiv = createElementWithClassName('div', 'manual-behavior'); 1774 filterStatusDiv.appendChild(filteringBehaviorDiv);
1804 filterStatusDiv.appendChild(inContentPackDiv);
1805 filterStatusDiv.appendChild(manualBehaviorDiv);
1806 1775
1807 updateHostStatus(filterStatusDiv, { 1776 updateHostStatus(filterStatusDiv, filteringBehavior);
1808 'inContentPack' : inContentPack,
1809 'manualBehavior' : manualBehavior
1810 });
1811 return filterStatusDiv; 1777 return filterStatusDiv;
1812 } 1778 }
1813 1779
1814 1780
1815 /////////////////////////////////////////////////////////////////////////////// 1781 ///////////////////////////////////////////////////////////////////////////////
1816 // Chrome callbacks: 1782 // Chrome callbacks:
1817 1783
1818 /** 1784 /**
1819 * Our history system calls this function with results from searches. 1785 * Our history system calls this function with results from searches.
1820 * @param {Object} info An object containing information about the query. 1786 * @param {Object} info An object containing information about the query.
(...skipping 28 matching lines...) Expand all
1849 historyView.reload(); 1815 historyView.reload();
1850 } 1816 }
1851 1817
1852 // Add handlers to HTML elements. 1818 // Add handlers to HTML elements.
1853 document.addEventListener('DOMContentLoaded', load); 1819 document.addEventListener('DOMContentLoaded', load);
1854 1820
1855 // This event lets us enable and disable menu items before the menu is shown. 1821 // This event lets us enable and disable menu items before the menu is shown.
1856 document.addEventListener('canExecute', function(e) { 1822 document.addEventListener('canExecute', function(e) {
1857 e.canExecute = true; 1823 e.canExecute = true;
1858 }); 1824 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698