Author: sebb
Date: Sat Mar  3 03:27:49 2007
New Revision: 514130

URL: http://svn.apache.org/viewvc?view=rev&rev=514130
Log:
Bug 40696 - retrieve embedded resources from STYLE URL() attributes

Modified:
    jakarta/jmeter/branches/rel-2-2/bin/testfiles/HTMLParserTestCase.html
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HTMLParser.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
    
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml

Modified: jakarta/jmeter/branches/rel-2-2/bin/testfiles/HTMLParserTestCase.html
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/bin/testfiles/HTMLParserTestCase.html?view=diff&rev=514130&r1=514129&r2=514130
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/bin/testfiles/HTMLParserTestCase.html 
(original)
+++ jakarta/jmeter/branches/rel-2-2/bin/testfiles/HTMLParserTestCase.html Sat 
Mar  3 03:27:49 2007
@@ -3,7 +3,7 @@
 </head>
 <body background="images/body.gif">
 <table background="images/table.gif">
-<tr background="images/tr.gif">
+<tr style="background url('images/tr.gif')">
 <td background="images/td.gif"><img name="a" src="images/image-a.gif" 
align="top"></td>
 </tr>
 </table>

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HTMLParser.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HTMLParser.java?view=diff&rev=514130&r1=514129&r2=514130
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HTMLParser.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HTMLParser.java
 Sat Mar  3 03:27:49 2007
@@ -41,6 +41,7 @@
     protected static final String ATT_HREF          = "href";// $NON-NLS-1$
     protected static final String ATT_REL           = "rel";// $NON-NLS-1$
     protected static final String ATT_SRC           = "src";// $NON-NLS-1$
+    protected static final String ATT_STYLE         = "style";// $NON-NLS-1$
     protected static final String ATT_TYPE          = "type";// $NON-NLS-1$
     protected static final String ATT_IS_IMAGE      = "image";// $NON-NLS-1$
     protected static final String TAG_APPLET        = "applet";// $NON-NLS-1$

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java?view=diff&rev=514130&r1=514129&r2=514130
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParserHTMLParser.java
 Sat Mar  3 03:27:49 2007
