Bug 489096
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/NodeInfoCreator.java b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/NodeInfoCreator.java
index 7145fdd..2d225df 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/NodeInfoCreator.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/NodeInfoCreator.java
@@ -38,6 +38,9 @@
 	private static final String LANDMARK_TAGS = "nav|main|article|aside"; //$NON-NLS-1$
 
 	private static final String HEADER_FOOTER_TAGS = "header|footer"; //$NON-NLS-1$
+	
+	private static final String LANDMARK_ROLES = "banner|navigation|main|contentinfor|complementary|article|search|application"; 
+	//TBD form (not supported in some env)
 
 	private static final Set<String> BLOCK_TAG_SET = HtmlTagUtil.getBlockElementSet();
 
@@ -86,14 +89,15 @@
 		} else if (tagName.equals("input")) {
 			String type = el.getAttribute("type").toLowerCase();
 			if (type.equals("submit") || type.equals("reset") || type.equals("hidden") || type.equals("image")) {
-				//TODO update by using techniques (only hidden state is not labelable in HTML5)
+				// TODO update by using techniques (only hidden state is not
+				// labelable in HTML5)
 				return false;
 			} else {
 				return true;
 			}
 		}
-		//TODO update by using techniques 
-		//keygen, meter, output, progress
+		// TODO update by using techniques
+		// keygen, meter, output, progress
 		return false;
 	}
 
@@ -209,6 +213,7 @@
 
 				Node curNode = p.getNode();
 				while (curNode != null) {
+					boolean hasHeadingRole = false;
 					String nodeName = curNode.getNodeName();
 					if (curNode.getNodeType() == Node.ELEMENT_NODE) {
 						Element tmpE = (Element) curNode;
@@ -220,6 +225,9 @@
 							isVisible = false;
 							// System.out.println(tmpE.getAttribute("id"));
 						}
+						if (tmpE.hasAttribute("role") && "heading".equalsIgnoreCase(tmpE.getAttribute("role"))) {
+							hasHeadingRole = true;
+						}
 					}
 
 					if (nodeName.matches(HEADING_TAGS)) {
@@ -238,6 +246,11 @@
 						info.appendComment("mark");
 					}
 
+					if (hasHeadingRole && !info.isHeading()) {
+						info.setHeading(true);
+						info.appendComment("Heading: " + nodeName + " (role=\"heading\").");
+					}
+
 					if (nodeName.equals("body")) {
 						break;
 					}
@@ -368,8 +381,16 @@
 								// System.out.println("Landmark: " + curNodeName
 								// + " without ancestor article/section.");
 							}
+						} else {
+							Element tmpE = (Element) curNode;
+							if (tmpE.hasAttribute("role")) {
+								String roleS = tmpE.getAttribute("role");
+								if(roleS.matches(LANDMARK_ROLES)){
+									curInfo.setLandmark(true);
+									curInfo.appendComment("Landmark: " + curNodeName + "(role=\""+roleS+"\").");									
+								}								
+							}
 						}
-
 					}
 
 					if (curInfo != null) {
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeColorUtil.java b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeColorUtil.java
index d2e8b4d..a316290 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeColorUtil.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeColorUtil.java
@@ -262,8 +262,14 @@
 				curTotalLines += curInfo.getLines();
 
 			} else if (curInfo.isHeading()) {
-				if (curInfo.getNode().getNodeName().matches("h[1-6]")) {
+				Node tmpN = curInfo.getNode();
+				if (tmpN.getNodeName().matches("h[1-6]")) {
 					headingCount++;
+				} else if (tmpN instanceof Element) {
+					Element tmpE = (Element) tmpN;
+					if (tmpE.hasAttribute("role") && "heading".equalsIgnoreCase(tmpE.getAttribute("role"))) {
+						headingCount++;
+					}
 				}
 
 				int tmpTotalWords = wordcountForHeading(headingCount);
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeViewUtil.java b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeViewUtil.java
index e8a62db..bd62ea9 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeViewUtil.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind.html/src/org/eclipse/actf/visualization/internal/engines/blind/html/util/VisualizeViewUtil.java
@@ -22,6 +22,8 @@
 import java.util.Set;
 
 import org.eclipse.actf.util.logging.DebugPrintUtil;
+import org.eclipse.actf.util.xpath.XPathService;
+import org.eclipse.actf.util.xpath.XPathServiceFactory;
 import org.eclipse.actf.visualization.engines.blind.BlindVizResourceUtil;
 import org.eclipse.actf.visualization.engines.blind.html.IBlindProblem;
 import org.eclipse.actf.visualization.engines.blind.html.VisualizeEngine;
@@ -40,6 +42,8 @@
 
 	// separated from VisualizeEngine
 
+	private static final XPathService xpathService = XPathServiceFactory.newService();
+
 	private static final String SCRIPT = "script"; //$NON-NLS-1$
 	private static final String NAME = "name"; //$NON-NLS-1$
 	private static final String TITLE = "title"; //$NON-NLS-1$
@@ -168,13 +172,27 @@
 		}
 	}
 
