Index: chrome/common/extensions/docs/examples/extensions/news_a11y/feed.js |
diff --git a/chrome/common/extensions/docs/examples/extensions/news_a11y/feed.html b/chrome/common/extensions/docs/examples/extensions/news_a11y/feed.js |
similarity index 52% |
copy from chrome/common/extensions/docs/examples/extensions/news_a11y/feed.html |
copy to chrome/common/extensions/docs/examples/extensions/news_a11y/feed.js |
index 1c0121f32e7712e93a71214889de229d68cd5764..db3476c2838385e8c95fb875c4bf6391328a2a45 100644 |
--- a/chrome/common/extensions/docs/examples/extensions/news_a11y/feed.html |
+++ b/chrome/common/extensions/docs/examples/extensions/news_a11y/feed.js |
@@ -1,107 +1,8 @@ |
-<!DOCTYPE html> |
-<html> |
-<head> |
-<style> |
-body { |
- font-family: helvetica, arial, sans-serif; |
- font-size: 12px; |
- overflow: hidden; |
-} |
- |
-a { |
- color:#0000CC; |
- text-decoration: underline; |
- cursor: pointer; |
-} |
- |
-.open_box { |
- display: block; |
- overflow: hidden; |
- margin-right: 4px; |
- margin-top: 2px; |
- height: 12px; |
- width: 12px; |
- float: left; |
- clear: left; |
- background-image: url(sprite_arrows.gif); |
- background-position: 0px -24px; |
- cursor: pointer; |
-} |
- |
-.opened .open_box { |
- background-position:-12px -24px; |
-} |
- |
-.item { |
- padding: 2px 0px; |
-} |
- |
-.item_title { |
- display: block; |
- min-width: 300px; |
- padding-left: 15px; |
- cursor: pointer; |
-} |
- |
-.item_desc { |
- min-width: 500px; |
- height: 0px; |
- display: block; |
- border: none; |
- padding: 0px; |
- margin: 0px; |
- -webkit-transition: height 0.2s ease-out; |
-} |
- |
-#title { |
- display: block; |
- margin-left: auto; |
-} |
- |
-.error { |
- white-space: nowrap; |
- color: red; |
-} |
- |
-.more { |
- display: block; |
- text-align: right; |
- padding-top: 20px; |
- padding-right: 10px; |
- color: #88C; |
-} |
- |
-</style> |
-<script id="iframe_script"> |
-function reportHeight() { |
- var msg = JSON.stringify({type:"size", size:document.body.offsetHeight}); |
- parent.postMessage(msg, "*"); |
-} |
- |
-function frameLoaded() { |
- var links = document.getElementsByTagName("A"); |
- for (i = 0; i < links.length; i++) { |
- var class = links[i].className; |
- if (class != "item_title" && class != "open_box") { |
- links[i].addEventListener("click", showStory); |
- } |
- } |
- window.addEventListener("message", messageHandler); |
-} |
- |
-function showStory(event) { |
- var href = event.currentTarget.href; |
- parent.postMessage(JSON.stringify({type:"show", url:href}), "*"); |
- event.preventDefault(); |
-} |
+// Copyright (c) 2011 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. |
-function messageHandler(event) { |
- reportHeight(); |
-} |
- |
-</script> |
-<script> |
-// Feed URL. |
+// Feed |
var feedUrl = 'http://news.google.com/?output=rss'; |
// The XMLHttpRequest object that tries to load and parse the feed. |
@@ -111,15 +12,15 @@ function main() { |
req = new XMLHttpRequest(); |
req.onload = handleResponse; |
req.onerror = handleError; |
- req.open("GET", feedUrl, true); |
+ req.open('GET', feedUrl, true); |
req.send(null); |
} |
// Handles feed parsing errors. |
function handleFeedParsingFailed(error) { |
- var feed = document.getElementById("feed"); |
- feed.className = "error"; |
- feed.innerText = "Error: " + error; |
+ var feed = document.getElementById('feed'); |
+ feed.className = 'error'; |
+ feed.innerText = 'Error: ' + error; |
} |
// Handles errors during the XMLHttpRequest. |
@@ -131,7 +32,7 @@ function handleError() { |
function handleResponse() { |
var doc = req.responseXML; |
if (!doc) { |
- handleFeedParsingFailed("Not a valid feed."); |
+ handleFeedParsingFailed('Not a valid feed.'); |
return; |
} |
buildPreview(doc); |
@@ -145,46 +46,48 @@ var moreStoriesUrl; |
function buildPreview(doc) { |
// Get the link to the feed source. |
- var link = doc.getElementsByTagName("link"); |
+ var link = doc.getElementsByTagName('link'); |
var parentTag = link[0].parentNode.tagName; |
- if (parentTag != "item" && parentTag != "entry") { |
+ if (parentTag != 'item' && parentTag != 'entry') { |
moreStoriesUrl = link[0].textContent; |
} |
// Setup the title image. |
- var images = doc.getElementsByTagName("image"); |
+ var images = doc.getElementsByTagName('image'); |
var titleImg; |
if (images.length != 0) { |
- var urls = images[0].getElementsByTagName("url"); |
+ var urls = images[0].getElementsByTagName('url'); |
if (urls.length != 0) { |
titleImg = urls[0].textContent; |
} |
} |
- var img = document.getElementById("title"); |
+ var img = document.getElementById('title'); |
// Listen for mouse and key events |
if (titleImg) { |
img.src = titleImg; |
if (moreStoriesUrl) { |
- document.getElementById("title_a").addEventListener("click", moreStories); |
- document.getElementById("title_a").addEventListener("keydown", |
+ document.getElementById('title_a').addEventListener('click', |
+ moreStories); |
+ document.getElementById('title_a').addEventListener('keydown', |
function(event) { |
if (event.keyCode == 13) { |
moreStories(event); |
}}); |
} |
} else { |
- img.style.display = "none"; |
+ img.style.display = 'none'; |
} |
// Construct the iframe's HTML. |
- var iframe_src = "<!doctype html><html><head><script>" + |
- document.getElementById("iframe_script").textContent + "<" + |
- "/script></head><body onload='frameLoaded();' " + |
- "style='padding:0px;margin:0px;'>"; |
+ var iframe_src = '<!doctype html><html><head><script ' + |
+ 'src="chrome-extension://ldglnfnokeifbcaeppacaejckagballg/' + |
+ 'feed_iframe.js"><' + '/script><link href="chrome-extension://ldglnf' + |
+ 'nokeifbcaeppacaejckagballg/feed_iframe.css" rel="stylesheet" ' + |
+ 'type="text/css"></head><body>'; |
- var feed = document.getElementById("feed"); |
+ var feed = document.getElementById('feed'); |
// Set ARIA role indicating the feed element has a tree structure |
- feed.setAttribute("role", "tree"); |
+ feed.setAttribute('role', 'tree'); |
var entries = doc.getElementsByTagName('entry'); |
if (entries.length == 0) { |
@@ -199,7 +102,7 @@ function buildPreview(doc) { |
if (itemTitle) { |
itemTitle = itemTitle.textContent; |
} else { |
- itemTitle = "Unknown title"; |
+ itemTitle = 'Unknown title'; |
} |
// Grab the description. |
@@ -216,63 +119,63 @@ function buildPreview(doc) { |
itemDesc = ''; |
} |
- var item = document.createElement("div"); |
- item.className = "item"; |
- var box = document.createElement("div"); |
- box.className = "open_box"; |
- box.addEventListener("click", showDesc); |
+ var item = document.createElement('div'); |
+ item.className = 'item'; |
+ var box = document.createElement('div'); |
+ box.className = 'open_box'; |
+ box.addEventListener('click', showDesc); |
// Disable focusing on box image separately from rest of tree item |
box.tabIndex = -1; |
item.appendChild(box); |
- var title = document.createElement("a"); |
- title.className = "item_title"; |
+ var title = document.createElement('a'); |
+ title.className = 'item_title'; |
// Give title an ID for use with ARIA |
- title.id = "item" + i; |
+ title.id = 'item' + i; |
title.innerText = itemTitle; |
- title.addEventListener("click", showDesc); |
- title.addEventListener("keydown", keyHandlerShowDesc); |
+ title.addEventListener('click', showDesc); |
+ title.addEventListener('keydown', keyHandlerShowDesc); |
// Update aria-activedescendant property in response to focus change |
// within the tree |
- title.addEventListener("focus", function(event) { |
+ title.addEventListener('focus', function(event) { |
feed.setAttribute( |
- "aria-activedescendant", this.id); |
+ 'aria-activedescendant', this.id); |
}); |
// Enable keyboard focus on the item title element |
title.tabIndex = 0; |
// Set ARIA role role indicating that the title element is a node in the |
// tree structure |
- title.setAttribute("role", "treeitem"); |
+ title.setAttribute('role', 'treeitem'); |
// Set the ARIA state indicating this tree item is currently collapsed. |
- title.setAttribute("aria-expanded", "false"); |
+ title.setAttribute('aria-expanded', 'false'); |
// Set ARIA property indicating that all items are at the same hierarchical |
// level (no nesting) |
- title.setAttribute("aria-level", "1"); |
+ title.setAttribute('aria-level', '1'); |
item.appendChild(title); |
- var desc = document.createElement("iframe"); |
- desc.scrolling = "no"; |
- desc.className = "item_desc"; |
+ var desc = document.createElement('iframe'); |
+ desc.scrolling = 'no'; |
+ desc.className = 'item_desc'; |
// Disable keyboard focus on elements in iFrames that have not been |
// displayed yet |
desc.tabIndex = -1; |
- item.appendChild(desc); |
- feed.appendChild(item); |
- |
// The story body is created as an iframe with a data: URL in order to |
// isolate it from this page and protect against XSS. As a data URL, it |
// has limited privileges and must communicate back using postMessage(). |
- desc.src="data:text/html," + iframe_src + itemDesc + "</body></html>"; |
+ desc.src='data:text/html,' + iframe_src + itemDesc + '</body></html>'; |
+ |
+ item.appendChild(desc); |
+ feed.appendChild(item); |
} |
if (moreStoriesUrl) { |
- var more = document.createElement("a"); |
- more.className = "more"; |
- more.innerText = "More stories \u00BB"; |
+ var more = document.createElement('a'); |
+ more.className = 'more'; |
+ more.innerText = 'More stories \u00BB'; |
more.tabIndex = 0; |
- more.addEventListener("click", moreStories); |
- more.addEventListener("keydown", function(event) { |
+ more.addEventListener('click', moreStories); |
+ more.addEventListener('keydown', function(event) { |
if (event.keyCode == 13) { |
moreStories(event); |
}}); |
@@ -283,7 +186,7 @@ function buildPreview(doc) { |
// Show |url| in a new tab. |
function showUrl(url) { |
// Only allow http and https URLs. |
- if (url.indexOf("http:") != 0 && url.indexOf("https:") != 0) { |
+ if (url.indexOf('http:') != 0 && url.indexOf('https:') != 0) { |
return; |
} |
chrome.tabs.create({url: url}); |
@@ -300,10 +203,10 @@ function keyHandlerShowDesc(event) { |
// Move to previous heading when up-arrow pressed |
if (event.keyCode == 32) { |
showDesc(event); |
- } else if ((this.parentNode.className == "item opened") && |
+ } else if ((this.parentNode.className == 'item opened') && |
(event.keyCode == 37)) { |
showDesc(event); |
- } else if ((this.parentNode.className == "item") && (event.keyCode == 39)) { |
+ } else if ((this.parentNode.className == 'item') && (event.keyCode == 39)) { |
showDesc(event); |
} else if (event.keyCode == 40) { |
if (this.parentNode.nextSibling) { |
@@ -318,22 +221,22 @@ function keyHandlerShowDesc(event) { |
function showDesc(event) { |
var item = event.currentTarget.parentNode; |
- var items = document.getElementsByClassName("item"); |
+ var items = document.getElementsByClassName('item'); |
for (var i = 0; i < items.length; i++) { |
- var iframe = items[i].getElementsByClassName("item_desc")[0]; |
- if (items[i] == item && items[i].className == "item") { |
- items[i].className = "item opened"; |
- iframe.contentWindow.postMessage("reportHeight", "*"); |
+ var iframe = items[i].getElementsByClassName('item_desc')[0]; |
+ if (items[i] == item && items[i].className == 'item') { |
+ items[i].className = 'item opened'; |
+ iframe.contentWindow.postMessage('reportHeight', '*'); |
// Set the ARIA state indicating the tree item is currently expanded. |
- items[i].getElementsByClassName("item_title")[0]. |
- setAttribute("aria-expanded", "true"); |
+ items[i].getElementsByClassName('item_title')[0]. |
+ setAttribute('aria-expanded', 'true'); |
iframe.tabIndex = 0; |
} else { |
- items[i].className = "item"; |
- iframe.style.height = "0px"; |
+ items[i].className = 'item'; |
+ iframe.style.height = '0px'; |
// Set the ARIA state indicating the tree item is currently collapsed. |
- items[i].getElementsByClassName("item_title")[0]. |
- setAttribute("aria-expanded", "false"); |
+ items[i].getElementsByClassName('item_title')[0]. |
+ setAttribute('aria-expanded', 'false'); |
iframe.tabIndex = -1; |
} |
} |
@@ -341,23 +244,23 @@ function showDesc(event) { |
function iframeMessageHandler(e) { |
// Only listen to messages from one of our own iframes. |
- var iframes = document.getElementsByTagName("IFRAME"); |
+ var iframes = document.getElementsByTagName('IFRAME'); |
for (var i = 0; i < iframes.length; i++) { |
if (iframes[i].contentWindow == e.source) { |
var msg = JSON.parse(e.data); |
if (msg) { |
- if (msg.type == "size") { |
- iframes[i].style.height = msg.size + "px"; |
- } else if (msg.type == "show") { |
+ if (msg.type == 'size') { |
+ iframes[i].style.height = msg.size + 'px'; |
+ } else if (msg.type == 'show') { |
var url = msg.url; |
- if (url.indexOf("http://news.google.com") == 0) { |
+ if (url.indexOf('http://news.google.com') == 0) { |
// If the URL is a redirect URL, strip of the destination and go to |
// that directly. This is necessary because the Google news |
// redirector blocks use of the redirects in this case. |
- var index = url.indexOf("&url="); |
+ var index = url.indexOf('&url='); |
if (index >= 0) { |
url = url.substring(index + 5); |
- index = url.indexOf("&"); |
+ index = url.indexOf('&'); |
if (index >= 0) |
url = url.substring(0, index); |
} |
@@ -370,12 +273,5 @@ function iframeMessageHandler(e) { |
} |
} |
-window.addEventListener("message", iframeMessageHandler); |
-</script> |
-</head> |
-<body onload="main();"> |
-<a id="title_a" tabIndex="0"><img id='title' alt="Google News logo"></a> |
-<div id="feed"></div> |
-</body> |
-</html> |
- |
+window.addEventListener('message', iframeMessageHandler); |
+document.addEventListener('DOMContentLoaded', main); |