@@ -1,187 +1,195 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * 
- */
-
-package org.apache.jmeter.protocol.http.parser;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Iterator;
-
-import org.apache.jorphan.logging.LoggingManager;
-import org.apache.log.Logger;
-
-import org.htmlparser.Node;
-import org.htmlparser.Parser;
-import org.htmlparser.Tag;
-import org.htmlparser.tags.AppletTag;
-import org.htmlparser.tags.BaseHrefTag;
-import org.htmlparser.tags.BodyTag;
-import org.htmlparser.tags.CompositeTag;
-import org.htmlparser.tags.FrameTag;
-import org.htmlparser.tags.ImageTag;
-import org.htmlparser.tags.InputTag;
-import org.htmlparser.tags.LinkTag;
-import org.htmlparser.tags.ScriptTag;
-import org.htmlparser.util.NodeIterator;
-import org.htmlparser.util.ParserException;
-
-/**
- * HtmlParser implementation using SourceForge's HtmlParser.
- * 
- */
-public class HtmlParserHTMLParser extends HTMLParser {
-    private static final Logger log = LoggingManager.getLoggerForClass();
-
-    static{
-       org.htmlparser.scanners.ScriptScanner.STRICT = false; // Try to ensure 
that more javascript code is processed OK ...
-    }
-       protected HtmlParserHTMLParser() {
-               super();
-        log.info("Using htmlparser version 2.0");
-       }
-
-       protected boolean isReusable() {
-               return true;
-       }
-
-       /*
-        * (non-Javadoc)
-        * 
-        * @see 
org.apache.jmeter.protocol.http.parser.HtmlParser#getEmbeddedResourceURLs(byte[],
-        *      java.net.URL)
-        */
-       public Iterator getEmbeddedResourceURLs(byte[] html, URL baseUrl, 
URLCollection urls) throws HTMLParseException {
-        
-        if (log.isDebugEnabled()) log.debug("Parsing html of: " + baseUrl);
-        
-        Parser htmlParser = null;
-               try {
-                       String contents = new String(html);
-                       htmlParser = new Parser();
-            htmlParser.setInputHTML(contents);
-               } catch (Exception e) {
-                       throw new HTMLParseException(e);
-               }
-
-               // Now parse the DOM tree
-               try {
-                       // we start to iterate through the elements
-                       parseNodes(htmlParser.elements(), new 
URLPointer(baseUrl), urls);
-                       log.debug("End   : parseNodes");
-               } catch (ParserException e) {
-                       throw new HTMLParseException(e);
-               }
-
-               return urls.iterator();
-       }
-       
-    /*
-        * A dummy class to pass the pointer of URL.
-        */
-    private static class URLPointer {
-       private URLPointer(URL newUrl) {
-               url = newUrl;
-       }
-       private URL url;
-    }
-    
-    /**
-     * Recursively parse all nodes to pick up all URL s.
-     * @see e the nodes to be parsed
-     * @see baseUrl Base URL from which the HTML code was obtained
-     * @see urls URLCollection
-     */
-    private void parseNodes(final NodeIterator e,
-               final URLPointer baseUrl, final URLCollection urls) 
-        throws HTMLParseException, ParserException {
-        while(e.hasMoreNodes()) {
-            Node node = e.nextNode();
-            // a url is always in a Tag.
-            if (!(node instanceof Tag)) {
-                continue;
-            }
-            Tag tag = (Tag) node;
-            String tagname=tag.getTagName();
-            String binUrlStr = null;
-
-            // first we check to see if body tag has a
-            // background set
-            if (tag instanceof BodyTag) {
-                binUrlStr = tag.getAttribute(ATT_BACKGROUND);
-            } else if (tag instanceof BaseHrefTag) {
-                BaseHrefTag baseHref = (BaseHrefTag) tag;
-                String baseref = baseHref.getBaseUrl().toString();
-                try {
-                    if (!baseref.equals(""))// Bugzilla 30713
-                    {
-                        baseUrl.url = new URL(baseUrl.url, 
baseHref.getBaseUrl());
-                    }
-                } catch (MalformedURLException e1) {
-                    throw new HTMLParseException(e1);
-                }
-            } else if (tag instanceof ImageTag) {
-                ImageTag image = (ImageTag) tag;
-                binUrlStr = image.getImageURL();
-            } else if (tag instanceof AppletTag) {
-                       // look for applets
-
-                       // This will only work with an Applet .class file.
-                       // Ideally, this should be upgraded to work with 
Objects (IE)
-                       // and archives (.jar and .zip) files as well.
-                AppletTag applet = (AppletTag) tag;
-                binUrlStr = applet.getAppletClass();
-            } else if (tag instanceof InputTag) {
-                // we check the input tag type for image
-                if (ATT_IS_IMAGE.equalsIgnoreCase(tag.getAttribute(ATT_TYPE))) 
{
-                    // then we need to download the binary
-                    binUrlStr = tag.getAttribute(ATT_SRC);
-                }
-            } else if (tag instanceof LinkTag) {
-                LinkTag link = (LinkTag) tag;
-                if (link.getChild(0) instanceof ImageTag) {
-                    ImageTag img = (ImageTag) link.getChild(0);
-                    binUrlStr = img.getImageURL();
-                }
-            } else if (tag instanceof ScriptTag) {
-                binUrlStr = tag.getAttribute(ATT_SRC);
-            } else if (tag instanceof FrameTag) {
-                binUrlStr = tag.getAttribute(ATT_SRC);
-            } else if (tagname.equalsIgnoreCase(TAG_EMBED)
-                || tagname.equalsIgnoreCase(TAG_BGSOUND)){
-                binUrlStr = tag.getAttribute(ATT_SRC);  
-            } else if (tagname.equalsIgnoreCase(TAG_LINK)) {
-                // Putting the string first means it works even if the 
attribute is null
-                if (STYLESHEET.equalsIgnoreCase(tag.getAttribute(ATT_REL))) {
-                    binUrlStr = tag.getAttribute(ATT_HREF);
-                }
-            } else {
-                binUrlStr = tag.getAttribute(ATT_BACKGROUND);
-            }
-
-            if (binUrlStr != null) {
-                urls.addURL(binUrlStr, baseUrl.url);
-            }
-            // second, if the tag was a composite tag,
-            // recursively parse its children.
-            if (tag instanceof CompositeTag) {
-                CompositeTag composite = (CompositeTag) tag;
-                parseNodes(composite.elements(), baseUrl, urls);
-            }
-        }
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.protocol.http.parser;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Iterator;
+
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+import org.htmlparser.Node;
+import org.htmlparser.Parser;
+import org.htmlparser.Tag;
+import org.htmlparser.tags.AppletTag;
+import org.htmlparser.tags.BaseHrefTag;
+import org.htmlparser.tags.BodyTag;
+import org.htmlparser.tags.CompositeTag;
+import org.htmlparser.tags.FrameTag;
+import org.htmlparser.tags.ImageTag;
+import org.htmlparser.tags.InputTag;
+import org.htmlparser.tags.LinkTag;
+import org.htmlparser.tags.ScriptTag;
+import org.htmlparser.util.NodeIterator;
+import org.htmlparser.util.ParserException;
+
+/**
+ * HtmlParser implementation using SourceForge's HtmlParser.
+ * 
+ */
+class HtmlParserHTMLParser extends HTMLParser {
+    private static final Logger log = LoggingManager.getLoggerForClass();
+
+    static{
+       org.htmlparser.scanners.ScriptScanner.STRICT = false; // Try to ensure 
that more javascript code is processed OK ...
+    }
+       
+    protected HtmlParserHTMLParser() {
+               super();
+        log.info("Using htmlparser version: "+Parser.getVersion());
+       }
+
+       protected boolean isReusable() {
+               return true;
+       }
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see 
org.apache.jmeter.protocol.http.parser.HtmlParser#getEmbeddedResourceURLs(byte[],
+        *      java.net.URL)
+        */
+       public Iterator getEmbeddedResourceURLs(byte[] html, URL baseUrl, 
URLCollection urls) throws HTMLParseException {
+        
+        if (log.isDebugEnabled()) log.debug("Parsing html of: " + baseUrl);
+        
+        Parser htmlParser = null;
+               try {
+                       String contents = new String(html);
+                       htmlParser = new Parser();
+            htmlParser.setInputHTML(contents);
+               } catch (Exception e) {
+                       throw new HTMLParseException(e);
+               }
+
+               // Now parse the DOM tree
+               try {
+                       // we start to iterate through the elements
+                       parseNodes(htmlParser.elements(), new 
URLPointer(baseUrl), urls);
+                       log.debug("End   : parseNodes");
+               } catch (ParserException e) {
+                       throw new HTMLParseException(e);
+               }
+
+               return urls.iterator();
+       }
+       
+    /*
+        * A dummy class to pass the pointer of URL.
+        */
+    private static class URLPointer {
+       private URLPointer(URL newUrl) {
+               url = newUrl;
+       }
+       private URL url;
+    }
+    
+    /**
+     * Recursively parse all nodes to pick up all URL s.
+     * @see e the nodes to be parsed
+     * @see baseUrl Base URL from which the HTML code was obtained
+     * @see urls URLCollection
+     */
+    private void parseNodes(final NodeIterator e,
+               final URLPointer baseUrl, final URLCollection urls) 
+        throws HTMLParseException, ParserException {
+        while(e.hasMoreNodes()) {
+            Node node = e.nextNode();
+            // a url is always in a Tag.
+            if (!(node instanceof Tag)) {
+                continue;
+            }
+            Tag tag = (Tag) node;
+            String tagname=tag.getTagName();
+            String binUrlStr = null;
+
+            // first we check to see if body tag has a
+            // background set
+            if (tag instanceof BodyTag) {
+                binUrlStr = tag.getAttribute(ATT_BACKGROUND);
+            } else if (tag instanceof BaseHrefTag) {
+                BaseHrefTag baseHref = (BaseHrefTag) tag;
+                String baseref = baseHref.getBaseUrl().toString();
+                try {
+                    if (!baseref.equals(""))// Bugzilla 30713
+                    {
+                        baseUrl.url = new URL(baseUrl.url, 
baseHref.getBaseUrl());
+                    }
+                } catch (MalformedURLException e1) {
+                    throw new HTMLParseException(e1);
+                }
+            } else if (tag instanceof ImageTag) {
+                ImageTag image = (ImageTag) tag;
+                binUrlStr = image.getImageURL();
+            } else if (tag instanceof AppletTag) {
+                       // look for applets
+
+                       // This will only work with an Applet .class file.
+                       // Ideally, this should be upgraded to work with 
Objects (IE)
+                       // and archives (.jar and .zip) files as well.
+                AppletTag applet = (AppletTag) tag;
+                binUrlStr = applet.getAppletClass();
+            } else if (tag instanceof InputTag) {
+                // we check the input tag type for image
+                if (ATT_IS_IMAGE.equalsIgnoreCase(tag.getAttribute(ATT_TYPE))) 
{
+                    // then we need to download the binary
+                    binUrlStr = tag.getAttribute(ATT_SRC);
+                }
+            } else if (tag instanceof LinkTag) {
+                LinkTag link = (LinkTag) tag;
+                if (link.getChild(0) instanceof ImageTag) {
+                    ImageTag img = (ImageTag) link.getChild(0);
+                    binUrlStr = img.getImageURL();
+                }
+            } else if (tag instanceof ScriptTag) {
+                binUrlStr = tag.getAttribute(ATT_SRC);
+            } else if (tag instanceof FrameTag) {
+                binUrlStr = tag.getAttribute(ATT_SRC);
+            } else if (tagname.equalsIgnoreCase(TAG_EMBED)
+                || tagname.equalsIgnoreCase(TAG_BGSOUND)){
+                binUrlStr = tag.getAttribute(ATT_SRC);  
+            } else if (tagname.equalsIgnoreCase(TAG_LINK)) {
+                // Putting the string first means it works even if the 
attribute is null
+                if (STYLESHEET.equalsIgnoreCase(tag.getAttribute(ATT_REL))) {
+                    binUrlStr = tag.getAttribute(ATT_HREF);
+                }
+            } else {
+                binUrlStr = tag.getAttribute(ATT_BACKGROUND);
+            }
+
+            if (binUrlStr != null) {
+                urls.addURL(binUrlStr, baseUrl.url);
+            }
+
+            // Now look for URLs in the STYLE attribute
+            String styleTagStr = tag.getAttribute(ATT_STYLE);
+            if(styleTagStr != null) {
+               HtmlParsingUtils.extractStyleURLs(baseUrl.url, urls, 
styleTagStr);
+            }
+
+            // second, if the tag was a composite tag,
+            // recursively parse its children.
+            if (tag instanceof CompositeTag) {
+                CompositeTag composite = (CompositeTag) tag;
+                parseNodes(composite.elements(), baseUrl, urls);
+            }
+        }
+    }
+
+}

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java?view=diff&rev=514130&r1=514129&r2=514130
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/HtmlParsingUtils.java
 Sat Mar  3 03:27:49 2007
@@ -30,9 +30,12 @@
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase;
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory;
 import org.apache.jmeter.testelement.property.PropertyIterator;
+import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
-import org.apache.oro.text.PatternCacheLRU;
+import org.apache.oro.text.regex.MatchResult;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.PatternMatcherInput;
 import org.apache.oro.text.regex.Perl5Compiler;
 import org.apache.oro.text.regex.Perl5Matcher;
 import org.w3c.dom.Document;
@@ -54,14 +57,6 @@
         * Perl5Compiler.MULTILINE_MASK | Perl5Compiler.READ_ONLY_MASK;
         */
 
-       private static PatternCacheLRU patternCache = new PatternCacheLRU(1000, 
new Perl5Compiler());
-
-       private static ThreadLocal localMatcher = new ThreadLocal() {
-               protected Object initialValue() {
-                       return new Perl5Matcher();
-               }
-       };
-
        /**
         * Private constructor to prevent instantiation.
         */
@@ -71,7 +66,7 @@
        public static synchronized boolean isAnchorMatched(HTTPSamplerBase 
newLink, HTTPSamplerBase config)
        {
                boolean ok = true;
-               Perl5Matcher matcher = (Perl5Matcher) localMatcher.get();
+               Perl5Matcher matcher = JMeterUtils.getMatcher();
                PropertyIterator iter = config.getArguments().iterator();
 
                String query = null;
@@ -91,7 +86,7 @@
                        Argument item = (Argument) iter.next().getObjectValue();
                        if (query.indexOf(item.getName() + "=") == -1) {
                                if (!(ok = ok
-                                               && matcher.contains(query, 
patternCache
+                                               && matcher.contains(query, 
JMeterUtils.getPatternCache()
                                                                
.getPattern(item.getName(), Perl5Compiler.READ_ONLY_MASK)))) {
                                        return false;
                                }
@@ -101,20 +96,20 @@
                if (config.getDomain() != null && config.getDomain().length() > 0
                                && 
!newLink.getDomain().equals(config.getDomain())) {
                        if (!(ok = ok
-                                       && matcher.matches(newLink.getDomain(), 
patternCache.getPattern(config.getDomain(),
+                                       && matcher.matches(newLink.getDomain(), 
JMeterUtils.getPatternCache().getPattern(config.getDomain(),
                                                        
Perl5Compiler.READ_ONLY_MASK)))) {
                                return false;
                        }
                }
 
                if (!newLink.getPath().equals(config.getPath())
-                               && !matcher.matches(newLink.getPath(), 
patternCache.getPattern("[/]*" + config.getPath(),
+                               && !matcher.matches(newLink.getPath(), 
JMeterUtils.getPatternCache().getPattern("[/]*" + config.getPath(),
                                                Perl5Compiler.READ_ONLY_MASK))) 
{
                        return false;
                }
 
                if (!(ok = ok
-                               && matcher.matches(newLink.getProtocol(), 
patternCache.getPattern(config.getProtocol(),
+                               && matcher.matches(newLink.getProtocol(), 
JMeterUtils.getPatternCache().getPattern(config.getProtocol(),
                                                
Perl5Compiler.READ_ONLY_MASK)))) {
                        return false;
                }
@@ -123,10 +118,10 @@
        }
 
        public static synchronized boolean isArgumentMatched(Argument arg, 
Argument patternArg) {
-               Perl5Matcher matcher = (Perl5Matcher) localMatcher.get();
-               return (arg.getName().equals(patternArg.getName()) || 
matcher.matches(arg.getName(), patternCache.getPattern(
+               Perl5Matcher matcher = JMeterUtils.getMatcher();
+               return (arg.getName().equals(patternArg.getName()) || 
matcher.matches(arg.getName(), JMeterUtils.getPatternCache().getPattern(
                                patternArg.getName(), 
Perl5Compiler.READ_ONLY_MASK)))
-                               && 
(arg.getValue().equals(patternArg.getValue()) || 
matcher.matches(arg.getValue(), patternCache
+                               && 
(arg.getValue().equals(patternArg.getValue()) || 
matcher.matches(arg.getValue(), JMeterUtils.getPatternCache()
                                                
.getPattern(patternArg.getValue(), Perl5Compiler.READ_ONLY_MASK)));
        }
 
@@ -311,5 +306,20 @@
                String action = atts.getNamedItem("action").getNodeValue();
                HTTPSamplerBase url = createUrlFromAnchor(action, context);
                return url;
+       }
+       
+       public static void extractStyleURLs(final URL baseUrl, final 
URLCollection urls, String styleTagStr) {
+               Perl5Matcher matcher = JMeterUtils.getMatcher();
+               Pattern pattern = JMeterUtils.getPatternCache().getPattern(
+                               "URL\\(\\s*('|\")(.*)('|\")\\s*\\)",
+                               Perl5Compiler.CASE_INSENSITIVE_MASK | 
Perl5Compiler.SINGLELINE_MASK | Perl5Compiler.READ_ONLY_MASK);
+               PatternMatcherInput input = null;
+               input = new PatternMatcherInput(styleTagStr);
+               while (matcher.contains(input, pattern)) {
+                   MatchResult match = matcher.getMatch();
+                   // The value is in the second group
+                   String styleUrl = match.group(2);
+                   urls.addURL(styleUrl, baseUrl);
+               }
        }
 }

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java?view=diff&rev=514130&r1=514129&r2=514130
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java
 Sat Mar  3 03:27:49 2007
@@ -147,6 +147,11 @@
                                break;
                        }
 
+                       String style = getValue(attrs, ATT_STYLE);
+                       if (style != null) {
+               HtmlParsingUtils.extractStyleURLs(baseUrl, urls, style);
+                       }
+
                        NodeList children = node.getChildNodes();
                        if (children != null) {
                                int len = children.getLength();
@@ -154,6 +159,7 @@
                                        baseUrl = scanNodes(children.item(i), 
urls, baseUrl);
                                }
                        }
+
                        break;
 
                // case Node.TEXT_NODE:

Modified: 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java?view=diff&rev=514130&r1=514129&r2=514130
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-2/src/protocol/http/org/apache/jmeter/protocol/http/parser/RegexpHTMLParser.java
 Sat Mar  3 03:27:49 2007
@@ -22,6 +22,7 @@
 import java.net.URL;
 import java.util.Iterator;
 
+import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
 
@@ -72,9 +73,9 @@
  * </ul>
  * 
  * @author <a href="mailto:[EMAIL PROTECTED]">Jordi Salvat i Alabart</a>
- * @version $Revision$ updated on $Date$
  */
 class RegexpHTMLParser extends HTMLParser {
+    private static final Logger log = LoggingManager.getLoggerForClass();
 
        /**
         * Regexp fragment matching a tag attribute's value (including the 
equals
@@ -96,11 +97,17 @@
         * Regular expression used against the HTML code to find the URIs of 
images,
         * etc.:
         */
-       private static final String REGEXP = "<(?:" + "!--.*?-->" + "|BASE" + 
SEP + "HREF" + VALUE
-                       + "|(?:IMG|SCRIPT|FRAME|IFRAME|BGSOUND|FRAME)" + SEP + 
"SRC" + VALUE + "|APPLET" + SEP + "CODE(?:BASE)?"
-                       + VALUE + "|(?:EMBED|OBJECT)" + SEP + 
"(?:SRC|CODEBASE)" + VALUE + "|(?:BODY|TABLE|TR|TD)" + SEP
-                       + "BACKGROUND" + VALUE + "|INPUT(?:" + SEP + "(?:SRC" + 
VALUE
-                       + 
"|TYPE\\s*=\\s*(?:\"image\"|'image'|image(?=[\\s>])))){2,}" + "|LINK(?:" + SEP 
+ "(?:HREF" + VALUE
+       private static final String REGEXP = 
+                     "<(?:" + "!--.*?-->"
+                   + "|BASE" + SEP + "HREF" + VALUE
+                       + "|(?:IMG|SCRIPT|FRAME|IFRAME|BGSOUND|FRAME)" + SEP + 
"SRC" + VALUE
+                       + "|APPLET" + SEP + "CODE(?:BASE)?"     + VALUE
+                       + "|(?:EMBED|OBJECT)" + SEP + "(?:SRC|CODEBASE)" + VALUE
+                       + "|(?:BODY|TABLE|TR|TD)" + SEP + "BACKGROUND" + VALUE
+                       + 
"|[^<]+?STYLE\\s*=['\"].*?URL\\(\\s*['\"](.+?)['\"]\\s*\\)"
+                       + "|INPUT(?:" + SEP + "(?:SRC" + VALUE
+                       + 
"|TYPE\\s*=\\s*(?:\"image\"|'image'|image(?=[\\s>])))){2,}"
+                       + "|LINK(?:" + SEP + "(?:HREF" + VALUE
                        + 
"|REL\\s*=\\s*(?:\"stylesheet\"|'stylesheet'|stylesheet(?=[\\s>])))){2,}" + ")";
 
        // Number of capturing groups possibly containing Base HREFs:
@@ -112,15 +119,6 @@
        static Pattern pattern;
 
        /**
-        * Thread-local matcher:
-        */
-       private static ThreadLocal localMatcher = new ThreadLocal() {
-               protected Object initialValue() {
-                       return new Perl5Matcher();
-               }
-       };
-
-       /**
         * Thread-local input:
         */
        private static ThreadLocal localInput = new ThreadLocal() {
@@ -129,9 +127,6 @@
                }
        };
 
-       /** Used to store the Logger (used for debug and error messages). */
-       transient private static Logger log;
-
        protected boolean isReusable() {
                return true;
        }
@@ -142,10 +137,6 @@
        protected RegexpHTMLParser() {
                super();
 
-               // Define this here to ensure it's ready to report any trouble
-               // with the regexp:
-               log = LoggingManager.getLoggerForClass();
-
                // Compile the regular expression:
                try {
                        Perl5Compiler c = new Perl5Compiler();
@@ -166,7 +157,7 @@
         */
        public Iterator getEmbeddedResourceURLs(byte[] html, URL baseUrl, 
URLCollection urls) {
 
-               Perl5Matcher matcher = (Perl5Matcher) localMatcher.get();
+               Perl5Matcher matcher = JMeterUtils.getMatcher();
                PatternMatcherInput input = (PatternMatcherInput) 
localInput.get();
                // TODO: find a way to avoid the cost of creating a String here 
--
                // probably a new PatternMatcherInput working on a byte[] would 
do
@@ -176,7 +167,7 @@
                        MatchResult match = matcher.getMatch();
                        String s;
                        if (log.isDebugEnabled())
-                               log.debug("match groups " + match.groups());
+                               log.debug("match groups " + match.groups() + " 
" + match.toString());
                        // Check for a BASE HREF:
                        for (int g = 1; g <= NUM_BASE_GROUPS && g <= 
match.groups(); g++) {
                                s = match.group(g);
@@ -197,10 +188,10 @@
                        }
                        for (int g = NUM_BASE_GROUPS + 1; g <= match.groups(); 
g++) {
                                s = match.group(g);
-                               if (log.isDebugEnabled()) {
-                                       log.debug("group " + g + " - " + 
match.group(g));
-                               }
                                if (s != null) {
+                                       if (log.isDebugEnabled()) {
+                                               log.debug("group " + g + " - " 
+ match.group(g));
+                                       }
                                        urls.addURL(s, baseUrl);
                                }
                        }

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=514130&r1=514129&r2=514130
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Sat Mar  3 03:27:49 2007
@@ -111,6 +111,7 @@
 <li>Bug 40383 - don't set content-type if already set</li>
 <li>Mailer Visualiser test button now works if test plan has not yet been 
saved</li>
 <li>Bug 36959 - Shortcuts "ctrl c" and "ctrl v" don't work on the tree 
elements</li>
+<li>Bug 40696 - retrieve embedded resources from STYLE URL() attributes</li>
 </ul>
 
 <h3>Version 2.2</h3>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to