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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/product_registry/BadgePool.js

Issue 2879943003: DevTools: render product badges behind the setting. (Closed)
Patch Set: review comments addressed Created 3 years, 7 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 ProductRegistry.BadgePool = class {
6 constructor() {
7 this._setting = Common.settings.moduleSetting('product_registry.badges-visib le');
8 this._setting.addChangeListener(this._settingUpdated.bind(this));
9 /** @type {!Map<!Element, function():!Promise<!Common.ParsedURL>>}*/
10 this._badgeElements = new Map();
11 }
12
13 /**
14 * @param {!SDK.ResourceTreeFrame} frame
15 * @return {!Element}
16 */
17 badgeForFrame(frame) {
18 return this._badgeForFrameOrUrl(this._resolveUrl.bind(this, frame));
19 }
20
21 /**
22 * @param {!Common.ParsedURL} parsedUrl
23 * @return {!Element}
24 */
25 badgeForURL(parsedUrl) {
26 return this._badgeForFrameOrUrl(() => Promise.resolve(parsedUrl));
27 }
28
29 reset() {
30 this._badgeElements.clear();
31 }
32
33 /**
34 * @param {function():!Promise<!Common.ParsedURL>} urlResolver
35 * @return {!Element}
36 */
37 _badgeForFrameOrUrl(urlResolver) {
allada 2017/05/13 00:33:57 Just bring in a promise here and add a symbol on t
pfeldman 2017/05/13 00:57:45 I can't bring the promise here - it would load the
38 var element = createElement('span');
39 var root = UI.createShadowRootWithCoreStyles(element, 'product_registry/badg e.css');
40 var badgeElement = root.createChild('span', 'product-registry-badge monospac e hidden');
41 badgeElement.textContent = ' ';
42 badgeElement.addEventListener('mousedown', event => event.consume());
43 badgeElement.addEventListener('click', event => {
44 this._showPopup(badgeElement);
45 event.consume();
46 }, false);
47
48 this._badgeElements.set(badgeElement, urlResolver);
49 if (!this._setting.get())
50 return element;
51
52 this._renderBadge(badgeElement);
53 return element;
54 }
55
56 /**
57 * @param {?SDK.ResourceTreeFrame} frame
58 * @return {!Promise<!Common.ParsedURL>}
59 */
60 _resolveUrl(frame) {
61 return ProductRegistry.instance().then(registry => {
62 var parsedUrl = new Common.ParsedURL(frame.url);
63 var entry = registry.entryForUrl(parsedUrl);
64 if (!entry) {
65 frame.findCreationCallFrame(callFrame => {
66 if (!callFrame.url)
67 return false;
68 parsedUrl = new Common.ParsedURL(callFrame.url);
69 return !!registry.entryForUrl(parsedUrl);
70 });
71 }
72 return parsedUrl;
73 });
74 }
75
76 /**
77 * @param {!Element} badgeElement
78 */
79 async _renderBadge(badgeElement) {
80 if (!this._badgeElements.has(badgeElement))
81 return;
82
83 var registry = await ProductRegistry.instance();
84 var parsedUrl = await this._badgeElements.get(badgeElement)();
85 var entryName = registry.nameForUrl(parsedUrl);
86
87 if (!entryName) {
88 badgeElement.textContent = ' ';
89 badgeElement.style.removeProperty('background-color');
90 return;
91 }
92
93 var label;
94 var tokens = entryName.replace(/[a-z]*/g, '').split(' ');
allada 2017/05/13 00:33:57 This worked well for me: var label = entryName.re
pfeldman 2017/05/13 00:57:45 I don't think it is much better than mine, so why
95 if (tokens.length > 1)
96 label = tokens[0][0] + tokens[1][0];
97 else
98 label = entryName;
99
100 badgeElement.textContent = label.substring(0, 2).toUpperCase();
101 badgeElement.style.backgroundColor = ProductRegistry.BadgePool._colorForId(e ntryName);
102 badgeElement.classList.toggle('hidden', !this._setting.get());
103 }
104
105 _settingUpdated() {
106 var enabled = this._setting.get();
107 if (!enabled) {
108 for (var badgeElement of this._badgeElements.keys())
109 badgeElement.classList.add('hidden');
110 return;
111 }
112 for (var badgeElement of this._badgeElements.keys())
113 this._renderBadge(badgeElement);
114 }
115
116 /**
117 * @param {!Element} badgeElement
118 */
119 async _showPopup(badgeElement) {
120 if (!this._badgeElements.has(badgeElement))
121 return;
122
123 var registry = await ProductRegistry.instance();
124 var parsedUrl = await this._badgeElements.get(badgeElement)();
125 var entryName = registry.nameForUrl(parsedUrl);
126
127 var element = createElement('div');
128 var root = UI.createShadowRootWithCoreStyles(element, 'product_registry/popu p.css');
129 var popupElement = root.createChild('div', 'product-registry-popup');
130 var domainElement = popupElement.createChild('div', 'product-registry-domain ');
131 domainElement.textContent = parsedUrl.domain();
132 var entryNameElement = popupElement.createChild('div', 'product-registry-nam e');
133 entryNameElement.textContent = entryName;
134 var reportLink =
135 'https://docs.google.com/forms/d/e/1FAIpQLSchz2FdcQ-rRllzl8BbhWaTRRY-12B pPjW6Hr9e1-BpCA083w/viewform' +
136 '?entry_1425918171=' + encodeURIComponent((parsedUrl.domain() + parsedUr l.path).substr(0, 100));
137 popupElement.appendChild(UI.createExternalLink(reportLink, 'Report mismatch' , 'product-registry-link'));
138
139 var dialog = new UI.Dialog();
140 dialog.setContentAnchorBox(badgeElement.boxInWindow());
141 dialog.contentElement.appendChild(element);
142 dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.MeasureContent);
143 dialog.setAnchorBehavior(UI.GlassPane.AnchorBehavior.PreferTop);
144 dialog.addCloseButton();
145 dialog.show(/** @type {!Document} */ (badgeElement.ownerDocument));
146 }
147
148 /**
149 * @param {string} entryName
150 * @return {string}
151 */
152 static _colorForId(entryName) {
153 if (!ProductRegistry.BadgePool._colorGenerator) {
154 ProductRegistry.BadgePool._colorGenerator =
155 new Common.Color.Generator({min: 30, max: 330}, {min: 50, max: 80, cou nt: 3}, 85);
156 }
157 return ProductRegistry.BadgePool._colorGenerator.colorForID(entryName);
158 }
159 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698