From: <asa...@us...> - 2014-01-31 05:28:14
|
Revision: 9093 http://sourceforge.net/p/htmlunit/code/9093 Author: asashour Date: 2014-01-31 05:28:09 +0000 (Fri, 31 Jan 2014) Log Message: ----------- HTMLObjectElement: classid could be affected by webClient.setActiveXObjectMap(). 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/host/html/HTMLObjectElement.java trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLObjectElementTest.java Modified: trunk/htmlunit/src/changes/changes.xml =================================================================== --- trunk/htmlunit/src/changes/changes.xml 2014-01-31 04:43:06 UTC (rev 9092) +++ trunk/htmlunit/src/changes/changes.xml 2014-01-31 05:28:09 UTC (rev 9093) @@ -8,6 +8,9 @@ <body> <release version="2.14" date="???" description="FF24, Bugfixes, initial work on IE11"> + <action type="fix" dev="asashour"> + HTMLObjectElement: classid could be affected by webClient.setActiveXObjectMap(). + </action> <action type="fix" dev="rbri" issue="1544"> Load iframe content when iframe is child of a node added by setting innerHTML. </action> Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-01-31 04:43:06 UTC (rev 9092) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/BrowserVersionFeatures.java 2014-01-31 05:28:09 UTC (rev 9093) @@ -412,10 +412,6 @@ /** Was originally .isIE(). */ @BrowserFeature(@WebBrowser(IE)) - GENERATED_86, - - /** Was originally .isIE(). */ - @BrowserFeature(@WebBrowser(IE)) GENERATED_88, /** Was originally .isIE(). */ @@ -642,6 +638,10 @@ @BrowserFeature(@WebBrowser(value = IE, maxVersion = 9)) HTML_COMMENT_ELEMENT, + /** Supports <object> classid attribute. */ + @BrowserFeature(@WebBrowser(IE)) + HTML_OBJECT_CLASSID, + /** Indicates that "host" HTTP header should be the first. */ @BrowserFeature({ @WebBrowser(FF), @WebBrowser(CHROME) }) HTTP_HEADER_HOST_FIRST, Modified: trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLObjectElement.java =================================================================== --- trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLObjectElement.java 2014-01-31 04:43:06 UTC (rev 9092) +++ trunk/htmlunit/src/main/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLObjectElement.java 2014-01-31 05:28:09 UTC (rev 9093) @@ -14,11 +14,15 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.html; -import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.GENERATED_86; +import static com.gargoylesoftware.htmlunit.BrowserVersionFeatures.HTML_OBJECT_CLASSID; import static com.gargoylesoftware.htmlunit.javascript.configuration.BrowserName.IE; + +import java.util.Map; + import net.sourceforge.htmlunit.corejs.javascript.Context; import net.sourceforge.htmlunit.corejs.javascript.Scriptable; +import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlObject; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxClass; import com.gargoylesoftware.htmlunit.javascript.configuration.JsxGetter; @@ -94,15 +98,41 @@ @JsxSetter(@WebBrowser(IE)) public void setClassid(final String classid) { getDomNodeOrDie().setAttribute("classid", classid); - if (classid.indexOf(':') != -1 && getBrowserVersion().hasFeature(GENERATED_86) - && getWindow().getWebWindow().getWebClient().getOptions().isActiveXNative() - && System.getProperty("os.name").contains("Windows")) { - try { - wrappedActiveX_ = new ActiveXObjectImpl(classid); - wrappedActiveX_.setParentScope(getParentScope()); + if (classid.indexOf(':') != -1 && getBrowserVersion().hasFeature(HTML_OBJECT_CLASSID)) { + final WebClient webClient = getWindow().getWebWindow().getWebClient(); + final Map<String, String> map = webClient.getActiveXObjectMap(); + if (map != null) { + final String xClassString = map.get(classid); + if (xClassString != null) { + try { + final Class<?> xClass = Class.forName(xClassString); + final Object object = xClass.newInstance(); + boolean contextCreated = false; + if (Context.getCurrentContext() == null) { + Context.enter(); + contextCreated = true; + } + wrappedActiveX_ = Context.toObject(object, getParentScope()); + if (contextCreated) { + Context.exit(); + } + } + catch (final Exception e) { + throw Context.reportRuntimeError("ActiveXObject Error: failed instantiating class " + + xClassString + " because " + e.getMessage() + "."); + } + return; + } } - catch (final Exception e) { - Context.throwAsScriptRuntimeEx(e); + if (webClient.getOptions().isActiveXNative() + && System.getProperty("os.name").contains("Windows")) { + try { + wrappedActiveX_ = new ActiveXObjectImpl(classid); + wrappedActiveX_.setParentScope(getParentScope()); + } + catch (final Exception e) { + Context.throwAsScriptRuntimeEx(e); + } } } } Modified: trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLObjectElementTest.java =================================================================== --- trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLObjectElementTest.java 2014-01-31 04:43:06 UTC (rev 9092) +++ trunk/htmlunit/src/test/java/com/gargoylesoftware/htmlunit/javascript/host/html/HTMLObjectElementTest.java 2014-01-31 05:28:09 UTC (rev 9093) @@ -14,18 +14,27 @@ */ package com.gargoylesoftware.htmlunit.javascript.host.html; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.junit.Test; import org.junit.runner.RunWith; import com.gargoylesoftware.htmlunit.BrowserRunner; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; +import com.gargoylesoftware.htmlunit.CollectingAlertHandler; +import com.gargoylesoftware.htmlunit.MockWebConnection; import com.gargoylesoftware.htmlunit.SimpleWebTestCase; +import com.gargoylesoftware.htmlunit.WebClient; /** * Unit tests for {@link HTMLObjectElement}. * * @version $Revision$ * @author Daniel Gredler + * @author Ahmed Ashour */ @RunWith(BrowserRunner.class) public class HTMLObjectElementTest extends SimpleWebTestCase { @@ -44,4 +53,37 @@ loadPageWithAlerts(html); } + /** + * @throws Exception if the test fails + */ + @Test + @Alerts(DEFAULT = "undefined", IE = "ActiveX is working!") + public void classid() throws Exception { + final String clsid = "clsid:TESTING-CLASS-ID"; + final String html = "<html><head>\n" + + "<object id='id1' classid='" + clsid + "'></object>\n" + + "<script>\n" + + " function test() {\n" + + " alert(document.all.id1.MESSAGE);\n" + + " }\n" + + "</script>\n" + + "</head><body onload='test()'>\n" + + "</body></html>"; + + final WebClient client = getWebClient(); + final Map<String, String> activeXObjectMap = new HashMap<String, String>(); + activeXObjectMap.put(clsid, + "com.gargoylesoftware.htmlunit.javascript.MockActiveXObject"); + client.setActiveXObjectMap(activeXObjectMap); + + final List<String> collectedAlerts = new ArrayList<String>(); + client.setAlertHandler(new CollectingAlertHandler(collectedAlerts)); + + final MockWebConnection webConnection = new MockWebConnection(); + webConnection.setResponse(getDefaultUrl(), html); + client.setWebConnection(webConnection); + + client.getPage(getDefaultUrl()); + assertEquals(getExpectedAlerts(), collectedAlerts); + } } |