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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/history/history.js
diff --git a/chrome/browser/resources/history/history.js b/chrome/browser/resources/history/history.js
index 27acef87abaeb913a7dd9b138952124ac1478f04..f21b225ff503d91f2bdde6a4b37788ba422e58b0 100644
--- a/chrome/browser/resources/history/history.js
+++ b/chrome/browser/resources/history/history.js
@@ -25,14 +25,13 @@ var activeVisit = null;
/** @const */ var MenuButton = cr.ui.MenuButton;
/**
- * Enum that shows whether a manual exception is set in managed mode for a
- * host or URL.
- * Must behave like the ManualBehavior enum from managed_user_service.h.
+ * Enum that shows the filtering behavior for a host or URL to a managed user.
+ * Must behave like the FilteringBehavior enum from managed_mode_url_filter.h.
* @enum {number}
*/
-ManagedModeManualBehavior = {
- NONE: 0,
- ALLOW: 1,
+ManagedModeFilteringBehavior = {
+ ALLOW: 0,
+ WARN: 1,
BLOCK: 2
};
@@ -86,16 +85,13 @@ function Visit(result, continued, model) {
this.dateTimeOfDay = result.dateTimeOfDay || '';
this.dateShort = result.dateShort || '';
- // These values represent indicators shown to users in managed mode.
- // |*manualBehavior| shows whether the user has manually added an exception
- // for that URL or host while |*inContentPack| shows whether that URL or host
- // is in a content pack or not.
- this.urlManualBehavior = result.urlManualBehavior ||
- ManagedModeManualBehavior.NONE;
- this.hostManualBehavior = result.hostManualBehavior ||
- ManagedModeManualBehavior.NONE;
- this.urlInContentPack = result.urlInContentPack || false;
- this.hostInContentPack = result.hostInContentPack || false;
+ // Shows the filtering behavior for that host (only used for managed users).
+ // A value of |ManagedModeFilteringBehavior.ALLOW| is not displayed so it is
+ // used as the default value.
+ this.hostFilteringBehavior = ManagedModeFilteringBehavior.ALLOW;
+ if (typeof result.hostFilteringBehavior != 'undefined')
+ this.hostFilteringBehavior = result.hostFilteringBehavior;
+
this.blockedVisit = result.blockedVisit || false;
// Whether this is the continuation of a previous day.
@@ -168,17 +164,18 @@ Visit.prototype.getResultDOM = function(propertyBag) {
}
entryBox.appendChild(bookmarkSection);
- var titleAndDomainWrapper = entryBox.appendChild(
- createElementWithClassName('div', 'title-and-domain'));
+ var visitEntryWrapper = entryBox.appendChild(document.createElement('div'));
+ if (addTitleFavicon || this.blockedVisit)
+ visitEntryWrapper.classList.add('visit-entry');
if (this.blockedVisit) {
- titleAndDomainWrapper.classList.add('blocked-indicator');
- titleAndDomainWrapper.appendChild(this.getVisitAttemptDOM_());
+ visitEntryWrapper.classList.add('blocked-indicator');
+ visitEntryWrapper.appendChild(this.getVisitAttemptDOM_());
} else {
- titleAndDomainWrapper.appendChild(this.getTitleDOM_());
+ visitEntryWrapper.appendChild(this.getTitleDOM_());
if (addTitleFavicon)
- this.addFaviconToElement_(titleAndDomainWrapper);
+ this.addFaviconToElement_(visitEntryWrapper);
+ visitEntryWrapper.appendChild(domain);
}
- titleAndDomainWrapper.appendChild(domain);
if (isMobileVersion()) {
var removeButton = createElementWithClassName('button', 'remove-entry');
@@ -221,11 +218,6 @@ Visit.prototype.getResultDOM = function(propertyBag) {
createElementWithClassName('div', 'entry-box-container');
node.appendChild(entryBoxContainer);
entryBoxContainer.appendChild(entryBox);
- if (!isSearchResult && this.model_.isManagedProfile &&
- this.model_.getGroupByDomain()) {
- entryBoxContainer.appendChild(
- getManagedStatusDOM(this.urlManualBehavior, this.urlInContentPack));
- }
if (isSearchResult) {
time.appendChild(document.createTextNode(this.dateShort));
@@ -334,7 +326,9 @@ Visit.prototype.getTitleDOM_ = function() {
Visit.prototype.getVisitAttemptDOM_ = function() {
var node = createElementWithClassName('div', 'title');
node.innerHTML = loadTimeData.getStringF('blockedVisitText',
- this.url_, this.id_);
+ this.url_,
+ this.id_,
+ this.getDomainFromURL_(this.url_));
return node;
};
@@ -580,14 +574,10 @@ HistoryModel.prototype.clearModel_ = function() {
// Only create checkboxes for editing entries if they can be used either to
// delete an entry or to block/allow it.
- this.editingEntriesAllowed = this.deletingHistoryAllowed ||
- this.isManagedProfile;
+ this.editingEntriesAllowed = this.deletingHistoryAllowed;
// Flag to show that the results are grouped by domain or not.
this.groupByDomain_ = false;
- // Group domains by default for managed users.
- if (this.isManagedProfile)
- this.groupByDomain_ = true;
this.visits_ = []; // Date-sorted list of visits (most recent first).
this.nextVisitId_ = 0;
@@ -733,14 +723,15 @@ function HistoryView(model) {
self.setPage(self.pageIndex_ + 1);
});
- // Add handlers for the range options.
- $('timeframe-filter').addEventListener('change', function(e) {
+ var handleRangeChange = function(e) {
+ // Update the results and save the last state.
self.setRangeInDays(parseInt(e.target.value, 10));
- });
+ };
- $('group-by-domain').addEventListener('click', function(e) {
- self.setGroupByDomain($('group-by-domain').checked);
- });
+ // Add handlers for the range options.
+ $('timeframe-filter-all').addEventListener('change', handleRangeChange);
+ $('timeframe-filter-week').addEventListener('change', handleRangeChange);
+ $('timeframe-filter-month').addEventListener('change', handleRangeChange);
$('range-previous').addEventListener('click', function(e) {
if (self.getRangeInDays() == HistoryModel.Range.ALL_TIME)
@@ -769,19 +760,7 @@ function HistoryView(model) {
*/
HistoryView.prototype.setSearch = function(term) {
window.scrollTo(0, 0);
- this.setPageState(term, 0, this.model_.getGroupByDomain(),
- this.getRangeInDays(), this.getOffset());
-};
-
-/**
- * Enable or disable results as being grouped by domain.
- * @param {boolean} groupedByDomain Whether to group by domain or not.
- */
-HistoryView.prototype.setGroupByDomain = function(groupedByDomain) {
- // Group by domain is not currently supported for search results, so reset
- // the search term if there was one.
- this.setPageState('', this.pageIndex_, groupedByDomain, this.getRangeInDays(),
- this.getOffset());
+ this.setPageState(term, 0, this.getRangeInDays(), this.getOffset());
};
/**
@@ -798,23 +777,22 @@ HistoryView.prototype.reload = function() {
* update the results.
* @param {string} searchText The search string to set.
* @param {number} page The page to be viewed.
- * @param {boolean} groupByDomain Whether the results are grouped or not.
* @param {HistoryModel.Range} range The range to view or search over.
* @param {number} offset Set the begining of the query to the specific offset.
*/
-HistoryView.prototype.setPageState = function(searchText, page, groupByDomain,
- range, offset) {
+HistoryView.prototype.setPageState = function(searchText, page, range, offset) {
this.clear_();
this.model_.searchText_ = searchText;
this.pageIndex_ = page;
this.model_.requestedPage_ = page;
- this.model_.groupByDomain_ = groupByDomain;
this.model_.rangeInDays_ = range;
+ this.model_.groupByDomain_ = false;
+ if (range != HistoryModel.Range.ALL_TIME)
+ this.model_.groupByDomain_ = true;
this.model_.offset_ = offset;
this.reload();
pageState.setUIState(this.model_.getSearchText(),
this.pageIndex_,
- this.model_.getGroupByDomain(),
this.getRangeInDays(),
this.getOffset());
};
@@ -832,7 +810,6 @@ HistoryView.prototype.setPage = function(page) {
this.model_.requestPage(page);
pageState.setUIState(this.model_.getSearchText(),
this.pageIndex_,
- this.model_.getGroupByDomain(),
this.getRangeInDays(),
this.getOffset());
};
@@ -850,8 +827,7 @@ HistoryView.prototype.getPage = function() {
*/
HistoryView.prototype.setRangeInDays = function(range) {
// Set the range, offset and reset the page.
- this.setPageState(this.model_.getSearchText(), 0,
- this.model_.getGroupByDomain(), range, 0);
+ this.setPageState(this.model_.getSearchText(), 0, range, 0);
};
/**
@@ -872,7 +848,6 @@ HistoryView.prototype.setOffset = function(offset) {
return;
this.setPageState(this.model_.getSearchText(),
this.pageIndex_,
- this.model_.getGroupByDomain(),
this.getRangeInDays(),
offset);
};
@@ -1033,10 +1008,8 @@ HistoryView.prototype.getGroupedVisitsDOM_ = function(
siteDomainWrapper.addEventListener('click', toggleHandler);
if (this.model_.isManagedProfile) {
- // Visit attempts don't make sense for domains so set the last parameter to
- // false.
- siteDomainWrapper.appendChild(getManagedStatusDOM(
- domainVisits[0].hostManualBehavior, domainVisits[0].hostInContentPack));
+ siteDomainWrapper.appendChild(
+ getManagedStatusDOM(domainVisits[0].hostFilteringBehavior));
}
siteResults.appendChild(siteDomainWrapper);
@@ -1061,9 +1034,6 @@ HistoryView.prototype.getGroupedVisitsDOM_ = function(
* @private
*/
HistoryView.prototype.updateRangeButtons_ = function() {
- // Update the range button to the current value.
- $('timeframe-filter').value = this.getRangeInDays();
-
// The enabled state for the previous, today and next buttons.
var previousState = false;
var todayState = false;
@@ -1131,6 +1101,10 @@ HistoryView.prototype.addMonthResults_ = function(visits, parentElement) {
var monthResults = parentElement.appendChild(
createElementWithClassName('ol', 'month-results'));
+ // Don't add checkboxes if entries can not be edited.
+ if (!this.model_.editingEntriesAllowed)
+ monthResults.classList.add('no-checkboxes');
+
this.groupVisitsByDomain_(visits, monthResults);
};
@@ -1155,6 +1129,10 @@ HistoryView.prototype.addDayResults_ = function(visits, parentElement) {
var dayResults = parentElement.appendChild(
createElementWithClassName('ol', 'day-results'));
+ // Don't add checkboxes if entries can not be edited.
+ if (!this.model_.editingEntriesAllowed)
+ dayResults.classList.add('no-checkboxes');
+
if (this.model_.getGroupByDomain()) {
this.groupVisitsByDomain_(visits, dayResults);
} else {
@@ -1176,6 +1154,29 @@ HistoryView.prototype.addDayResults_ = function(visits, parentElement) {
};
/**
+ * Adds the text that shows the current interval, used for week and month
+ * results.
+ * @param {Element} resultsFragment The element to which the interval will be
+ * added to.
+ * @private
+ */
+HistoryView.prototype.addTimeframeInterval_ = function(resultsFragment) {
+ if (this.getRangeInDays() == HistoryModel.Range.ALL_TIME)
+ return;
+
+ // If this is a time range result add some text that shows what is the
+ // time range for the results the user is viewing.
+ var timeFrame = resultsFragment.appendChild(
+ createElementWithClassName('h2', 'timeframe'));
+ // TODO(sergiu): Figure the best way to show this for the first day of
+ // the month.
+ timeFrame.appendChild(document.createTextNode(loadTimeData.getStringF(
+ 'historyInterval',
+ this.model_.queryStartTime,
+ this.model_.queryEndTime)));
+};
+
+/**
* Update the page with results.
* @param {boolean} doneLoading Whether the current request is complete.
* @private
@@ -1201,7 +1202,14 @@ HistoryView.prototype.displayResults_ = function(doneLoading) {
this.resultDiv_.appendChild(header);
}
+ this.addTimeframeInterval_(this.resultDiv_);
+
var searchResults = createElementWithClassName('ol', 'search-results');
+
+ // Don't add checkboxes if entries can not be edited.
+ if (!this.model_.editingEntriesAllowed)
+ searchResults.classList.add('no-checkboxes');
+
if (results.length == 0 && doneLoading) {
var noSearchResults = searchResults.appendChild(
createElementWithClassName('div', 'no-results-message'));
@@ -1221,19 +1229,7 @@ HistoryView.prototype.displayResults_ = function(doneLoading) {
} else {
var resultsFragment = document.createDocumentFragment();
- if (this.getRangeInDays() == HistoryModel.Range.WEEK ||
- this.getRangeInDays() == HistoryModel.Range.MONTH) {
- // If this is a time range result add some text that shows what is the
- // time range for the results the user is viewing.
- var timeFrame = resultsFragment.appendChild(
- createElementWithClassName('h2', 'timeframe'));
- // TODO(sergiu): Figure the best way to show this for the first day of
- // the month.
- timeFrame.appendChild(document.createTextNode(loadTimeData.getStringF(
- 'historyInterval',
- this.model_.queryStartTime,
- this.model_.queryEndTime)));
- }
+ this.addTimeframeInterval_(resultsFragment);
if (results.length == 0 && doneLoading) {
var noResults = resultsFragment.appendChild(
@@ -1277,11 +1273,15 @@ HistoryView.prototype.displayResults_ = function(doneLoading) {
*/
HistoryView.prototype.updateNavBar_ = function() {
this.updateRangeButtons_();
- $('newest-button').hidden = this.pageIndex_ == 0;
- $('newer-button').hidden = this.pageIndex_ == 0;
- $('older-button').hidden =
- this.model_.rangeInDays_ != HistoryModel.Range.ALL_TIME ||
- !this.model_.hasMoreResults();
+ if (!loadTimeData.getBoolean('isManagedProfile')) {
+ // Managed users have the control bar on top, don't show it on the bottom
+ // as well.
+ $('newest-button').hidden = this.pageIndex_ == 0;
+ $('newer-button').hidden = this.pageIndex_ == 0;
+ $('older-button').hidden =
+ this.model_.rangeInDays_ != HistoryModel.Range.ALL_TIME ||
+ !this.model_.hasMoreResults();
+ }
};
/**
@@ -1322,17 +1322,14 @@ function PageState(model, view) {
// public model and view.
this.checker_ = window.setInterval(function(stateObj) {
var hashData = stateObj.getHashData();
- var isGroupedByDomain = hashData.grouped == 'true';
var page = parseInt(hashData.page, 10);
var range = parseInt(hashData.range, 10);
var offset = parseInt(hashData.offset, 10);
if (hashData.q != stateObj.model.getSearchText() ||
page != stateObj.view.getPage() ||
- isGroupedByDomain != stateObj.view.model_.getGroupByDomain() ||
range != stateObj.model.rangeInDays ||
offset != stateObj.model.offset) {
- stateObj.view.setPageState(hashData.q, page, isGroupedByDomain,
- range, offset);
+ stateObj.view.setPageState(hashData.q, page, range, offset);
}
}, 50, this);
}
@@ -1374,19 +1371,16 @@ PageState.prototype.getHashData = function() {
* are then picked up by our listener.
* @param {string} term The current search string.
* @param {number} page The page currently being viewed.
- * @param {boolean} grouped Whether the results are grouped or not.
* @param {HistoryModel.Range} range The range to view or search over.
* @param {number} offset Set the begining of the query to the specific offset.
*/
-PageState.prototype.setUIState = function(term, page, grouped, range, offset) {
+PageState.prototype.setUIState = function(term, page, range, offset) {
// Make sure the form looks pretty.
$('search-field').value = term;
- $('group-by-domain').checked = grouped;
var hash = this.getHashData();
- if (hash.q != term || hash.page != page || hash.grouped != grouped ||
- hash.range != range || hash.offset != offset) {
- window.location.hash = PageState.getHashString(
- term, page, grouped, range, offset);
+ if (hash.q != term || hash.page != page || hash.range != range ||
+ hash.offset != offset) {
+ window.location.hash = PageState.getHashString(term, page, range, offset);
}
};
@@ -1394,12 +1388,11 @@ PageState.prototype.setUIState = function(term, page, grouped, range, offset) {
* Static method to get the hash string for a specified state
* @param {string} term The current search string.
* @param {number} page The page currently being viewed.
- * @param {boolean} grouped Whether the results are grouped or not.
* @param {HistoryModel.Range} range The range to view or search over.
* @param {number} offset Set the begining of the query to the specific offset.
* @return {string} The string to be used in a hash.
*/
-PageState.getHashString = function(term, page, grouped, range, offset) {
+PageState.getHashString = function(term, page, range, offset) {
// Omit elements that are empty.
var newHash = [];
@@ -1409,9 +1402,6 @@ PageState.getHashString = function(term, page, grouped, range, offset) {
if (page)
newHash.push('page=' + page);
- if (grouped)
- newHash.push('grouped=' + grouped);
-
if (range)
newHash.push('range=' + range);
@@ -1441,14 +1431,12 @@ function load() {
var page = parseInt(hashData.page, 10) || historyView.getPage();
var range = parseInt(hashData.range, 10) || historyView.getRangeInDays();
var offset = parseInt(hashData.offset, 10) || historyView.getOffset();
- historyView.setPageState(hashData.q, page, grouped, range, offset);
+ historyView.setPageState(hashData.q, page, range, offset);
if ($('overlay'))
cr.ui.overlay.setupOverlay($('overlay'));
var doSearch = function(e) {
- // Disable the group by domain control when a search is active.
- $('group-by-domain').disabled = (searchField.value != '');
historyView.setSearch(searchField.value);
if (isMobileVersion())
@@ -1476,6 +1464,10 @@ function load() {
// Only show the controls if the command line switch is activated.
if (loadTimeData.getBoolean('groupByDomain') ||
loadTimeData.getBoolean('isManagedProfile')) {
+ // Hide the top container which has the "Clear browsing data" and "Remove
+ // selected entries" buttons since they're unavailable in managed mode
+ $('top-container').hidden = true;
+ $('history-page').classList.add('big-topbar-page');
$('filter-controls').hidden = false;
}
@@ -1515,42 +1507,23 @@ function load() {
}
/**
- * Updates the whitelist status labels of a host/URL entry to the current
+ * Updates the managed filter status labels of a host/URL entry to the current
* value.
* @param {Element} statusElement The div which contains the status labels.
- * @param {Object} newStatus A dictionary with two entries:
- * - |inContentPack|: whether the current domain/URL is allowed by a
- * content pack.
- * - |manualBehavior|: The manual status of the current domain/URL.
+ * @param {ManagedModeFilteringBehavior} newStatus The filter status of the
+ * current domain/URL.
*/
function updateHostStatus(statusElement, newStatus) {
- var inContentPackDiv = statusElement.querySelector('.in-content-pack');
- inContentPackDiv.className = 'in-content-pack';
-
- if (newStatus['inContentPack']) {
- if (newStatus['manualBehavior'] != ManagedModeManualBehavior.NONE)
- inContentPackDiv.classList.add('in-content-pack-passive');
- else
- inContentPackDiv.classList.add('in-content-pack-active');
- }
-
- if ('manualBehavior' in newStatus) {
- var manualBehaviorDiv = statusElement.querySelector('.manual-behavior');
- // Reset to the base class first, then add modifier classes if needed.
- manualBehaviorDiv.className = 'manual-behavior';
- switch (newStatus['manualBehavior']) {
- case ManagedModeManualBehavior.NONE:
- manualBehaviorDiv.textContent = '';
- break;
- case ManagedModeManualBehavior.ALLOW:
- manualBehaviorDiv.textContent = loadTimeData.getString('filterAllowed');
- manualBehaviorDiv.classList.add('filter-allowed');
- break;
- case ManagedModeManualBehavior.BLOCK:
- manualBehaviorDiv.textContent = loadTimeData.getString('filterBlocked');
- manualBehaviorDiv.classList.add('filter-blocked');
- break;
- }
+ var filteringBehaviorDiv =
+ statusElement.querySelector('.filtering-behavior');
+ // Reset to the base class first, then add modifier classes if needed.
+ filteringBehaviorDiv.className = 'filtering-behavior';
+ if (newStatus == ManagedModeFilteringBehavior.BLOCK) {
+ filteringBehaviorDiv.textContent =
+ loadTimeData.getString('filterBlocked');
+ filteringBehaviorDiv.classList.add('filter-blocked');
+ } else {
+ filteringBehaviorDiv.textContent = '';
}
}
@@ -1790,24 +1763,17 @@ function toggleHandler(e) {
/**
* Builds the DOM elements to show the managed status of a domain/URL.
- * @param {ManagedModeManualBehavior} manualBehavior The manual behavior for
- * this item.
- * @param {boolean} inContentPack Whether this element is in a content pack or
- * not.
+ * @param {ManagedModeFilteringBehavior} filteringBehavior The filter behavior
+ * for this item.
* @return {Element} Returns the DOM elements which show the status.
*/
-function getManagedStatusDOM(manualBehavior, inContentPack) {
+function getManagedStatusDOM(filteringBehavior) {
var filterStatusDiv = createElementWithClassName('div', 'filter-status');
- var inContentPackDiv = createElementWithClassName('div', 'in-content-pack');
- inContentPackDiv.textContent = loadTimeData.getString('inContentPack');
- var manualBehaviorDiv = createElementWithClassName('div', 'manual-behavior');
- filterStatusDiv.appendChild(inContentPackDiv);
- filterStatusDiv.appendChild(manualBehaviorDiv);
-
- updateHostStatus(filterStatusDiv, {
- 'inContentPack' : inContentPack,
- 'manualBehavior' : manualBehavior
- });
+ var filteringBehaviorDiv =
+ createElementWithClassName('div', 'filtering-behavior');
+ filterStatusDiv.appendChild(filteringBehaviorDiv);
+
+ updateHostStatus(filterStatusDiv, filteringBehavior);
return filterStatusDiv;
}

Powered by Google App Engine
This is Rietveld 408576698