From: <rb...@us...> - 2013-12-31 14:18:19
|
Revision: 8923 http://sourceforge.net/p/htmlunit/code/8923 Author: rbri Date: 2013-12-31 14:18:16 +0000 (Tue, 31 Dec 2013) Log Message: ----------- String.contains() added for FF18 and later Modified Paths: -------------- trunk/htmlunit/src/changes/changes.xml trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StringCustom.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/NativeStringTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2013-12-31 09:07:37 UTC (rev 8922) +++ trunk/htmlunit/src/changes/changes.xml 2013-12-31 14:18:16 UTC (rev 8923) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="Bugfixes"> + <action type="add" dev="rbri"> + JavaScript: String.contains() added for FF18 and later. + </action> <action type="fix" dev="rbri"> Return value fixed for element.height and element.width when element is not attached to the page. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-12-31 09:07:37 UTC (rev 8922) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2013-12-31 14:18:16 UTC (rev 8923) @@ -1410,6 +1410,10 @@ @BrowserFeature(@WebBrowser(FF)) SET_READONLY_PROPERTIES, + /** Indicates that string.contains() is supported. */ + @BrowserFeature(@WebBrowser(value = FF, minVersion = 18)) + STRING_CONTAINS, + /** Indicates that string.trim() is supported. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME), @WebBrowser(value = IE, minVersion = 11) }) STRING_TRIM, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java 2013-12-31 09:07:37 UTC (rev 8922) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/JavaScriptEngine.java 2013-12-31 14:18:16 UTC (rev 8923) @@ -24,6 +24,7 @@ import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_FUNCTION_TOSOURCE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_HAS_OBJECT_WITH_PROTOTYPE_PROPERTY_IN_WINDOW_SCOPE; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.JS_XML; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.STRING_CONTAINS; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.STRING_TRIM; import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.STRING_TRIM_LEFT_RIGHT; @@ -296,6 +297,12 @@ stringPrototype.defineFunctionProperties(new String[] {"trimLeft", "trimRight"}, StringCustom.class, ScriptableObject.EMPTY); } + if (browserVersion.hasFeature(STRING_CONTAINS)) { + final ScriptableObject stringPrototype = + (ScriptableObject) ScriptableObject.getClassPrototype(window, "String"); + stringPrototype.defineFunctionProperties(new String[] {"contains"}, + StringCustom.class, ScriptableObject.EMPTY); + } if (!browserVersion.hasFeature(JS_FUNCTION_BIND)) { removePrototypeProperties(window, "Function", "bind"); Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StringCustom.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StringCustom.java 2013-12-31 09:07:37 UTC (rev 8922) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/StringCustom.java 2013-12-31 14:18:16 UTC (rev 8923) @@ -24,6 +24,7 @@ * * @version $Revision$ * @author Ahmed Ashour + * @author Ronald Brill */ public final class StringCustom { @@ -72,4 +73,29 @@ } return string.substring(0, end); } + + /** + * Determines whether one string may be found within another string, + * returning true or false as appropriate. + * @param context the JavaScript context + * @param thisObj the scriptable + * @param args the arguments passed into the method + * @param function the function + * @return true or false + */ + public static boolean contains( + final Context context, final Scriptable thisObj, final Object[] args, final Function function) { + if (args.length < 1) { + return false; + } + final String string = Context.toString(thisObj); + final String search = Context.toString(args[0]); + + if (args.length < 2) { + return string.contains(search); + } + + final int start = (int) Math.max(0, Context.toNumber(args[1])); + return string.indexOf(search, start) > -1; + } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/NativeStringTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/NativeStringTest.java 2013-12-31 09:07:37 UTC (rev 8922) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/NativeStringTest.java 2013-12-31 14:18:16 UTC (rev 8923) @@ -155,4 +155,43 @@ loadPageWithAlerts2(html); } + + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "contains not supported", + FF24 = { "true", "false", "true", "true", "true", "false", "true", "true", "true", "false", + "true", "true", "false", "false" }) + public void contains() throws Exception { + final String html + = "<!DOCTYPE html>\n" + + "<html><head><title>foo</title><script>\n" + + "function doTest() {\n" + + " if ('contains' in String.prototype) {" + + " var str = 'To be, or not to be, that is the question.';\n" + + " alert(str.contains('To be'));\n" + + " alert(str.contains('TO'));\n" + + " alert(str.contains(''));\n" + + " alert(str.contains(' '));\n" + + " alert(str.contains('To be', 0));\n" + + " alert(str.contains('TO', 0));\n" + + " alert(str.contains(' ', 0));\n" + + " alert(str.contains('', 0));\n" + + " alert(str.contains('or', 7));\n" + + " alert(str.contains('or', 8));\n" + + + " alert(str.contains('or', -3));\n" + + " alert(str.contains('or', 7.9));\n" + + " alert(str.contains('or', 8.1));\n" + + " alert(str.contains());\n" + + " } else {\n" + + " alert('contains not supported');\n" + + " }\n" + + "}\n" + + "</script></head><body onload='doTest()'>\n" + + "</body></html>"; + + loadPageWithAlerts2(html); + } } |