| Index: chrome/test/data/extensions/samples/bookmarks/bookmark_view.html
 | 
| diff --git a/chrome/test/data/extensions/samples/bookmarks/bookmark_view.html b/chrome/test/data/extensions/samples/bookmarks/bookmark_view.html
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..5b9b064a48a4c18331ad117985651d0e9705826b
 | 
| --- /dev/null
 | 
| +++ b/chrome/test/data/extensions/samples/bookmarks/bookmark_view.html
 | 
| @@ -0,0 +1,143 @@
 | 
| +<!DOCTYPE HTML>
 | 
| +<title>Bookmark View</title>
 | 
| +<style>
 | 
| +
 | 
| +.bookmark {
 | 
| +  margin-left: 5px;
 | 
| +  padding: 2px;
 | 
| +}
 | 
| +
 | 
| +.bookmark_title {
 | 
| +  display: inline;
 | 
| +  border: 1px solid white;
 | 
| +  padding: 0px 3px;
 | 
| +}
 | 
| +
 | 
| +.bookmark_title:hover {
 | 
| +  background-color: silver;
 | 
| +  border: 1px solid black;
 | 
| +}
 | 
| +
 | 
| +.event-log {
 | 
| +  font-family: monospace;
 | 
| +}
 | 
| +
 | 
| +</style>
 | 
| +<script>
 | 
| +// XXX Hack: When you call window.open('chrome-extension://...'), the window is
 | 
| +// first navigated to about:blank, and then to the final URL. This confuses the
 | 
| +// code that sets up our v8 extensions, and we don't end up with them running.
 | 
| +//
 | 
| +// If we noticed this happened, reload ourselves, which should fix it.
 | 
| +if (!chromium.bookmarks)
 | 
| +  location.reload();
 | 
| +
 | 
| +var logEvent = function(name, data) {
 | 
| +  var log = document.getElementById("event-log");
 | 
| +  log.innerHTML = name + "<br>" + log.innerHTML;
 | 
| +  console.log("got event: " + name);
 | 
| +}
 | 
| +
 | 
| +chromium.bookmarks.onBookmarkAdded.addListener(function(data) {
 | 
| +  logEvent("onBookmarkAdded", data);
 | 
| +});
 | 
| +
 | 
| +chromium.bookmarks.onBookmarkRemoved.addListener(function(data) {
 | 
| +  logEvent("onBookmarkRemoved", data);
 | 
| +});
 | 
| +
 | 
| +chromium.bookmarks.onBookmarkChanged.addListener(function(data) {
 | 
| +  logEvent("onBookmarkChanged", data);
 | 
| +});
 | 
| +
 | 
| +chromium.bookmarks.onBookmarkMoved.addListener(function(data) {
 | 
| +  logEvent("onBookmarkMoved", data);
 | 
| +});
 | 
| +
 | 
| +chromium.bookmarks.onBookmarkChildrenReordered.addListener(function(data) {
 | 
| +  logEvent("onBookmarkChildrenReordered", data);
 | 
| +});
 | 
| +
 | 
| +var prefix = "bookmark_";
 | 
| +
 | 
| +var toggleBookmark = function(event) {
 | 
| +  event.stopPropagation();
 | 
| +  var node = event.currentTarget;
 | 
| +  var id_str = node.id;
 | 
| +  if (id_str < prefix.length)
 | 
| +    return;
 | 
| +  var id = parseInt(id_str.substring(prefix.length));
 | 
| +  if (id == NaN)
 | 
| +    return;
 | 
| +  console.log("toggle: " + id);
 | 
| +  //console.dir(event);
 | 
| +  chromium.bookmarks.get([id], function(bookmark) {
 | 
| +    //console.log("toggle get");
 | 
| +    console.dir(bookmark[0]);
 | 
| +    if (bookmark[0].childrenIds && bookmark[0].childrenIds.length) {
 | 
| +      if (node.childNodes.length != 1) {
 | 
| +        //console.log("toggle collapse");
 | 
| +        node.removeChild(node.childNodes[1]);
 | 
| +      } else {
 | 
| +        //console.log("before");
 | 
| +        chromium.bookmarks.get(bookmark[0].childrenIds, function(children) {
 | 
| +          //console.log("toggle expand");
 | 
| +          if (children && children.length) {
 | 
| +            console.dir(children);
 | 
| +            addBookmarks(children, node);
 | 
| +          }
 | 
| +        });
 | 
| +      }
 | 
| +    }
 | 
| +  });
 | 
| +};
 | 
| +
 | 
| +var addBookmark = function(bookmark, parent) {
 | 
| +  //console.log("addBookmark " + bookmark.id);
 | 
| +  var child = document.createElement('li');
 | 
| +  child.className = 'bookmark';
 | 
| +  child.id = prefix + bookmark.id;
 | 
| +  child.addEventListener('click', toggleBookmark, false);
 | 
| +  if (bookmark.url && bookmark.url.length) {
 | 
| +    var link = document.createElement('a');
 | 
| +    link.href = bookmark.url;
 | 
| +    link.innerHTML = bookmark.title;
 | 
| +    link.className = 'bookmark_title';
 | 
| +    child.appendChild(link);
 | 
| +  } else {
 | 
| +    var title = document.createElement('div');
 | 
| +    title.innerHTML = bookmark.title;
 | 
| +    title.className = 'bookmark_title';
 | 
| +    child.appendChild(title);
 | 
| +  }
 | 
| +  parent.appendChild(child);
 | 
| +};
 | 
| +
 | 
| +var addBookmarks = function(bookmarks, parent) {
 | 
| +  console.log("addBookmarks " + parent.id);
 | 
| +  var list = document.createElement("ul");
 | 
| +  parent.appendChild(list);
 | 
| +  bookmarks.forEach(function(bookmark) { addBookmark(bookmark, list); });
 | 
| +};
 | 
| +
 | 
| +var loadBookmarks = function() {
 | 
| +  var container = document.getElementById('container');
 | 
| +  chromium.bookmarks.get([], function(results) {
 | 
| +    var root = results[0];
 | 
| +    console.dir(root);
 | 
| +    var rootElement = document.createElement("div");
 | 
| +    rootElement.id = prefix + root.id;
 | 
| +    // root element is empty / invisible, just an id to be looked up
 | 
| +    container.appendChild(rootElement);
 | 
| +    chromium.bookmarks.get(root.childrenIds, function(children) {
 | 
| +      addBookmarks(children, rootElement);
 | 
| +    });
 | 
| +  });
 | 
| +};
 | 
| +
 | 
| +</script>
 | 
| +<body onload="loadBookmarks()">
 | 
| +<div id="container">
 | 
| +</div>
 | 
| +<div id="event-log"></div>
 | 
| +</body>
 | 
| 
 |