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

Side by Side Diff: chrome/browser/resources/engagement/site_engagement.js

Issue 2788413003: Add SiteEngagementService::GetAllDetails(), to return detailed scores. (Closed)
Patch Set: Created 3 years, 8 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 'use strict'; 5 'use strict';
6 6
7 // Allow a function to be provided by tests, which will be called when 7 // Allow a function to be provided by tests, which will be called when
8 // the page has been populated with site engagement details. 8 // the page has been populated with site engagement details.
9 var pagePopulatedCallback = null; 9 var pagePopulatedCallback = null;
10 var isPagePopulated = false; 10 var isPagePopulated = false;
11 11
12 function setPagePopulatedCallbackForTest(callback) { 12 function setPagePopulatedCallbackForTest(callback) {
13 if (isPagePopulated) { 13 if (isPagePopulated) {
14 callback(); 14 callback();
15 } else { 15 } else {
16 pagePopulatedCallback = callback; 16 pagePopulatedCallback = callback;
17 } 17 }
18 } 18 }
19 19
20 function notifyPagePopulated() { 20 function notifyPagePopulated() {
21 isPagePopulated = true; 21 isPagePopulated = true;
22 if (pagePopulatedCallback) { 22 if (pagePopulatedCallback) {
23 pagePopulatedCallback(); 23 pagePopulatedCallback();
24 pagePopulatedCallback = null; 24 pagePopulatedCallback = null;
25 } 25 }
26 } 26 }
27 27
28 define('main', [ 28 define('main', [
29 'chrome/browser/engagement/site_engagement.mojom', 29 'chrome/browser/engagement/site_engagement_details.mojom',
30 'content/public/renderer/frame_interfaces', 30 'content/public/renderer/frame_interfaces',
31 ], function(siteEngagementMojom, frameInterfaces) { 31 ], function(siteEngagementMojom, frameInterfaces) {
32 return function() { 32 return function() {
33 var uiHandler = new siteEngagementMojom.SiteEngagementUIHandlerPtr( 33 var uiHandler = new siteEngagementMojom.SiteEngagementDetailsProviderPtr(
34 frameInterfaces.getInterface( 34 frameInterfaces.getInterface(
35 siteEngagementMojom.SiteEngagementUIHandler.name)); 35 siteEngagementMojom.SiteEngagementDetailsProvider.name));
36 36
37 var engagementTableBody = $('engagement-table-body'); 37 var engagementTableBody = $('engagement-table-body');
38 var updateInterval = null; 38 var updateInterval = null;
39 var info = null; 39 var info = null;
40 var sortKey = 'score'; 40 var sortKey = 'base_score';
41 var sortReverse = true; 41 var sortReverse = true;
42 42
43 // Set table header sort handlers. 43 // Set table header sort handlers.
44 var engagementTableHeader = $('engagement-table-header'); 44 var engagementTableHeader = $('engagement-table-header');
45 var headers = engagementTableHeader.children; 45 var headers = engagementTableHeader.children;
46 for (var i = 0; i < headers.length; i++) { 46 for (var i = 0; i < headers.length; i++) {
47 headers[i].addEventListener('click', function(e) { 47 headers[i].addEventListener('click', function(e) {
48 var newSortKey = e.target.getAttribute('sort-key'); 48 var newSortKey = e.target.getAttribute('sort-key');
49 if (sortKey == newSortKey) { 49 if (sortKey == newSortKey) {
50 sortReverse = !sortReverse; 50 sortReverse = !sortReverse;
51 } else { 51 } else {
52 sortKey = newSortKey; 52 sortKey = newSortKey;
53 sortReverse = false; 53 sortReverse = false;
54 } 54 }
55 var oldSortColumn = document.querySelector('.sort-column'); 55 var oldSortColumn = document.querySelector('.sort-column');
56 oldSortColumn.classList.remove('sort-column'); 56 oldSortColumn.classList.remove('sort-column');
57 e.target.classList.add('sort-column'); 57 e.target.classList.add('sort-column');
58 if (sortReverse) 58 if (sortReverse)
59 e.target.setAttribute('sort-reverse', ''); 59 e.target.setAttribute('sort-reverse', '');
60 else 60 else
61 e.target.removeAttribute('sort-reverse'); 61 e.target.removeAttribute('sort-reverse');
62 renderTable(); 62 renderTable();
63 }); 63 });
64 } 64 }
65 65
66 /** 66 /**
67 * Creates a single row in the engagement table. 67 * Creates a single row in the engagement table.
68 * @param {SiteEngagementInfo} info The info to create the row from. 68 * @param {SiteEngagementDetails} info The info to create the row from.
69 * @return {HTMLElement} 69 * @return {HTMLElement}
70 */ 70 */
71 function createRow(info) { 71 function createRow(info) {
72 var originCell = createElementWithClassName('td', 'origin-cell'); 72 var originCell = createElementWithClassName('td', 'origin-cell');
73 originCell.textContent = info.origin.url; 73 originCell.textContent = info.origin.url;
74 74
75 var scoreInput = createElementWithClassName('input', 'score-input'); 75 var scoreInput = createElementWithClassName('input', 'score-input');
76 scoreInput.addEventListener( 76 scoreInput.addEventListener(
77 'change', handleScoreChange.bind(undefined, info.origin)); 77 'change', handleScoreChange.bind(undefined, info.origin));
78 scoreInput.addEventListener('focus', disableAutoupdate); 78 scoreInput.addEventListener('focus', disableAutoupdate);
79 scoreInput.addEventListener('blur', enableAutoupdate); 79 scoreInput.addEventListener('blur', enableAutoupdate);
80 scoreInput.value = info.score; 80 scoreInput.value = info.base_score;
81 81
82 var scoreCell = createElementWithClassName('td', 'score-cell'); 82 var scoreCell = createElementWithClassName('td', 'score-cell');
83 scoreCell.appendChild(scoreInput); 83 scoreCell.appendChild(scoreInput);
84 84
85 var engagementBar = createElementWithClassName('div', 'engagement-bar'); 85 var engagementBar = createElementWithClassName('div', 'engagement-bar');
86 engagementBar.style.width = (info.score * 4) + 'px'; 86 engagementBar.style.width = (info.base_score * 4) + 'px';
87 87
88 var engagementBarCell = 88 var engagementBarCell =
89 createElementWithClassName('td', 'engagement-bar-cell'); 89 createElementWithClassName('td', 'engagement-bar-cell');
90 engagementBarCell.appendChild(engagementBar); 90 engagementBarCell.appendChild(engagementBar);
91 91
92 var row = document.createElement('tr'); 92 var row = document.createElement('tr');
93 row.appendChild(originCell); 93 row.appendChild(originCell);
94 row.appendChild(scoreCell); 94 row.appendChild(scoreCell);
95 row.appendChild(engagementBarCell); 95 row.appendChild(engagementBarCell);
96 96
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 * Sort the engagement info based on |sortKey| and |sortReverse|. 138 * Sort the engagement info based on |sortKey| and |sortReverse|.
139 */ 139 */
140 function sortInfo() { 140 function sortInfo() {
141 info.sort(function(a, b) { 141 info.sort(function(a, b) {
142 return (sortReverse ? -1 : 1) * 142 return (sortReverse ? -1 : 1) *
143 compareTableItem(sortKey, a, b); 143 compareTableItem(sortKey, a, b);
144 }); 144 });
145 } 145 }
146 146
147 /** 147 /**
148 * Compares two SiteEngagementInfo objects based on |sortKey|. 148 * Compares two SiteEngagementDetails objects based on |sortKey|.
149 * @param {string} sortKey The name of the property to sort by. 149 * @param {string} sortKey The name of the property to sort by.
150 * @return {number} A negative number if |a| should be ordered before |b|, a 150 * @return {number} A negative number if |a| should be ordered before |b|, a
151 * positive number otherwise. 151 * positive number otherwise.
152 */ 152 */
153 function compareTableItem(sortKey, a, b) { 153 function compareTableItem(sortKey, a, b) {
154 var val1 = a[sortKey]; 154 var val1 = a[sortKey];
155 var val2 = b[sortKey]; 155 var val2 = b[sortKey];
156 156
157 // Compare the hosts of the origin ignoring schemes. 157 // Compare the hosts of the origin ignoring schemes.
158 if (sortKey == 'origin') 158 if (sortKey == 'origin')
159 return new URL(val1.url).host > new URL(val2.url).host ? 1 : -1; 159 return new URL(val1.url).host > new URL(val2.url).host ? 1 : -1;
160 160
161 if (sortKey == 'score') 161 if (sortKey == 'base_score')
162 return val1 - val2; 162 return val1 - val2;
163 163
164 assertNotReached('Unsupported sort key: ' + sortKey); 164 assertNotReached('Unsupported sort key: ' + sortKey);
165 return 0; 165 return 0;
166 } 166 }
167 167
168 /** 168 /**
169 * Regenerates the engagement table from |info|. 169 * Regenerates the engagement table from |info|.
170 */ 170 */
171 function renderTable() { 171 function renderTable() {
172 clearTable(); 172 clearTable();
173 sortInfo(); 173 sortInfo();
174 // Round each score to 2 decimal places. 174 // Round each score to 2 decimal places.
175 info.forEach(function(info) { 175 info.forEach(function(info) {
176 info.score = Number(Math.round(info.score * 100) / 100); 176 info.base_score = Number(Math.round(info.base_score * 100) / 100);
177 engagementTableBody.appendChild(createRow(info)); 177 engagementTableBody.appendChild(createRow(info));
178 }); 178 });
179 179
180 notifyPagePopulated(); 180 notifyPagePopulated();
181 } 181 }
182 182
183 /** 183 /**
184 * Retrieve site engagement info and render the engagement table. 184 * Retrieve site engagement info and render the engagement table.
185 */ 185 */
186 function updateEngagementTable() { 186 function updateEngagementTable() {
187 // Populate engagement table. 187 // Populate engagement table.
188 uiHandler.getSiteEngagementInfo().then(function(response) { 188 uiHandler.getSiteEngagementDetails().then(function(response) {
189 info = response.info; 189 info = response.info;
190 renderTable(info); 190 renderTable(info);
191 }); 191 });
192 }; 192 };
193 193
194 updateEngagementTable(); 194 updateEngagementTable();
195 enableAutoupdate(); 195 enableAutoupdate();
196 }; 196 };
197 }); 197 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698