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

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: removed module from the list. 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) {
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 this._renderBadge(badgeElement);
51 return element;
52 }
53
54 /**
55 * @param {?SDK.ResourceTreeFrame} frame
56 * @return {!Promise<!Common.ParsedURL>}
57 */
58 async _resolveUrl(frame) {
59 var registry = await ProductRegistry.instance();
60 var parsedUrl = new Common.ParsedURL(frame.url);
61 var entry = registry.entryForUrl(parsedUrl);
62 if (!entry) {
63 frame.findCreationCallFrame(callFrame => {
64 if (!callFrame.url)
65 return false;
66 parsedUrl = new Common.ParsedURL(callFrame.url);
67 return !!registry.entryForUrl(parsedUrl);
68 });
69 }
70 return parsedUrl;
71 }
72
73 /**
74 * @param {!Element} badgeElement
75 */
76 async _renderBadge(badgeElement) {
77 if (!this._badgeElements.has(badgeElement))
78 return;
79
80 var registry = await ProductRegistry.instance();
81 var parsedUrl = await this._badgeElements.get(badgeElement)();
82 var entryName = registry.nameForUrl(parsedUrl);
83
84 if (!entryName) {
85 badgeElement.textContent = ' ';
86 badgeElement.style.removeProperty('background-color');
87 return;
88 }
89
90 var label;
91 var tokens = entryName.replace(/[a-z]*/g, '').split(' ');
92 if (tokens.length > 1)
93 label = tokens[0][0] + tokens[1][0];
94 else
95 label = entryName;
96
97 badgeElement.textContent = label.substring(0, 2).toUpperCase();
98 badgeElement.style.backgroundColor = ProductRegistry.BadgePool.colorForEntry Name(entryName);
99 badgeElement.classList.toggle('hidden', !this._setting.get());
100 }
101
102 _settingUpdated() {
103 var enabled = this._setting.get();
104 if (!enabled) {
105 for (var badgeElement of this._badgeElements.keys())
106 badgeElement.classList.add('hidden');
107 return;
108 }
109 for (var badgeElement of this._badgeElements.keys())
110 this._renderBadge(badgeElement);
111 }
112
113 /**
114 * @param {!Element} badgeElement
115 */
116 async _showPopup(badgeElement) {
117 if (!this._badgeElements.has(badgeElement))
118 return;
119
120 var registry = await ProductRegistry.instance();
121 var parsedUrl = await this._badgeElements.get(badgeElement)();
122 var entryName = registry.nameForUrl(parsedUrl);
123
124 var element = createElement('div');
125 var root = UI.createShadowRootWithCoreStyles(element, 'product_registry/popu p.css');
126 var popupElement = root.createChild('div', 'product-registry-popup');
127 var domainElement = popupElement.createChild('div', 'product-registry-domain ');
128 domainElement.textContent = parsedUrl.domain();
129 var entryNameElement = popupElement.createChild('div', 'product-registry-nam e');
130 entryNameElement.textContent = entryName;
131 var reportLink =
132 'https://docs.google.com/forms/d/e/1FAIpQLSchz2FdcQ-rRllzl8BbhWaTRRY-12B pPjW6Hr9e1-BpCA083w/viewform' +
133 '?entry_1425918171=' + encodeURIComponent((parsedUrl.domain() + parsedUr l.path).substr(0, 100));
134 popupElement.appendChild(UI.createExternalLink(reportLink, 'Report mismatch' , 'product-registry-link'));
135
136 var dialog = new UI.Dialog();
137 dialog.setContentAnchorBox(badgeElement.boxInWindow());
138 dialog.contentElement.appendChild(element);
139 dialog.setSizeBehavior(UI.GlassPane.SizeBehavior.MeasureContent);
140 dialog.setAnchorBehavior(UI.GlassPane.AnchorBehavior.PreferTop);
141 dialog.addCloseButton();
142 dialog.show(/** @type {!Document} */ (badgeElement.ownerDocument));
143 }
144
145 /**
146 * @param {string} entryName
147 * @return {string}
148 */
149 static colorForEntryName(entryName) {
150 if (!ProductRegistry.BadgePool._colorGenerator) {
151 ProductRegistry.BadgePool._colorGenerator =
152 new Common.Color.Generator({min: 30, max: 330}, {min: 50, max: 80, cou nt: 3}, 85);
153 }
154 return ProductRegistry.BadgePool._colorGenerator.colorForID(entryName);
155 }
156 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698