[Bug 281318]
diff --git a/plugins/org.eclipse.actf.visualization.blind.html/src/org/eclipse/actf/visualization/blind/html/BlindVisualizerHtml.java b/plugins/org.eclipse.actf.visualization.blind.html/src/org/eclipse/actf/visualization/blind/html/BlindVisualizerHtml.java
index 05453a7..11f0256 100644
--- a/plugins/org.eclipse.actf.visualization.blind.html/src/org/eclipse/actf/visualization/blind/html/BlindVisualizerHtml.java
+++ b/plugins/org.eclipse.actf.visualization.blind.html/src/org/eclipse/actf/visualization/blind/html/BlindVisualizerHtml.java
@@ -18,6 +18,7 @@
 import java.io.PrintWriter;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.Vector;
 
@@ -82,6 +83,8 @@
 		return false;
 	}
 
+	private final boolean PERFORMANCE_DEBUG = false;
+	
 	public int visualize() {
 		GuidelineHolder.getInstance().setTargetMimeType("text/html"); //$NON-NLS-1$
 
@@ -92,13 +95,15 @@
 		File targetFile;
 
 		try {
-
+			if (PERFORMANCE_DEBUG) System.out.println("vizualize start\t"+(new Date()).getTime());
 			srcFile = webBrowser.saveOriginalDocument(tmpDirS + ORIG_HTML_FILE);
 			liveFile = webBrowser
 					.saveDocumentAsHTMLFile(tmpDirS + IE_HTML_FILE);
 			// for srcViewer
 			webBrowser.saveOriginalDocument(tmpDirS + HTML_SOURCE_FILE);
 
+			if (PERFORMANCE_DEBUG) System.out.println("save documents\t"+(new Date()).getTime());
+
 			Vector<Html2ViewMapData> html2ViewMapV = new Vector<Html2ViewMapData>();
 			IHTMLParser htmlParser = HTMLParserFactory.createHTMLParser();
 			HtmlErrorLogListener errorLogListener = new HtmlErrorLogListener();
@@ -148,6 +153,8 @@
 
 				targetFile = srcFile;
 			}
+			if (PERFORMANCE_DEBUG) System.out.println("parse documents\t"+(new Date()).getTime());
+
 			// System.out.println(document+" "+ _originalDom+" "+ ieDom);
 
 			boolean hasFrame = false;
@@ -182,9 +189,13 @@
 			// engine.setInvisibleIdSet(invisibleIdSet);
 
 			engine.setInvisibleIdSet(new HashSet<String>());
+			if (PERFORMANCE_DEBUG) System.out.println("setInvisibleIdSet\t"+(new Date()).getTime());
 
 			engine.setPageData(pageData);
+			if (PERFORMANCE_DEBUG) System.out.println("setPageData\t"+(new Date()).getTime());
+
 			engine.visualize();
+			if (PERFORMANCE_DEBUG) System.out.println("do vizualize\t"+(new Date()).getTime());
 
 			maxReachingTime = engine.getMaxTime();
 			setInfoMessage(getMaxReachingTime());
@@ -212,6 +223,8 @@
 			edu.setSrcFile(srcFile);
 			edu.setTargetFile(targetFile);
 
+			if (PERFORMANCE_DEBUG) System.out.println("HtmlEvalUtil\t"+(new Date()).getTime());
+
 			ArrayList<IProblemItem> tmpResults = new ArrayList<IProblemItem>(
 					1024);
 
@@ -233,6 +246,9 @@
 					tmpResults.addAll(checkers[i].check(checkTarget));
 				}
 			}
+			
+			if (PERFORMANCE_DEBUG) System.out.println("checked\t"+(new Date()).getTime());
+
 
 			// TODO support blind biz -> visitor
 			for (int i = 0; i < tmpResults.size(); i++) {
@@ -252,6 +268,9 @@
 			checkResult
 					.addProblemItems(errorLogListener.getHtmlProblemVector());
 			checkResult.accept(pageData);
+			
+			if (PERFORMANCE_DEBUG) System.out.println("process problems\t"+(new Date()).getTime());
+
 
 			// TODO move (add Icons into result doc) here
 
@@ -272,6 +291,7 @@
 						.devOrDebugPrintln("error: saveHtmlDocumentAsUTF8"); //$NON-NLS-1$
 			}
 
