tweaked HTMLValidator to implement ISourceValidator, so that as-you-type validation can utilize partial document validation.
diff --git a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidator.java b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidator.java
index 5edd04e..962fc92 100644
--- a/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidator.java
+++ b/bundles/org.eclipse.wst.html.ui/src-html-validation/org/eclipse/wst/html/internal/validation/HTMLValidator.java
@@ -13,6 +13,7 @@
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 
+import org.eclipse.core.filebuffers.ITextFileBuffer;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -26,15 +27,21 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.html.core.internal.validate.HTMLValidationAdapterFactory;
 import org.eclipse.wst.html.ui.internal.HTMLUIMessages;
+import org.eclipse.wst.sse.core.internal.FileBufferModelManager;
 import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
 import org.eclipse.wst.sse.core.internal.provisional.StructuredModelManager;
 import org.eclipse.wst.sse.core.internal.util.URIResolver;
 import org.eclipse.wst.sse.core.internal.validate.ValidationAdapter;
+import org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator;
 import org.eclipse.wst.validation.internal.core.Message;
 import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
 import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
@@ -46,7 +53,7 @@
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
 
-public class HTMLValidator implements IValidator {
+public class HTMLValidator implements IValidator, ISourceValidator {
 	private static final String ORG_ECLIPSE_JST_JSP_CORE_JSPSOURCE = "org.eclipse.jst.jsp.core.jspsource";
 	private static final String ORG_ECLIPSE_WST_HTML_CORE_HTMLSOURCE = "org.eclipse.wst.html.core.htmlsource";
 
@@ -62,6 +69,8 @@
 		return true;
 	}
 
+	private IDocument fDocument;
+
 	public HTMLValidator() {
 		super();
 	}
@@ -186,7 +195,92 @@
 			validateFull(helper, reporter);
 		}
 	}
+	
+	/**
+	 * This validate call is for the ISourceValidator partial document validation approach
+	 * @param dirtyRegion
+	 * @param helper
+	 * @param reporter
+	 *  @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
+	 */
+	public void validate(IRegion dirtyRegion, IValidationContext helper, IReporter reporter) {
+		
+		if (helper == null || fDocument == null)
+			return;
+		
+		if ((reporter != null) && (reporter.isCancelled() == true)) {
+			throw new OperationCanceledException();
+		}
+		
+		IStructuredModel model = StructuredModelManager.getModelManager().getExistingModelForRead(fDocument);
+		if (model == null)
+			return; // error
+	
+		try {
+		
+			IDOMDocument document = null;
+			if(model instanceof IDOMModel) {
+				document = ((IDOMModel)model).getDocument();
+			}
 
+			if (document == null || !hasHTMLFeature(document))
+				return ; // ignore
+	
+			ITextFileBuffer fb = FileBufferModelManager.getInstance().getBuffer(fDocument);
+			if(fb == null)
+				return;
+			
+			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(fb.getLocation());
+			if(file == null || !file.exists())
+				return;
+			
+			IndexedRegion ir = model.getIndexedRegion(dirtyRegion.getOffset());
+			if(ir instanceof INodeNotifier) {
+				
+				INodeAdapterFactory factory = HTMLValidationAdapterFactory.getInstance();
+				ValidationAdapter adapter = (ValidationAdapter) factory.adapt((INodeNotifier)ir);
+				if (adapter == null)
+					return; // error
+				
+				if (reporter != null) {
+					HTMLValidationReporter rep = null;
+					rep = getReporter(reporter, file, (IDOMModel)model);
+					rep.clear();
+					adapter.setReporter(rep);
+					
+					String fileName = "";
+					IPath filePath = file.getFullPath();
+					if (filePath != null) {
+						fileName = filePath.toString();
+					}
+					String args[] = new String[]{fileName};
+		
+					Message mess = new LocalizedMessage(IMessage.LOW_SEVERITY, NLS.bind(HTMLUIMessages.MESSAGE_HTML_VALIDATION_MESSAGE_UI_, args));
+					mess.setParams(args);
+					reporter.displaySubtask(this, mess);
+				}
+				adapter.validate(ir);
+			}
+		}
+		finally {
+			if(model != null)
+				model.releaseFromRead();
+		}
+	}
+
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
+	 */
+	public void connect(IDocument document) {
+		fDocument = document;
+	}
+	/**
+	 * @see org.eclipse.wst.sse.ui.internal.reconcile.validator.ISourceValidator
+	 */
+	public void disconnect(IDocument document) {
+		// don't need to do anything
+	}
+	
 	/**
 	 */
 	protected HTMLValidationResult validate(IDOMModel model, IFile file) {