[367856] [validation] Track javascript dependencies for validation in HTML
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java index 0186a71..6eb852a 100644 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/preferences/HTMLCorePreferenceInitializer.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2011 IBM Corporation and others. + * Copyright (c) 2005, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -81,7 +81,7 @@ node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_DUPLICATE, ValidationMessage.WARNING); node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_MISMATCH, ValidationMessage.ERROR); node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_UNCLOSED, ValidationMessage.WARNING); - node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND, ValidationMessage.IGNORE); + node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND, ValidationMessage.WARNING); node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_OBSOLETE_NAME, ValidationMessage.WARNING); node.putInt(HTMLCorePreferenceNames.ATTRIBUTE_VALUE_EQUALS_MISSING, ValidationMessage.WARNING);
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java index 272a45b..347db0d 100644 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLAttributeValidator.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2011 IBM Corporation and others. + * Copyright (c) 2004, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.wst.html.core.internal.validate; +import java.util.Collection; import java.util.List; import java.util.Locale; @@ -41,6 +42,7 @@ public class HTMLAttributeValidator extends PrimeValidator { + private static final String JAVASCRIPT_PREFIX = "javascript:"; //$NON-NLS-1$ private static final int REGION_NAME = 1; private static final int REGION_VALUE = 2; // <<D210422 @@ -210,17 +212,24 @@ } } else if (CMDataType.URI.equals(attrType.getDataTypeName())) { - // TODO: URI validation? - if (false && actualValue.indexOf('#') < 0 && actualValue.indexOf(":/") == -1 && CMUtil.isHTML(edec)) { //$NON-NLS-1$ //$NON-NLS-2$ + if (actualValue.indexOf('#') < 0 && actualValue.indexOf(":/") < 0 && !actualValue.toLowerCase(Locale.ENGLISH).startsWith(JAVASCRIPT_PREFIX) && CMUtil.isHTML(edec)) { //$NON-NLS-1$ //$NON-NLS-2$ IStructuredDocumentRegion start = ((IDOMNode) node).getStartStructuredDocumentRegion(); + // roundabout start tag check if (start != null && start.getFirstRegion().getTextLength() == 1) { - IPath basePath = new Path(((IDOMNode) node).getModel().getBaseLocation()); - if (basePath.segmentCount() > 1) { - IPath path = ModuleCoreSupport.resolve(basePath, actualValue); - IResource found = ResourcesPlugin.getWorkspace().getRoot().findMember(path); - if (found == null || !found.isAccessible()) { - rgnType = REGION_VALUE; - state = ErrorState.RESOURCE_NOT_FOUND; + // only check when we have a way to set dependencies + Collection dependencies = (Collection) ((IDOMNode) node).getOwnerDocument().getUserData(HTMLValidationAdapterFactory.DEPENDENCIES); + if (dependencies != null) { + IPath basePath = new Path(((IDOMNode) node).getModel().getBaseLocation()); + if (basePath.segmentCount() > 1) { + IPath path = ModuleCoreSupport.resolve(basePath, actualValue); + IResource found = ResourcesPlugin.getWorkspace().getRoot().findMember(path); + if (found == null) { + rgnType = REGION_VALUE; + state = ErrorState.RESOURCE_NOT_FOUND; + } + else { + dependencies.add(found); + } } } }
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java index 1010e04..335d3e8 100644 --- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java +++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/validate/HTMLValidationAdapterFactory.java
@@ -23,6 +23,8 @@ private static HTMLValidationAdapterFactory instance = null; + public static final String DEPENDENCIES = "org.eclipse.wst.html.validator.dependencies"; //$NON-NLS-1$ + /** * HTMLValidationAdapterFactory constructor comment. */
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 77df2fe..e203e40 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
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2001, 2011 IBM Corporation and others. + * Copyright (c) 2001, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -13,6 +13,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import org.eclipse.core.filebuffers.ITextFileBuffer; @@ -448,7 +450,7 @@ if (resource instanceof IFile) { Message message = new LocalizedMessage(IMessage.LOW_SEVERITY, resource.getFullPath().toString().substring(1)); reporter.displaySubtask(this, message); - validateFile(helper, reporter, (IFile) resource); + validateFile(helper, reporter, (IFile) resource, null); } else if (resource instanceof IContainer) { validateContainer(helper, reporter, (IContainer) resource); @@ -476,13 +478,13 @@ IResource resource = getResource(delta); if (resource == null || !(resource instanceof IFile)) continue; - validateFile(helper, reporter, (IFile) resource); + validateFile(helper, reporter, (IFile) resource, null); } } /** */ - private void validateFile(IValidationContext helper, IReporter reporter, IFile file) { + private void validateFile(IValidationContext helper, IReporter reporter, IFile file, ValidationResult result) { if ((reporter != null) && (reporter.isCancelled() == true)) { throw new OperationCanceledException(); } @@ -494,7 +496,16 @@ return; try { + Collection dependencies = null; + if (result != null) { + dependencies = new HashSet(); + model.getDocument().setUserData(HTMLValidationAdapterFactory.DEPENDENCIES, dependencies, null); + } validate(reporter, file, model); + if (result != null) { + model.getDocument().setUserData(HTMLValidationAdapterFactory.DEPENDENCIES, null, null); + result.setDependsOn((IResource[]) dependencies.toArray(new IResource[dependencies.size()])); + } } finally { releaseModel(model); @@ -562,7 +573,7 @@ return null; ValidationResult result = new ValidationResult(); IReporter reporter = result.getReporter(monitor); - validateFile(null, reporter, (IFile) resource); + validateFile(null, reporter, (IFile) resource, result); return result; } } \ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLValidationPreferencePage.java b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLValidationPreferencePage.java index 9186cce..e3db43c 100644 --- a/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLValidationPreferencePage.java +++ b/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/preferences/ui/HTMLValidationPreferencePage.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2011 IBM Corporation and others. + * Copyright (c) 2008, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -174,8 +174,7 @@ addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_VALUE_EQUALS_MISSING, SEVERITIES, errorWarningIgnoreLabel, 0); label = HTMLUIMessages.HTMLValidationPreferencePage_35; - // TODO: validate resources? - // addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND, SEVERITIES, errorWarningIgnoreLabel, 0); + addComboBox(inner, label, HTMLCorePreferenceNames.ATTRIBUTE_VALUE_RESOURCE_NOT_FOUND, SEVERITIES, errorWarningIgnoreLabel, 0); // End Attribute section