-	public static void visualizeLandmark(Document doc, String baseUrl) {
-		String[] landmarks = { "nav", "article", "aside" };
+	private static void addLandmarkImg(Document doc, Element target, String baseUrl, String landmarkName) {
+		Element imgel1 = doc.createElement(IMG);
+		imgel1.setAttribute(ALT, "Landmark: " + landmarkName);
+		// imgel1.setAttribute(TITLE, name);
+		imgel1.setAttribute(SRC, baseUrl + "img/" + landmarkName + ".gif");
 
-		NodeList tmpNl = doc.getElementsByTagName("main");
+		if (target.hasChildNodes()) {
+			target.insertBefore(imgel1, target.getFirstChild());
+		} else {
+			target.appendChild(imgel1);
+		}
+	}
+
+	public static void visualizeLandmark(Document doc, String baseUrl) {
+		// String[] landmarks = { "nav", "article", "aside" };
+
+		// NodeList tmpNl = doc.getElementsByTagName("main");
+		NodeList tmpNl = xpathService.evalPathForNodeList("//main|//*[@role='main']", doc);
 		for (int i = 0; i < tmpNl.getLength(); i++) {
 			Element landE = (Element) tmpNl.item(i);
-			addLandmarkImg(doc, landE, baseUrl);
+			addLandmarkImg(doc, landE, baseUrl, "main");
 
 			try {
 				Element parentE = (Element) landE.getParentNode();
@@ -186,11 +204,26 @@
 			}
 		}
 
-		for (String tag : landmarks) {
-			tmpNl = doc.getElementsByTagName(tag);
-			for (int i = 0; i < tmpNl.getLength(); i++) {
-				Element landE = (Element) tmpNl.item(i);
-				addLandmarkImg(doc, landE, baseUrl);
+		tmpNl = xpathService.evalPathForNodeList("//article|//*[@role='article']", doc);
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			addLandmarkImg(doc, (Element) tmpNl.item(i), baseUrl, "article");
+		}
+
+		tmpNl = xpathService.evalPathForNodeList("//nav|//*[@role='navigation']", doc);
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			addLandmarkImg(doc, (Element) tmpNl.item(i), baseUrl, "nav");
+		}
+
+		tmpNl = doc.getElementsByTagName("aside");
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			addLandmarkImg(doc, (Element) tmpNl.item(i), baseUrl);
+		}
+
+		tmpNl = xpathService.evalPathForNodeList("//*[@role='complementary']", doc);
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			Element landE = (Element) tmpNl.item(i);
+			if (!"aside".equalsIgnoreCase(landE.getNodeName())) {
+				addLandmarkImg(doc, landE, baseUrl, "complementary");
 			}
 		}
 
@@ -205,6 +238,33 @@
 			}
 		}
 
