Chromium Code Reviews| Index: chrome/browser/resources/ntp4/bookmarks_page.js |
| =================================================================== |
| --- chrome/browser/resources/ntp4/bookmarks_page.js (revision 96479) |
| +++ chrome/browser/resources/ntp4/bookmarks_page.js (working copy) |
| @@ -5,6 +5,162 @@ |
| cr.define('ntp4', function() { |
| 'use strict'; |
| + var localStrings = new LocalStrings; |
| + var tileID = 0; |
|
Evan Stade
2011/08/12 21:13:30
comment this
arv (Not doing code reviews)
2011/08/13 01:02:07
tileId for consistency
csilv
2011/08/13 01:09:21
Done.
csilv
2011/08/13 01:48:17
Done.
|
| + |
| + /** |
| + * Creates a new bookmark object. |
| + * @param {Object} data The url and title. |
| + * @constructor |
| + * @extends {HTMLDivElement} |
| + */ |
| + function Bookmark(data) { |
| + var el = cr.doc.createElement('div'); |
| + el.__proto__ = Bookmark.prototype; |
| + el.data = data; |
| + el.initialize(); |
| + |
| + return el; |
| + } |
| + |
| + Bookmark.prototype = { |
| + __proto__: HTMLDivElement.prototype, |
| + |
| + initialize: function() { |
| + this.className = 'bookmark'; |
| + this.innerHTML = |
| + '<a class="button bookmark-fills-parent">' + |
|
Evan Stade
2011/08/12 21:13:30
perhaps you could put this html in new_tab.html as
csilv
2011/08/13 01:09:21
Oh, that's a great idea! Done. Also did the same
|
| + '<div class="close-button"></div>' + |
| + '<span class="button-frame bookmark-fills-parent"></span>' + |
| + '<span class="favicon bookmark-fills-parent"></span>' + |
| + '</a>' + |
| + '<div class="color-stripe"></div>' + |
| + '<a class="title"></a>'; |
| + |
| + var id = tileID++; |
| + this.setAttribute('id', 'tile' + id); |
|
Evan Stade
2011/08/12 21:13:30
I think you can just do this.id =
(again, regardl
csilv
2011/08/13 01:09:21
Done. I also made updates so that the dominant co
|
| + |
| + var title = this.querySelector('.title'); |
| + title.textContent = this.data.title; |
| + |
| + if (this.data.url) { |
| + var button = this.querySelector('.button'); |
| + button.href = title.href = this.data.url; |
| + } |
| + |
| + var faviconDiv = this.querySelector('.favicon'); |
| + var faviconUrl; |
| + if (this.data.url) { |
| + faviconUrl = 'chrome://favicon/size/32/' + this.data.url; |
| + if (this.data.faviconDominantColor) |
| + this.setStripeColor(this.data.faviconDominantColor); |
|
Evan Stade
2011/08/12 21:13:30
add TODOs for the parts of the code that don't act
arv (Not doing code reviews)
2011/08/13 01:02:07
Use a setter whenever you see a setFoo.
csilv
2011/08/13 01:09:21
Done. This is now implemented, all other missing
csilv
2011/08/13 01:48:17
Done.
|
| + else |
| + chrome.send('getFaviconDominantColor', [faviconUrl, id]); |
| + } else { |
| + // TODO(csilv): We need a large (32px) icon for this URL. |
| + faviconUrl = 'chrome://theme/IDR_BOOKMARK_BAR_FOLDER'; |
| + this.setStripeColor('#919191'); |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
The icon for the bookmark bar folder is different
csilv
2011/08/13 01:48:17
Perhaps, right now it's just using a neutral color
|
| + } |
| + faviconDiv.style.backgroundImage = url(faviconUrl); |
| + |
| + this.addEventListener('click', this.handleClick_.bind(this)); |
| + }, |
| + |
| + /** |
| + * Sets the color of the favicon dominant color bar. |
| + * @param {string} color The css-parsable value for the color. |
| + */ |
| + setStripeColor: function(color) { |
| + this.querySelector('.color-stripe').style.backgroundColor = color; |
| + }, |
| + |
| + /** |
| + * Set the size and position of the bookmark tile. |
| + * @param {number} size The total size of |this|. |
| + * @param {number} x The x-position. |
| + * @param {number} y The y-position. |
| + * animate. |
| + */ |
| + setBounds: function(size, x, y) { |
| + this.style.width = this.style.height = size + 'px'; |
| + this.style.left = x + 'px'; |
| + this.style.top = y + 'px'; |
| + }, |
| + |
| + /** |
| + * Invoked when a bookmark is clicked |
| + * @param {Event} e The click event. |
| + * @private |
| + */ |
| + handleClick_: function(e) { |
| + if (e.target.classList.contains('close-button')) { |
| + this.handleDelete_(); |
| + e.preventDefault(); |
| + } else if (!this.data.url) { |
| + chrome.send('getBookmarksData', [ this.data.id ]); |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
no ws after [ nor before ]
csilv
2011/08/13 01:48:17
Done.
|
| + e.preventDefault(); |
| + } |
| + }, |
| + |
| + /** |
| + * Delete a bookmark from the data model. |
| + * @private |
| + */ |
| + handleDelete_: function() { |
| + // TODO(csilv): add support for deleting bookmarks |
| + }, |
| + |
| + /** |
| + * The data and preferences for this app. |
| + * @type {Object} |
| + */ |
| + set data(data) { |
| + this.data_ = data; |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
No need for a getter or setter her since there are
csilv
2011/08/13 01:48:17
Done.
|
| + }, |
| + get data() { |
| + return this.data_; |
| + }, |
| + }; |
| + |
| + /** |
| + * Creates a new bookmark title object. |
| + * @param {Object} data The url and title. |
| + * @constructor |
| + * @extends {HTMLDivElement} |
| + */ |
| + function BookmarkTitle(data) { |
| + var el = cr.doc.createElement('div'); |
| + el.__proto__ = BookmarkTitle.prototype; |
| + el.initialize(data); |
| + |
| + return el; |
| + } |
| + |
| + BookmarkTitle.prototype = { |
| + __proto__: HTMLDivElement.prototype, |
| + |
| + initialize: function(data) { |
| + this.className = 'title-crumb'; |
| + this.folderId_ = data.id; |
| + |
| + if (!data.parentId) |
| + this.innerText = localStrings.getString('bookmarksPage'); |
|
Evan Stade
2011/08/12 21:13:30
ternary operator
arv (Not doing code reviews)
2011/08/13 01:02:07
Use textContent instead of innerText
csilv
2011/08/13 01:09:21
Done.
csilv
2011/08/13 01:48:17
Done.
|
| + else |
| + this.innerText = data.title; |
| + |
| + this.addEventListener('click', this.handleClick_.bind(this)); |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
no need for this bind since you are adding the eve
csilv
2011/08/13 01:48:17
Done.
|
| + }, |
| + |
| + /** |
| + * Invoked when a bookmark title is clicked |
| + * @param {Event} e The click event. |
| + * @private |
| + */ |
| + handleClick_: function(e) { |
| + chrome.send('getBookmarksData', [ this.folderId_ ]); |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
ws
csilv
2011/08/13 01:48:17
Done.
|
| + }, |
| + }; |
| + |
| var TilePage = ntp4.TilePage; |
| var bookmarksPageGridValues = { |
| @@ -14,9 +170,9 @@ |
| maxColCount: 6, |
| // The smallest a tile can be. |
| - minTileWidth: 100, |
| + minTileWidth: 150, |
| // The biggest a tile can be. |
| - maxTileWidth: 100, |
| + maxTileWidth: 150, |
| }; |
| TilePage.initGridValues(bookmarksPageGridValues); |
| @@ -39,20 +195,94 @@ |
| initialize: function() { |
| this.classList.add('bookmarks-page'); |
| - // TODO(csilv): Remove this placeholder. |
| - var placeholder = this.ownerDocument.createElement('div'); |
| - placeholder.textContent = 'Bookmarks coming soon...'; |
| - placeholder.className = 'placeholder'; |
| - this.insertBefore(placeholder, this.firstChild); |
| + var titleWrapper = this.ownerDocument.createElement('div'); |
| + titleWrapper.className = 'section-title-wrapper'; |
| + titleWrapper.setAttribute('id', 'bookmarks_title_wrapper'); |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
Prefer DOM bindings over setAttribute
titleWrappe
csilv
2011/08/13 01:48:17
Done.
|
| + this.insertBefore(titleWrapper, this.firstChild); |
| + |
| + var titleMask = this.ownerDocument.createElement('div'); |
| + titleMask.className = 'section-title-mask'; |
| + titleWrapper.appendChild(titleMask); |
| + |
| + var title = this.ownerDocument.createElement('div'); |
| + title.className = 'section-title'; |
| + titleWrapper.appendChild(title); |
| }, |
| + /** |
| + * Build the bookmark titles bar (ie, navigation hiearchy). |
| + * @param {Array} items The parent hiearchy of the current folder. |
| + * @private |
| + */ |
| + updateBookmarkTitles_: function(items) { |
| + var wrapper = $('bookmarks_title_wrapper'); |
| + var title = wrapper.getElementsByClassName('section-title')[0]; |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
querySelector('.section-title')
csilv
2011/08/13 01:48:17
Done.
|
| + title.innerHTML = ''; |
| + |
| + for (var i = items.length - 1; i > 0; i--) { |
| + var titleCrumb = new BookmarkTitle(items[i]); |
| + title.appendChild(titleCrumb); |
| + |
| + var separator = document.createElement('div'); |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
maybe use an hr here?
csilv
2011/08/13 01:48:17
Done.
|
| + separator.className = 'bookmark-separator'; |
| + title.appendChild(separator); |
| + } |
| + |
| + var titleCrumb = new BookmarkTitle(items[0]); |
| + titleCrumb.classList.add('title-crumb-active'); |
| + title.appendChild(titleCrumb); |
| + }, |
| + |
| + /** |
| + * Build the bookmark tiles. |
| + * @param {Array} items The contents of the current folder. |
| + * @private |
| + */ |
| + updateBookmarkTiles_: function(items) { |
| + this.removeAllTiles(); |
| + for (var i = 0; i < items.length; i++) |
| + this.appendTile(new Bookmark(items[i]), false); |
| + }, |
| + |
| /** @inheritDoc */ |
| shouldAcceptDrag: function(dataTransfer) { |
| return false; |
| - } |
| + }, |
| + |
| + /** |
| + * Set the bookmark data that should be displayed, replacing any existing |
| + * data. |
| + */ |
| + set data(data) { |
| + this.updateBookmarkTiles_(data.items); |
| + this.updateBookmarkTitles_(data.navigationItems); |
| + }, |
| }; |
| + /** |
| + * Initializes and renders the bookmark chevron canvas. This needs to be |
| + * performed after the page has been loaded so that we have access to the |
| + * style sheet values. |
| + */ |
| + function initBookmarkChevron() { |
| + var wrapperStyle = window.getComputedStyle($('bookmarks_title_wrapper')); |
| + var width = 10; |
| + var height = parseInt(wrapperStyle.height); |
|
arv (Not doing code reviews)
2011/08/13 01:02:07
always use two args to parseInt due to its strange
csilv
2011/08/13 01:48:17
Done.
|
| + var ctx = document.getCSSCanvasContext('2d', 'bookmark-chevron', |
| + width, height); |
| + ctx.strokeStyle = wrapperStyle.borderBottomColor; |
| + ctx.beginPath(); |
| + ctx.moveTo(0, 0); |
| + ctx.lineTo(width, height / 2); |
| + ctx.lineTo(0, height); |
| + ctx.stroke(); |
| + } |
| + |
| return { |
| - BookmarksPage: BookmarksPage |
| + BookmarksPage: BookmarksPage, |
| + initBookmarkChevron: initBookmarkChevron |
| }; |
| }); |
| + |
| +window.addEventListener('load', ntp4.initBookmarkChevron); |
| + |