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

Unified Diff: third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js

Issue 2649023007: DevTools: implement release note behind an experiment (Closed)
Patch Set: finalize Created 3 years, 10 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: third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js
diff --git a/third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js b/third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js
new file mode 100644
index 0000000000000000000000000000000000000000..2f2d1858caee76810ce3987566fb9635f445ee58
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/help/ReleaseNote.js
@@ -0,0 +1,164 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+Help.ReleaseNoteManager = class {
einbinder 2017/02/15 20:10:45 This doesn't look like it needs to be a class, jus
chenwilliam 2017/02/16 21:32:42 Done.
+ constructor() {
+ this._versionSetting = Common.settings.createSetting('releaseNoteVersionSeen', 0, false);
+ this._browserVersion = this._getBrowserVersion();
+ this._releaseNote = this._getReleaseNoteByVersion(this._browserVersion);
+ if (!Host.isUnderTest())
+ this._init();
luoe 2017/02/15 22:32:29 We could inline the _init function here.
chenwilliam 2017/02/16 21:32:43 Ack. Used for testing.
+ }
+
+ /**
+ * @return {!Help.ReleaseNote}
+ */
+ releaseNote() {
+ return this._releaseNote;
+ }
+
+ /**
+ * @return {?Promise<?UI.Panel>}
+ */
luoe 2017/02/15 22:32:29 Return value doesn't seem used.
chenwilliam 2017/02/16 21:32:42 Done.
+ _init() {
+ return this._maybeShowInDrawer(this._versionSetting.get(), this._browserVersion);
+ }
+
+ /**
+ * @param {number} lastSeenVersion
+ * @param {number} browserVersion
+ * @return {?Promise<?UI.Panel>}
+ */
+ _maybeShowInDrawer(lastSeenVersion, browserVersion) {
+ if (!Runtime.experiments.isEnabled('releaseNote'))
+ return null;
+ if (lastSeenVersion >= browserVersion)
+ return null;
+ if (this._releaseNote.version !== browserVersion)
luoe 2017/02/15 22:32:29 If we require an exact match, we don't need to do
chenwilliam 2017/02/16 21:32:42 Acknowledged.
+ return null;
+ this._versionSetting.set(this._browserVersion);
+ return UI.inspectorView.showPanel(Help._releaseNoteViewId);
+ }
+
+ /**
+ * @param {number} version
+ * @return {!Help.ReleaseNote}
+ */
+ _getReleaseNoteByVersion(version) {
+ var note;
+ while (version) {
+ note = Help.ReleaseNoteManager.releaseNotesByVersion.find(note => note.version === version);
+ if (note)
+ return note;
+ version--;
+ }
luoe 2017/02/15 22:32:29 This is getting the newest release note before or
chenwilliam 2017/02/16 21:32:43 Discussed in person
+ return Help.ReleaseNoteManager.releaseNotesByVersion[Help.ReleaseNoteManager.releaseNotesByVersion.length - 1];
+ }
+
+ /**
+ * @return {number}
+ */
+ _getBrowserVersion() {
+ var chromeRegex = new RegExp('(?:^|\\W)Chrome/(\\S+)');
+ var chromeMatch = navigator.userAgent.match(chromeRegex);
+ return parseInt(chromeMatch[1].split('.')[0], 10);
+ }
+
+ _testNote() {
+ return {
einbinder 2017/02/15 20:10:45 Let's keep the test code in the test file.
chenwilliam 2017/02/16 21:32:42 Done.
+ version: 99,
+ highlights: [
+ {
+ text: 'Test bullet #1',
+ link: 'https://google.com/',
+ featured: true,
+ },
+ {
+ text: 'Test bullet #2',
+ link: 'https://google.com/',
+ },
+ ],
+ link: 'https://google.com/',
+ image: {
+ src: './resources/test.png',
+ caption: 'Test image',
+ },
+ };
+ }
+};
+
+/** @type {!Help.ReleaseNoteManager} */
+Help.releaseNoteManager;
+
+Help.ReleaseNoteView = class extends UI.VBox {
+ constructor() {
+ super(true);
+ this.registerRequiredCSS('help/releaseNote.css');
+ var releaseNote = Host.isUnderTest() ? Help.releaseNoteManager._testNote() : Help.releaseNoteManager.releaseNote();
+ this._releaseNoteElement = this._createReleaseNoteElement(releaseNote);
+ this.contentElement.appendChild(this._releaseNoteElement);
+ }
+
+ /**
+ * @param {!Help.ReleaseNote} releaseNote
+ * @return {!Element}
+ */
+ _createReleaseNoteElement(releaseNote) {
+ var container = createElementWithClass('div', 'release-note-container');
+ insertText(container);
+ insertImage(container);
+ return container;
+
+ /**
+ * @param {!Element} container
+ */
+ function insertText(container) {
+ var textContainer = container.createChild('div', 'release-note-text-container');
+ textContainer.createChild('div', 'release-note-header').textContent =
+ `${Common.UIString('New in DevTools')} v${releaseNote.version}`;
einbinder 2017/02/15 20:10:45 Common.UIString('New in DevTools v%d', releaseNote
chenwilliam 2017/02/16 21:32:42 Done.
+ var highlightContainer = textContainer.createChild('ul', 'release-note-highlight-container');
+ for (var highlight of releaseNote.highlights) {
+ var className = highlight.featured ? 'release-note-featured-link' : 'release-note-link';
+ var highlightLink = UI.createExternalLink(highlight.link, highlight.text, className, undefined, true);
+ highlightContainer.createChild('li').appendChild(highlightLink);
+ }
+
+ var viewMoreButton = UI.createExternalLink(
+ releaseNote.link, Common.UIString('And more...'), 'dth-button is-primary', undefined, true);
+ textContainer.appendChild(viewMoreButton);
+
+ var closeButton = textContainer.createChild('button', 'dth-button is-secondary close-release-note');
+ closeButton.textContent = Common.UIString('Hide');
+ closeButton.addEventListener(
+ 'click', () => UI.inspectorView.closeDrawerTab(Help._releaseNoteViewId, true), false);
+ }
+
+ /**
+ * @param {!Element} container
+ */
+ function insertImage(container) {
+ var imageLink = UI.createExternalLink(releaseNote.link, ' ', 'release-note-image-container', undefined, true);
+ container.appendChild(imageLink);
+ var image = imageLink.createChild('img', 'release-note-image');
+ image.src = releaseNote.image.src;
+ image.addEventListener('mouseover', e => container.classList.add('image-hover'));
+ image.addEventListener('mouseout', e => container.classList.remove('image-hover'));
+ }
+ }
+};
+
+/**
+ * @const
+ * @type {string}
+ */
+Help._releaseNoteViewId = 'release-note';
+
+/** @typedef {!{src: string}} */
+Help.ReleaseNoteImage;
+
+/** @typedef {!{text: string, link: string, featured: (boolean | undefined)}} */
+Help.ReleaseNoteHighlight;
+
+/** @typedef {!{version: number, highlights: !Array<!Help.ReleaseNoteHighlight>, link: string, image: !Help.ReleaseNoteImage}} */
+Help.ReleaseNote;

Powered by Google App Engine
This is Rietveld 408576698