+			if (PERFORMANCE_DEBUG) System.out.println("vizualize end\t"+(new Date()).getTime());
 			if (hasFrame) {
 				pageData.setHasFrame(true);
 				return FRAME;
diff --git a/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java b/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java
index b14c754..fa2fc40 100644
--- a/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java
+++ b/plugins/org.eclipse.actf.visualization.engines.blind/src/org/eclipse/actf/visualization/engines/blind/eval/EvaluationResultBlind.java
@@ -15,24 +15,16 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.actf.util.xpath.XPathService;
-import org.eclipse.actf.util.xpath.XPathServiceFactory;
 import org.eclipse.actf.visualization.eval.EvaluationResultImpl;
 import org.eclipse.actf.visualization.eval.IEvaluationResult;
 import org.eclipse.actf.visualization.eval.guideline.GuidelineHolder;
+import org.eclipse.actf.visualization.eval.html.HtmlTagUtil;
 import org.eclipse.actf.visualization.eval.problem.IProblemItem;
-import org.w3c.dom.NodeList;
 
 /**
  * Implementation class of {@link IEvaluationResult}
  */
 public class EvaluationResultBlind extends EvaluationResultImpl {
-
-	private static final XPathService xpathService = XPathServiceFactory
-			.newService();
-	private static final Object EXP1 = xpathService
-			.compile("ancestor::noscript"); //$NON-NLS-1$
-
 	private int count = 0;
 	private PageEvaluation pageEvaluation = null;
 
@@ -56,10 +48,8 @@
 					tmpItem.setSerialNumber(count);
 					if (tmpItem.isCanHighlight()
 							&& tmpItem.getTargetNode() != null) {
-						NodeList tmpNL = xpathService.evalForNodeList(EXP1,
-								tmpItem.getTargetNode());
-						// noframes can highlight
-						if (tmpNL != null && tmpNL.getLength() > 0) {
+						
+						if (HtmlTagUtil.hasAncestor(tmpItem.getTargetNode(), "script")) {
 							tmpItem.setCanHighlight(false);
 						}
 					}
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
index 15f8b7c..15846f3 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlEvalUtil.java
@@ -15,6 +15,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -38,6 +39,8 @@
  * Utility class for HTML evaluation
  */
 public class HtmlEvalUtil extends HtmlTagUtil {
+	
+	private static final boolean PERFORMANCE_DEBUG = false;
 
 	private static final int LONG_TEXT_NUM = 200; // TODO check
 
@@ -247,6 +250,8 @@
 		this.document2IdMap = document2IdMap;
 		// this.html2ViewMapData = html2ViewMapData;
 
+		if (PERFORMANCE_DEBUG) System.out.println("document2IdMap\t"+(new Date()).getTime());
+
 		this.isDBCS = isDBCS;
 
 		// prepare freq use elements
@@ -255,7 +260,7 @@
 
 		NodeList tmpNL = xpathService.evalForNodeList(EXP1, target);
 		int length = tmpNL.getLength();
-
+		
 		if (length > 0) {
 			hasAwithHref = true;
 		}
@@ -293,6 +298,8 @@
 		pageData.setImageDataMap(tmpMap);
 		pageData.setLinkImageDataMap(linkImgMap);
 
+		if (PERFORMANCE_DEBUG) System.out.println("process images\t"+(new Date()).getTime());
+
 		// TODO use XPath
 		tmpNL = target.getElementsByTagName("table"); //$NON-NLS-1$
 		length = tmpNL.getLength();
@@ -324,11 +331,16 @@
 		b1row1colV.toArray(bottom_1row1col_tables);
 		bNotDataV.toArray(bottom_notdata_tables);
 		parentV.toArray(parent_table_elements);
+		
+		if (PERFORMANCE_DEBUG) System.out.println("process tables\t"+(new Date()).getTime());
+
 
 		body_elements = getElementsArray(target, "body");
 		frame_elements = getElementsArray(target, "frame");
 		iframe_elements = getElementsArray(target, "iframe");
 
+		if (PERFORMANCE_DEBUG) System.out.println("process frames\t"+(new Date()).getTime());
+
 		HashSet<Element> embedInObjectSet = new HashSet<Element>();
 
 		// TODO ieDOM
@@ -402,6 +414,8 @@
 			}
 		}
 
+		if (PERFORMANCE_DEBUG) System.out.println("process object\t"+(new Date()).getTime());
+
 		NodeList headingsNL = xpathService.evalForNodeList(EXP2, target);
 		length = headingsNL.getLength();
 		Vector<HeadingsData> tmpV2 = new Vector<HeadingsData>();
@@ -413,8 +427,12 @@
 		}
 		pageData.setHeadingsData(tmpV2);
 
+		if (PERFORMANCE_DEBUG) System.out.println("process headins\t"+(new Date()).getTime());
+
 		collectScriptElements();
+		if (PERFORMANCE_DEBUG) System.out.println("collectScriptElements\t"+(new Date()).getTime());
 		calcDomDifference();
+		if (PERFORMANCE_DEBUG) System.out.println("calcDomDifference\t"+(new Date()).getTime());
 	}
 
 	private Element[] getElementsArray(Document target, String tagName) {
@@ -508,10 +526,19 @@
 					.asList(aWithHref_hrefs));
 			// trim()?
 