+		tmpNl = xpathService.evalPathForNodeList("//*[@role='banner']", doc);
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			Element landE = (Element) tmpNl.item(i);
+			if (!"header".equalsIgnoreCase(landE.getNodeName())) {
+				addLandmarkImg(doc, landE, baseUrl, "banner");
+			}
+		}
+
+		tmpNl = xpathService.evalPathForNodeList("//*[@role='contentinfo']", doc);
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			Element landE = (Element) tmpNl.item(i);
+			if (!"footer".equalsIgnoreCase(landE.getNodeName())) {
+				addLandmarkImg(doc, landE, baseUrl, "contentinfo");
+			}
+		}
+
+		tmpNl = xpathService.evalPathForNodeList("//*[@role='application']", doc);
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			addLandmarkImg(doc, (Element) tmpNl.item(i), baseUrl, "application");
+		}
+		
+		tmpNl = xpathService.evalPathForNodeList("//*[@role='search']", doc);
+		for (int i = 0; i < tmpNl.getLength(); i++) {
+			addLandmarkImg(doc, (Element) tmpNl.item(i), baseUrl, "search");
+		}
+
+
 		NodeList nl = doc.getElementsByTagName("head");
 		if (nl.getLength() > 0) {
 			Element el = (Element) nl.item(0);
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/BlindVizResourceUtil.java b/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/BlindVizResourceUtil.java
index 1359af1..04f339e 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/BlindVizResourceUtil.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/BlindVizResourceUtil.java
@@ -72,6 +72,12 @@
 		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/header.gif"), path + "header.gif", true);
 		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/main.gif"), path + "main.gif", true);
 		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/nav.gif"), path + "nav.gif", true);
+		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/application.gif"), path + "application.gif", true);
+		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/banner.gif"), path + "banner.gif", true);
+		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/complementary.gif"), path + "complementary.gif", true);
+		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/contentinfo.gif"), path + "contentinfo.gif", true);
+		FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/search.gif"), path + "search.gif", true);
+		//FileUtils.copyFile(bundleBlind, new Path("vizResources/landmark_icons/form.gif"), path + "form.gif", true);
 
 	}
 
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/css/visualization.css b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/css/visualization.css
index 12d8f6e..3d0ed0f 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/css/visualization.css
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/css/visualization.css
@@ -2,18 +2,18 @@
 	border: 5px blue solid; padding: 2px; margin: 1px;

 }

 

-article,nav {			

+article,nav,*[role="article"],*[role="navigation"],*[role="application"] {			

 	border: 2px blue solid; padding: 2px; margin: 1px;

 }

 

-.header_footer {			

+.header_footer,*[role="banner"],*[role="contentinfo"] {	

 	border: 2px blue solid; padding: 2px; margin: 1px;

 }

 

-aside {			

+aside,*[role="complementary"],*[role="search"] {			

 	border: 1px blue solid; padding: 1px; margin: 1px;

 }

 

-section {

+section,*[role="region"] {

 	border: 1px blue dotted; padding: 1px; margin: 1px;

 }

diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/application.gif b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/application.gif
new file mode 100644
index 0000000..7234682
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/application.gif
Binary files differ
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/banner.gif b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/banner.gif
new file mode 100644
index 0000000..45ed9db
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/banner.gif
Binary files differ
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/complementary.gif b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/complementary.gif
new file mode 100644
index 0000000..c1ec2ab
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/complementary.gif
Binary files differ
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/contentinfo.gif b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/contentinfo.gif
new file mode 100644
index 0000000..28b4bf1
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/contentinfo.gif
Binary files differ
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/form.gif b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/form.gif
new file mode 100644
index 0000000..c092172
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/form.gif
Binary files differ
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/search.gif b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/search.gif
new file mode 100644
index 0000000..63c8042
--- /dev/null
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/vizResources/landmark_icons/search.gif
Binary files differ
diff --git a/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml b/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
index efed27b..f19499f 100644
--- a/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
+++ b/plugins/org.eclipse.actf.visualization.eval/resources/checkitem.xml
@@ -265,11 +265,11 @@
             <gItem id="o" name="Section508"/>

             <gItem techniques="H42" id="1.3.1" name="JIS"/>

             <gItem techniques="G1, G123, G124, H69" id="2.4.1" name="JIS"/>

-            <gItem techniques="G141" id="2.4.10" name="JIS"/>

+            <gItem techniques="G141,ARIA12" id="2.4.10" name="JIS"/>

             <gItem id="8" name="IBMGuideline"/>

             <gItem techniques="H42" id="1.3.1" name="WCAG 2.0"/>

             <gItem techniques="G1, G123, G124, H69" id="2.4.1" name="WCAG 2.0"/>

-            <gItem techniques="G141" id="2.4.10" name="WCAG 2.0"/>

+            <gItem techniques="G141,ARIA12" id="2.4.10" name="WCAG 2.0"/>

         </guideline>

         <metrics>

             <mItem name="Perceivable"/>