+			/*
 			NodeList ieNL = xpathService.evalForNodeList(EXP1, liveDom);
 			int size = ieNL.getLength();
+			*/
+			
+			NodeList ieNL = liveDom.getElementsByTagName("a");
+			int size = ieNL.getLength();
+
 			for (int i = 0; i < size; i++) {
 				Element tmpE = (Element) ieNL.item(i);
+				if (!tmpE.hasAttribute(ATTR_HREF)) {
+					continue;
+				}
 				String tmpS = tmpE.getAttribute(ATTR_HREF);
 				if (!existSet.contains(tmpS)) {
 					notExistHrefSet.add(tmpS);
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java
index b9ee8d8..8f330b1 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/HtmlTagUtil.java
@@ -81,6 +81,27 @@
 		}
 		return (result);
 	}
+	
+
+	/**
+	 * Get ancestor node whose name is specified target name 
+	 * 
+	 * @param target
+	 *            target {@link Node}
+	 * @param ancestorName
+	 *            target ancestor tag name
+	 * @return true if target {@link Node} has target ancestor
+	 */
+	public static Node getAncestor(Node target, String ancestorName) {
+		Node tmpNode = target;
+		while (tmpNode != null) {
+			if (tmpNode.getNodeName().equals(ancestorName)) {
+				return tmpNode;
+			}
+			tmpNode = tmpNode.getParentNode();
+		}
+		return null;
+	}
 
 	/**
 	 * Get <i>noscript</i> text of the {@link Node}
diff --git a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
index 2af850d..a26a7e3 100644
--- a/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
+++ b/plugins/org.eclipse.actf.visualization.eval/src/org/eclipse/actf/visualization/eval/html/statistics/ImageStatData.java
@@ -17,11 +17,12 @@
 import org.eclipse.actf.util.FileUtils;
 import org.eclipse.actf.util.xpath.XPathService;
 import org.eclipse.actf.util.xpath.XPathServiceFactory;
+import org.eclipse.actf.visualization.eval.html.HtmlTagUtil;
 import org.eclipse.actf.visualization.eval.problem.IProblemItem;
 import org.eclipse.actf.visualization.eval.problem.ProblemItemImpl;
 import org.eclipse.actf.visualization.internal.eval.XMLStringUtil;
 import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
+import org.w3c.dom.Node;
 import org.w3c.dom.html.HTMLAnchorElement;
 import org.w3c.dom.html.HTMLImageElement;
 import org.xml.sax.Attributes;
@@ -37,10 +38,6 @@
 
 	public static final String LONGDESC = "longdesc"; //$NON-NLS-1$
 
-	private static final XPathService xpathService = XPathServiceFactory
-			.newService();
-	private static final Object EXP1 = xpathService.compile("ancestor::a"); //$NON-NLS-1$
-
 	protected String altS = ""; //$NON-NLS-1$
 
 	protected Element ancestorLink = null;
@@ -117,18 +114,19 @@
 		}
 
 		isMap = target.getIsMap();
+		
 
-		NodeList tmpNL = xpathService.evalForNodeList(EXP1, target);
-		// XPathUtil.showNodeList(tmpNL,true);
-		int len = tmpNL.getLength();
-		if (len > 0) {
-			HTMLAnchorElement tmpE = (HTMLAnchorElement) tmpNL.item(0);
-			if (isInLink = tmpE.hasAttribute(HREF)) {
-				destUrlS = tmpE.getHref();
-				ancestorLink = tmpE;
-				try {
-					destUrlS = new URL(baseURL, destUrlS).toString();
-				} catch (Exception e) {
+		if (HtmlTagUtil.hasAncestor(target, "a")) {
+			Node temp = HtmlTagUtil.getAncestor(target, "a");
+			if (temp != null) {
+				HTMLAnchorElement tmpE = (HTMLAnchorElement) temp;
+				if (isInLink = tmpE.hasAttribute(HREF)) {
+					destUrlS = tmpE.getHref();
+					ancestorLink = tmpE;
+					try {
+						destUrlS = new URL(baseURL, destUrlS).toString();
+					} catch (Exception e) {
+					}
 				}
 			}
 		}