[INFRA-15006] Initial donation of HTML/Java NetBeans API. Equivalent to the content of html4j-donation-review.zip donated as part of ApacheNetBeansDonation1.zip with SHA256 being 7f2ca0f61953a190613c9a0fbcc1b034084b04a4d55d23c02cefffc354e7c24a. Equivalent to changeset 929563230c07 of the original http://hg.netbeans.org/html4j/ NetBeans Hg repository. Equivalent to commit d029b8e in the Emilian Bold Git conversion https://github.com/emilianbold/netbeans-html4j/ of the above Hg repository.
Project: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/commit/226089a5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/tree/226089a5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/diff/226089a5 Branch: refs/heads/master Commit: 226089a5a86d173bcc8acec247bd9def277e1459 Parents: Author: Jaroslav Tulach <[email protected]> Authored: Sun Sep 3 14:47:24 2017 +0200 Committer: Jaroslav Tulach <[email protected]> Committed: Sun Sep 3 14:47:24 2017 +0200 ---------------------------------------------------------------------- COPYING | 40 + boot-agent-test/pom.xml | 105 + .../html/bootagent/DynamicClassLoaderTest.java | 126 + .../html/bootagent/JavaScriptBodyTst.java | 63 + .../java/org/netbeans/html/bootagent/KOFx.java | 125 + .../org/netbeans/html/bootagent/empty.html | 55 + boot-fx/pom.xml | 115 + .../java/net/java/html/boot/fx/FXBrowsers.java | 293 +++ .../java/net/java/html/boot/fx/package.html | 51 + .../html/boot/fx/AbstractFXPresenter.java | 433 ++++ .../java/org/netbeans/html/boot/fx/Dbgr.java | 87 + .../java/org/netbeans/html/boot/fx/FXBrwsr.java | 427 ++++ .../org/netbeans/html/boot/fx/FXConsole.java | 84 + .../org/netbeans/html/boot/fx/FXInspect.java | 134 + .../org/netbeans/html/boot/fx/FXPresenter.java | 88 + .../org/netbeans/html/boot/fx/FXToolbar.java | 437 ++++ .../org/netbeans/html/boot/fx/WatchDir.java | 117 + .../org/netbeans/html/boot/fx/Bundle.properties | 54 + .../org/netbeans/html/boot/fx/desktop.png | Bin 0 -> 1093 bytes .../netbeans/html/boot/fx/handheldLandscape.png | Bin 0 -> 1100 bytes .../netbeans/html/boot/fx/handheldPortrait.png | Bin 0 -> 1111 bytes .../org/netbeans/html/boot/fx/netbook.png | Bin 0 -> 1101 bytes .../org/netbeans/html/boot/fx/selectionMode.png | Bin 0 -> 1078 bytes .../org/netbeans/html/boot/fx/sizeToFit.png | Bin 0 -> 1093 bytes .../netbeans/html/boot/fx/tabletLandscape.png | Bin 0 -> 1076 bytes .../netbeans/html/boot/fx/tabletPortrait.png | Bin 0 -> 1067 bytes .../org/netbeans/html/boot/fx/widescreen.png | Bin 0 -> 1114 bytes .../html/boot/fx/FXBrowsersOnResourceTest.java | 209 ++ .../net/java/html/boot/fx/FXBrowsersTest.java | 253 ++ .../org/netbeans/html/boot/fx/FXBrwsrTest.java | 84 + .../netbeans/html/boot/fx/FXJavaScriptTest.java | 124 + .../netbeans/html/boot/fx/FXPresenterTst.java | 103 + .../netbeans/html/boot/fx/FxJavaScriptTst.java | 55 + .../java/org/netbeans/html/boot/fx/KOFx.java | 125 + .../org/netbeans/html/boot/fx/ReloadTest.java | 157 ++ .../netbeans/html/boot/fx/TestingProvider.java | 65 + .../org/netbeans/html/boot/fx/TitleTest.java | 146 ++ .../test/java/org/sample/app/pkg/SampleApp.java | 62 + .../test/resources/net/java/html/boot/fx/wnd.js | 49 + .../org/netbeans/html/boot/fx/empty.html | 55 + boot-script/pom.xml | 152 ++ .../java/html/boot/script/ScriptPresenter.java | 443 ++++ .../java/net/java/html/boot/script/Scripts.java | 119 + .../java/net/java/html/boot/script/package.html | 51 + .../html/boot/script/Jsr223JavaScriptTest.java | 117 + .../html/boot/script/Jsr223JavaScriptTst.java | 55 + .../net/java/html/boot/script/SingleCase.java | 127 + .../java/html/boot/script/ko4j/DynamicHTTP.java | 261 ++ .../net/java/html/boot/script/ko4j/KOCase.java | 140 ++ .../boot/script/ko4j/KnockoutEnvJSTest.java | 266 ++ .../net/java/html/boot/script/ko4j/test.html | 56 + boot-truffle/empty.sigtest | 21 + boot-truffle/pom.xml | 209 ++ .../net/java/html/boot/truffle/IsArrayNode.java | 68 + .../net/java/html/boot/truffle/IsNullNode.java | 68 + .../net/java/html/boot/truffle/JavaArray.java | 102 + .../net/java/html/boot/truffle/JavaObject.java | 82 + .../net/java/html/boot/truffle/JavaValue.java | 91 + .../html/boot/truffle/TrufflePresenter.java | 293 +++ .../html/boot/truffle/TrufflePresenters.java | 66 + .../net/java/html/boot/truffle/package.html | 51 + .../html/boot/truffle/JsArrayTruffleTest.java | 140 ++ .../net/java/html/boot/truffle/SingleCase.java | 127 + .../boot/truffle/TruffleJavaScriptTest.java | 164 ++ boot/pom.xml | 106 + .../java/net/java/html/boot/BrowserBuilder.java | 519 ++++ .../main/java/net/java/html/boot/package.html | 54 + .../java/net/java/html/js/JavaScriptBody.java | 152 ++ .../net/java/html/js/JavaScriptResource.java | 70 + .../src/main/java/net/java/html/js/package.html | 483 ++++ .../netbeans/html/boot/impl/FindResources.java | 56 + .../org/netbeans/html/boot/impl/FnContext.java | 165 ++ .../org/netbeans/html/boot/impl/FnUtils.java | 717 ++++++ .../html/boot/impl/JavaScriptProcesor.java | 528 ++++ .../org/netbeans/html/boot/impl/JsAgent.java | 75 + .../org/netbeans/html/boot/impl/JsCallback.java | 160 ++ .../netbeans/html/boot/impl/JsClassLoader.java | 57 + .../org/netbeans/html/boot/impl/JsPkgCache.java | 132 + .../java/org/netbeans/html/boot/spi/Fn.java | 388 +++ .../org/netbeans/html/boot/spi/package.html | 54 + .../resources/net/java/html/boot/html4j.txt | 43 + .../net/java/html/boot/BrowserBuilderTest.java | 134 + .../org/netbeans/html/boot/impl/Arithm.java | 53 + .../org/netbeans/html/boot/impl/Compile.java | 307 +++ .../html/boot/impl/CountFnCreationTest.java | 123 + .../org/netbeans/html/boot/impl/FnTest.java | 186 ++ .../html/boot/impl/JavaScriptProcesorTest.java | 167 ++ .../netbeans/html/boot/impl/JsCallbackTest.java | 86 + .../html/boot/impl/JsClassLoaderBase.java | 285 +++ .../html/boot/impl/JsClassLoaderTest.java | 161 ++ .../org/netbeans/html/boot/impl/JsMethods.java | 157 ++ .../netbeans/html/boot/impl/KeepAliveTest.java | 113 + .../org/netbeans/html/boot/impl/Object.java | 49 + .../org/netbeans/html/boot/impl/empty.js | 42 + .../org/netbeans/html/boot/impl/jsmethods.js | 43 + context/pom.xml | 91 + .../src/main/java/net/java/html/BrwsrCtx.java | 192 ++ .../src/main/java/net/java/html/package.html | 49 + .../netbeans/html/context/impl/CtxAccssr.java | 71 + .../org/netbeans/html/context/impl/CtxImpl.java | 139 ++ .../org/netbeans/html/context/spi/Contexts.java | 244 ++ .../org/netbeans/html/context/spi/package.html | 50 + .../test/java/net/java/html/BrwsrCtxTest.java | 120 + .../netbeans/html/context/spi/ContextsTest.java | 115 + equinox-agentclass-hook/pom.xml | 86 + .../html/equinox/agentclass/AgentHook.java | 164 ++ .../equinox/agentclass/NbInstrumentation.java | 213 ++ .../main/resources/hookconfigurators.properties | 44 + geo/pom.xml | 94 + .../main/java/net/java/html/geo/OnLocation.java | 96 + .../main/java/net/java/html/geo/Position.java | 383 +++ .../net/java/html/geo/doc-files/GeoDuke.png | Bin 0 -> 242819 bytes .../main/java/net/java/html/geo/package.html | 74 + .../org/netbeans/html/geo/impl/Accessor.java | 76 + .../netbeans/html/geo/impl/GeoProcessor.java | 290 +++ .../netbeans/html/geo/impl/JsGLProvider.java | 154 ++ .../org/netbeans/html/geo/spi/CoordImpl.java | 87 + .../org/netbeans/html/geo/spi/GLProvider.java | 306 +++ .../java/org/netbeans/html/geo/spi/package.html | 59 + .../java/net/java/html/geo/OnLocationTest.java | 137 ++ .../org/netbeans/html/geo/impl/Compile.java | 286 +++ .../html/geo/impl/GeoProcessorTest.java | 114 + .../html/geo/impl/JsGLProviderTest.java | 76 + .../netbeans/html/geo/spi/CoordImplTest.java | 106 + html4j-maven-plugin/pom.xml | 119 + .../html/mojo/ProcessJsAnnotationsMojo.java | 223 ++ json-tck/pom.xml | 116 + .../java/net/java/html/js/tests/Bodies.java | 254 ++ .../java/net/java/html/js/tests/Factorial.java | 62 + .../java/net/java/html/js/tests/GCBodyTest.java | 178 ++ .../net/java/html/js/tests/Global2String.java | 52 + .../net/java/html/js/tests/GlobalString.java | 52 + .../java/html/js/tests/JavaScriptBodyTest.java | 548 +++++ .../main/java/net/java/html/js/tests/Later.java | 65 + .../java/net/java/html/js/tests/Receiver.java | 80 + .../main/java/net/java/html/js/tests/Sum.java | 81 + .../java/html/json/tests/ConvertTypesTest.java | 322 +++ .../java/html/json/tests/GCKnockoutTest.java | 139 ++ .../java/net/java/html/json/tests/JSONTest.java | 637 +++++ .../net/java/html/json/tests/KnockoutTest.java | 1001 ++++++++ .../net/java/html/json/tests/MinesTest.java | 356 +++ .../java/html/json/tests/OperationsTest.java | 96 + .../net/java/html/json/tests/PairModel.java | 80 + .../net/java/html/json/tests/PersonImpl.java | 100 + .../main/java/net/java/html/json/tests/Sex.java | 51 + .../java/net/java/html/json/tests/Utils.java | 225 ++ .../net/java/html/json/tests/WebSocketTest.java | 179 ++ .../netbeans/html/json/tck/JavaScriptTCK.java | 73 + .../java/org/netbeans/html/json/tck/KOTest.java | 60 + .../org/netbeans/html/json/tck/KnockoutTCK.java | 144 ++ .../resources/net/java/html/js/tests/global.js | 44 + .../resources/net/java/html/js/tests/global2.js | 44 + .../org/netbeans/html/json/tck/package.html | 56 + .../java/net/java/html/js/tests/BodiesTest.java | 83 + json/pom.xml | 115 + .../net/java/html/json/ComputedProperty.java | 105 + .../main/java/net/java/html/json/FakeModel.java | 122 + .../main/java/net/java/html/json/Function.java | 122 + .../src/main/java/net/java/html/json/Model.java | 356 +++ .../java/net/java/html/json/ModelOperation.java | 100 + .../main/java/net/java/html/json/Models.java | 191 ++ .../net/java/html/json/OnPropertyChange.java | 100 + .../main/java/net/java/html/json/OnReceive.java | 204 ++ .../main/java/net/java/html/json/Property.java | 98 + .../net/java/html/json/doc-files/DukeHTML.png | Bin 0 -> 70129 bytes .../net/java/html/json/doc-files/html4j.png | Bin 0 -> 558910 bytes .../java/html/json/doc-files/websockets.html | 185 ++ .../main/java/net/java/html/json/package.html | 118 + .../org/netbeans/html/json/impl/Bindings.java | 133 + .../java/org/netbeans/html/json/impl/JSON.java | 533 ++++ .../org/netbeans/html/json/impl/JSONList.java | 257 ++ .../netbeans/html/json/impl/ModelProcessor.java | 2286 ++++++++++++++++++ .../html/json/impl/PropertyBindingAccessor.java | 109 + .../org/netbeans/html/json/impl/RcvrJSON.java | 136 ++ .../org/netbeans/html/json/impl/Transitive.java | 60 + .../netbeans/html/json/spi/FunctionBinding.java | 162 ++ .../org/netbeans/html/json/spi/JSONCall.java | 152 ++ .../org/netbeans/html/json/spi/Observers.java | 233 ++ .../netbeans/html/json/spi/PropertyBinding.java | 236 ++ .../java/org/netbeans/html/json/spi/Proto.java | 953 ++++++++ .../org/netbeans/html/json/spi/Technology.java | 216 ++ .../org/netbeans/html/json/spi/Transfer.java | 96 + .../org/netbeans/html/json/spi/WSTransfer.java | 92 + .../org/netbeans/html/json/spi/package.html | 51 + .../netbeans/html/json/impl/Bundle.properties | 97 + .../org/netbeans/html/json/spi/package.html | 59 + .../java/net/java/html/json/AdressTest.java | 59 + .../test/java/net/java/html/json/BoardTest.java | 83 + .../net/java/html/json/BooleanArrayTest.java | 80 + .../test/java/net/java/html/json/Compile.java | 311 +++ .../java/net/java/html/json/KeywordsTest.java | 99 + .../java/html/json/MapModelNotMutableTest.java | 227 ++ .../java/net/java/html/json/MapModelTest.java | 521 ++++ .../net/java/html/json/ModelProcessorTest.java | 823 +++++++ .../test/java/net/java/html/json/ModelTest.java | 506 ++++ .../java/net/java/html/json/ModelsTest.java | 72 + .../java/net/java/html/json/OperationTest.java | 125 + .../java/net/java/html/json/PersonImpl.java | 135 ++ .../net/java/html/json/PrimitiveArrayTest.java | 80 + json/src/test/java/net/java/html/json/Sex.java | 51 + .../test/java/net/java/html/json/TypesTest.java | 145 ++ .../java/net/java/html/json/UnderscoreTest.java | 67 + .../net/java/html/json/WebSocketCallTest.java | 56 + .../net/java/html/json/sub/StreetCntrl.java | 53 + .../netbeans/html/json/impl/BuilderTest.java | 117 + .../html/json/impl/ConstructorTest.java | 80 + .../netbeans/html/json/impl/DeepChangeTest.java | 617 +++++ .../netbeans/html/json/impl/EmployeeImpl.java | 119 + .../netbeans/html/json/impl/EmployerTest.java | 65 + .../netbeans/html/json/impl/InfinityTest.java | 151 ++ .../netbeans/html/json/impl/JSONListTest.java | 236 ++ .../org/netbeans/html/json/impl/JSONTest.java | 84 + .../html/json/impl/NoPropertiesTest.java | 55 + .../netbeans/html/json/impl/OnReceiveTest.java | 180 ++ .../html/json/impl/ParallelChangeTest.java | 199 ++ .../org/netbeans/html/json/impl/ToDoTest.java | 132 + ko-felix-test/pom.xml | 184 ++ .../ko/felix/test/KnockoutFelixTCKImpl.java | 283 +++ .../html/ko/felix/test/DynamicHTTP.java | 261 ++ .../org/netbeans/html/ko/felix/test/KOFx.java | 132 + .../ko/felix/test/KnockoutFelixAriesIT.java | 258 ++ .../html/ko/felix/test/KnockoutFelixIT.java | 253 ++ .../org/netbeans/html/ko/felix/test/test.html | 56 + ko-osgi-test/pom.xml | 181 ++ .../ko/osgi/test/KnockoutEquinoxTCKImpl.java | 222 ++ .../netbeans/html/ko/osgi/test/DynamicHTTP.java | 261 ++ .../org/netbeans/html/ko/osgi/test/KOFx.java | 130 + .../html/ko/osgi/test/KnockoutEquinoxIT.java | 245 ++ .../org/netbeans/html/ko/osgi/test/test.html | 56 + ko-ws-tyrus/pom.xml | 194 ++ .../org/netbeans/html/wstyrus/LoadJSON.java | 301 +++ .../org/netbeans/html/wstyrus/TyrusContext.java | 209 ++ .../netbeans/html/wstyrus/TyrusDynamicHTTP.java | 262 ++ .../java/org/netbeans/html/wstyrus/TyrusFX.java | 125 + .../html/wstyrus/TyrusKnockoutTest.java | 219 ++ .../org/netbeans/html/wstyrus/test.html | 56 + ko4j/pom.xml | 179 ++ .../main/java/org/netbeans/html/ko4j/KO4J.java | 149 ++ .../java/org/netbeans/html/ko4j/KOSockets.java | 81 + .../java/org/netbeans/html/ko4j/KOTech.java | 176 ++ .../java/org/netbeans/html/ko4j/KOTransfer.java | 164 ++ .../java/org/netbeans/html/ko4j/Knockout.java | 277 +++ .../java/org/netbeans/html/ko4j/LoadJSON.java | 138 ++ .../java/org/netbeans/html/ko4j/LoadWS.java | 141 ++ .../org/netbeans/html/ko4j/DynamicHTTP.java | 261 ++ .../html/ko4j/InitializeKnockoutTest.java | 156 ++ .../test/java/org/netbeans/html/ko4j/KOFx.java | 132 + .../org/netbeans/html/ko4j/KnockoutFXTest.java | 235 ++ .../netbeans/html/ko4j/LessCallbacksCheck.java | 97 + .../html/ko4j/OffThreadInitializationTest.java | 166 ++ .../html/ko4j/ReferenceKnockoutTest.java | 63 + .../resources/org/netbeans/html/ko4j/test.html | 56 + pom.xml | 475 ++++ sound/pom.xml | 93 + .../java/net/java/html/sound/AudioClip.java | 200 ++ .../main/java/net/java/html/sound/package.html | 50 + .../html/sound/impl/BrowserAudioEnv.java | 85 + .../html/sound/spi/AudioEnvironment.java | 94 + .../org/netbeans/html/sound/spi/package.html | 49 + src/main/javadoc/overview.html | 623 +++++ xhr4j/pom.xml | 166 ++ .../java/org/netbeans/html/xhr4j/LoadJSON.java | 274 +++ .../html/xhr4j/XmlHttpResourceContext.java | 88 + .../netbeans/html/xhr4j/JsonDynamicHTTP.java | 262 ++ .../java/org/netbeans/html/xhr4j/JsonFX.java | 125 + .../netbeans/html/xhr4j/JsonKnockoutTest.java | 217 ++ .../resources/org/netbeans/html/xhr4j/test.html | 56 + 267 files changed, 45112 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/COPYING ---------------------------------------------------------------------- diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..83fe966 --- /dev/null +++ b/COPYING @@ -0,0 +1,40 @@ +DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + +Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + +Oracle and Java are registered trademarks of Oracle and/or its affiliates. +Other names may be trademarks of their respective owners. + +The contents of this file are subject to the terms of either the GNU +General Public License Version 2 only ("GPL") or the Common +Development and Distribution License("CDDL") (collectively, the +"License"). You may not use this file except in compliance with the +License. You can obtain a copy of the License at +http://www.netbeans.org/cddl-gplv2.html +or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the +specific language governing permissions and limitations under the +License. When distributing the software, include this License Header +Notice in each file and include the License file at +nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this +particular file as subject to the "Classpath" exception as provided +by Oracle in the GPL Version 2 section of the License file that +accompanied this code. If applicable, add the following below the +License Header, with the fields enclosed by brackets [] replaced by +your own identifying information: +"Portions Copyrighted [year] [name of copyright owner]" + +Contributor(s): + +The Original Software is NetBeans. The Initial Developer of the Original +Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + +If you wish your version of this file to be governed by only the CDDL +or only the GPL Version 2, indicate your decision by adding +"[Contributor] elects to include this software in this distribution +under the [CDDL or GPL Version 2] license." If you do not indicate a +single choice of license, a recipient has the option to distribute +your version of this file under either the CDDL, the GPL Version 2 or +to extend the choice of license to its licensees as provided above. +However, if you add GPL Version 2 code and therefore, elected the GPL +Version 2 license, then the option applies only if the new code is +made subject to such option by the copyright holder. http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-agent-test/pom.xml ---------------------------------------------------------------------- diff --git a/boot-agent-test/pom.xml b/boot-agent-test/pom.xml new file mode 100644 index 0000000..8159679 --- /dev/null +++ b/boot-agent-test/pom.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2013-2016 Oracle and/or its affiliates. All rights reserved. + + Oracle and Java are registered trademarks of Oracle and/or its affiliates. + Other names may be trademarks of their respective owners. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with the + License. You can obtain a copy of the License at + http://www.netbeans.org/cddl-gplv2.html + or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + specific language governing permissions and limitations under the + License. When distributing the software, include this License Header + Notice in each file and include the License file at + nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + particular file as subject to the "Classpath" exception as provided + by Oracle in the GPL Version 2 section of the License file that + accompanied this code. If applicable, add the following below the + License Header, with the fields enclosed by brackets [] replaced by + your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + The Original Software is NetBeans. The Initial Developer of the Original + Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + + If you wish your version of this file to be governed by only the CDDL + or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this distribution + under the [CDDL or GPL Version 2] license." If you do not indicate a + single choice of license, a recipient has the option to distribute + your version of this file under either the CDDL, the GPL Version 2 or + to extend the choice of license to its licensees as provided above. + However, if you add GPL Version 2 code and therefore, elected the GPL + Version 2 license, then the option applies only if the new code is + made subject to such option by the copyright holder. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.netbeans.html</groupId> + <artifactId>pom</artifactId> + <version>2.0-SNAPSHOT</version> + </parent> + <artifactId>boot-agent-test</artifactId> + <packaging>jar</packaging> + <name>Dynamic Boot Test</name> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-deploy-plugin</artifactId> + <configuration> + <skip>true</skip> + </configuration> + </plugin> + </plugins> + </build> + <dependencies> + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.netbeans.html</groupId> + <artifactId>net.java.html</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <type>jar</type> + </dependency> + <dependency> + <groupId>org.netbeans.html</groupId> + <artifactId>net.java.html.boot</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <type>jar</type> + </dependency> + <dependency> + <groupId>org.netbeans.api</groupId> + <artifactId>org-openide-util-lookup</artifactId> + <scope>test</scope> + <type>jar</type> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>net.java.html.boot.fx</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm</artifactId> + <scope>test</scope> + </dependency> + </dependencies> +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-agent-test/src/test/java/org/netbeans/html/bootagent/DynamicClassLoaderTest.java ---------------------------------------------------------------------- diff --git a/boot-agent-test/src/test/java/org/netbeans/html/bootagent/DynamicClassLoaderTest.java b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/DynamicClassLoaderTest.java new file mode 100644 index 0000000..610834d --- /dev/null +++ b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/DynamicClassLoaderTest.java @@ -0,0 +1,126 @@ +/** + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ +package org.netbeans.html.bootagent; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; +import net.java.html.BrwsrCtx; +import net.java.html.boot.BrowserBuilder; +import org.netbeans.html.boot.spi.Fn; +import org.testng.Assert; +import static org.testng.Assert.assertNotSame; +import static org.testng.Assert.assertSame; +import org.testng.annotations.Factory; + +/** + * + * @author Jaroslav Tulach + */ +public class DynamicClassLoaderTest { + private static Class<?> browserClass; + private static Fn.Presenter browserPresenter; + + public DynamicClassLoaderTest() { + } + + @Factory public static Object[] compatibilityTests() throws Exception { + final BrowserBuilder bb = BrowserBuilder.newBrowser().loadClass(DynamicClassLoaderTest.class). + loadPage("empty.html"). + invoke("initialized"); + + Executors.newSingleThreadExecutor().submit(new Runnable() { + @Override + public void run() { + bb.showAndWait(); + } + }); + + List<Object> res = new ArrayList<Object>(); + + Class[] arr = new Class[] { loadClass() }; + for (Class c : arr) { + for (Method m : c.getDeclaredMethods()) { + if ((m.getModifiers() & Modifier.PUBLIC) != 0) { + res.add(new KOFx(browserPresenter, m)); + } + } + } + return res.toArray(); + } + + static synchronized Class<?> loadClass() throws InterruptedException { + while (browserClass == null) { + DynamicClassLoaderTest.class.wait(); + } + return browserClass; + } + + public static void ready(Class<?> browserCls) throws Exception { + Class<?> origClazz = ClassLoader.getSystemClassLoader().loadClass(DynamicClassLoaderTest.class.getName()); + final Field f1 = origClazz.getDeclaredField("browserClass"); + f1.setAccessible(true); + f1.set(null, browserCls); + final Field f2 = origClazz.getDeclaredField("browserPresenter"); + f2.setAccessible(true); + f2.set(null, Fn.activePresenter()); + synchronized (origClazz) { + origClazz.notifyAll(); + } + } + + public static void initialized() throws Exception { + BrwsrCtx b1 = BrwsrCtx.findDefault(DynamicClassLoaderTest.class); + assertNotSame(b1, BrwsrCtx.EMPTY, "Browser context is not empty"); + BrwsrCtx b2 = BrwsrCtx.findDefault(DynamicClassLoaderTest.class); + assertSame(b1, b2, "Browser context remains stable"); + Assert.assertNotSame(DynamicClassLoaderTest.class.getClassLoader(), + ClassLoader.getSystemClassLoader(), + "Should use special classloader, not system one" + ); + DynamicClassLoaderTest.ready(JavaScriptBodyTst.class); + } +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-agent-test/src/test/java/org/netbeans/html/bootagent/JavaScriptBodyTst.java ---------------------------------------------------------------------- diff --git a/boot-agent-test/src/test/java/org/netbeans/html/bootagent/JavaScriptBodyTst.java b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/JavaScriptBodyTst.java new file mode 100644 index 0000000..33c2d22 --- /dev/null +++ b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/JavaScriptBodyTst.java @@ -0,0 +1,63 @@ +/** + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ +package org.netbeans.html.bootagent; + +import net.java.html.js.JavaScriptBody; + +/** + * + * @author Jaroslav Tulach + */ +public class JavaScriptBodyTst { + + public JavaScriptBodyTst() { + } + + public void assert42() { + int v = mul(7, 6); + assert v == 42 : "Really 42: " + v; + } + + @JavaScriptBody(args = { "x", "y" }, body = "return x * y;") + private static native int mul(int x, int y); +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java ---------------------------------------------------------------------- diff --git a/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java new file mode 100644 index 0000000..19f5c5a --- /dev/null +++ b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java @@ -0,0 +1,125 @@ +/** + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ +package org.netbeans.html.bootagent; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import javafx.application.Platform; +import org.netbeans.html.boot.impl.FnContext; +import org.netbeans.html.boot.spi.Fn; +import org.testng.IHookCallBack; +import org.testng.IHookable; +import org.testng.ITest; +import org.testng.ITestResult; +import org.testng.annotations.Test; + +/** + * + * @author Jaroslav Tulach + */ +public final class KOFx implements ITest, IHookable, Runnable { + private final Fn.Presenter p; + private final Method m; + private Object result; + private Object inst; + + KOFx(Fn.Presenter p, Method m) { + this.p = p; + this.m = m; + } + + @Override + public String getTestName() { + return m.getName(); + } + + @Test + public synchronized void executeTest() throws Exception { + if (result == null) { + Platform.runLater(this); + wait(); + } + if (result instanceof Exception) { + throw (Exception)result; + } + if (result instanceof Error) { + throw (Error)result; + } + } + + @Override + public synchronized void run() { + boolean notify = true; + try { + FnContext.currentPresenter(p); + if (inst == null) { + inst = m.getDeclaringClass().newInstance(); + } + result = m.invoke(inst); + if (result == null) { + result = this; + } + } catch (InvocationTargetException ex) { + Throwable r = ex.getTargetException(); + if (r instanceof InterruptedException) { + notify = false; + Platform.runLater(this); + return; + } + result = r; + } catch (Exception ex) { + result = ex; + } finally { + if (notify) { + notifyAll(); + } + FnContext.currentPresenter(null); + } + } + + @Override + public void run(IHookCallBack ihcb, ITestResult itr) { + ihcb.runTestMethod(itr); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-agent-test/src/test/resources/org/netbeans/html/bootagent/empty.html ---------------------------------------------------------------------- diff --git a/boot-agent-test/src/test/resources/org/netbeans/html/bootagent/empty.html b/boot-agent-test/src/test/resources/org/netbeans/html/bootagent/empty.html new file mode 100644 index 0000000..bf2114b --- /dev/null +++ b/boot-agent-test/src/test/resources/org/netbeans/html/bootagent/empty.html @@ -0,0 +1,55 @@ +<!-- + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + + Oracle and Java are registered trademarks of Oracle and/or its affiliates. + Other names may be trademarks of their respective owners. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with the + License. You can obtain a copy of the License at + http://www.netbeans.org/cddl-gplv2.html + or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + specific language governing permissions and limitations under the + License. When distributing the software, include this License Header + Notice in each file and include the License file at + nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + particular file as subject to the "Classpath" exception as provided + by Oracle in the GPL Version 2 section of the License file that + accompanied this code. If applicable, add the following below the + License Header, with the fields enclosed by brackets [] replaced by + your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + The Original Software is NetBeans. The Initial Developer of the Original + Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + + If you wish your version of this file to be governed by only the CDDL + or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this distribution + under the [CDDL or GPL Version 2] license." If you do not indicate a + single choice of license, a recipient has the option to distribute + your version of this file under either the CDDL, the GPL Version 2 or + to extend the choice of license to its licensees as provided above. + However, if you add GPL Version 2 code and therefore, elected the GPL + Version 2 license, then the option applies only if the new code is + made subject to such option by the copyright holder. + +--> +<!DOCTYPE html> +<html> + <head> + <title>Bootstrap Dynamically</title> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + </head> + <body> + <div>Bootstrap Dynamically</div> + </body> +</html> http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-fx/pom.xml ---------------------------------------------------------------------- diff --git a/boot-fx/pom.xml b/boot-fx/pom.xml new file mode 100644 index 0000000..26dd2ce --- /dev/null +++ b/boot-fx/pom.xml @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2013-2016 Oracle and/or its affiliates. All rights reserved. + + Oracle and Java are registered trademarks of Oracle and/or its affiliates. + Other names may be trademarks of their respective owners. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with the + License. You can obtain a copy of the License at + http://www.netbeans.org/cddl-gplv2.html + or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + specific language governing permissions and limitations under the + License. When distributing the software, include this License Header + Notice in each file and include the License file at + nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + particular file as subject to the "Classpath" exception as provided + by Oracle in the GPL Version 2 section of the License file that + accompanied this code. If applicable, add the following below the + License Header, with the fields enclosed by brackets [] replaced by + your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + The Original Software is NetBeans. The Initial Developer of the Original + Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + + If you wish your version of this file to be governed by only the CDDL + or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this distribution + under the [CDDL or GPL Version 2] license." If you do not indicate a + single choice of license, a recipient has the option to distribute + your version of this file under either the CDDL, the GPL Version 2 or + to extend the choice of license to its licensees as provided above. + However, if you add GPL Version 2 code and therefore, elected the GPL + Version 2 license, then the option applies only if the new code is + made subject to such option by the copyright holder. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.netbeans.html</groupId> + <artifactId>pom</artifactId> + <version>2.0-SNAPSHOT</version> + </parent> + <groupId>org.netbeans.html</groupId> + <artifactId>net.java.html.boot.fx</artifactId> + <version>2.0-SNAPSHOT</version> + <name>FX WebView Bootstrap</name> + <packaging>bundle</packaging> + <url>http://maven.apache.org</url> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <publicPackages>net.java.html.boot.fx</publicPackages> + </properties> + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <configuration> + <instructions> + <Require-Capability>osgi.extender;resolution:=optional;filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability> + <Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.netbeans.html.boot.spi.Fn$Presenter</Provide-Capability> + </instructions> + </configuration> + </plugin> + <plugin> + <groupId>org.netbeans.html</groupId> + <artifactId>html4j-maven-plugin</artifactId> + </plugin> + </plugins> + </build> + <dependencies> + <dependency> + <groupId>com.oracle</groupId> + <artifactId>javafx</artifactId> + <version>2.2</version> + <scope>system</scope> + <systemPath>${jfxrt.jar}</systemPath> + </dependency> + <dependency> + <groupId>org.netbeans.api</groupId> + <artifactId>org-openide-util-lookup</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.netbeans.html</groupId> + <artifactId>net.java.html.boot</artifactId> + <version>${project.version}</version> + <type>jar</type> + </dependency> + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + <scope>test</scope> + <type>jar</type> + </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>net.java.html.json.tck</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + </dependencies> + <description>A presentation provider to show JavaFX WebView +when a Java/HTML based application is about to boot.</description> +</project> http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-fx/src/main/java/net/java/html/boot/fx/FXBrowsers.java ---------------------------------------------------------------------- diff --git a/boot-fx/src/main/java/net/java/html/boot/fx/FXBrowsers.java b/boot-fx/src/main/java/net/java/html/boot/fx/FXBrowsers.java new file mode 100644 index 0000000..eca28e1 --- /dev/null +++ b/boot-fx/src/main/java/net/java/html/boot/fx/FXBrowsers.java @@ -0,0 +1,293 @@ +/** + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ +package net.java.html.boot.fx; + +import java.net.URL; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Worker; +import javafx.scene.web.WebView; +import net.java.html.BrwsrCtx; +import net.java.html.boot.BrowserBuilder; +import net.java.html.js.JavaScriptBody; +import org.netbeans.html.boot.fx.AbstractFXPresenter; +import org.netbeans.html.context.spi.Contexts; +import org.netbeans.html.context.spi.Contexts.Id; + +/** Utility methods to use {@link WebView} and {@link JavaScriptBody} code + * in existing <em>JavaFX</em> applications. + * This class is for those who want to instantiate their own {@link WebView}, + * configure it manually, embed it into own <em>JavaFX</em> + * application and based on other events in the application + * {@link #runInBrowser(javafx.scene.web.WebView, java.lang.Runnable) re-execute code} + * inside of such {@link WebView}s. + * <p> + * In case such detailed control is not necessary, + * consider using {@link BrowserBuilder}. Btw. when using the {@link BrowserBuilder} + * one can execute presenter in headless mode. Just specify: <code> + * {@link System}.{@link System#setProperty(java.lang.String, java.lang.String) setProperty}("fxpresenter.headless", "true"); + * </code> + * + * + * @author Jaroslav Tulach + * @since 0.6 + */ +public final class FXBrowsers { + private FXBrowsers() { + } + + /** Enables the Java/JavaScript bridge (that supports {@link JavaScriptBody} and co.) + * in the provided <code>webView</code>. This method returns + * immediately. Once the support is active, it calls back specified + * method in <code>onPageLoad</code> class - the class can possibly be + * loaded by a different classloader (to enable replacement of + * methods with {@link JavaScriptBody} annotations with executable + * versions). The method <code>methodName</code> needs to be <code>public</code> + * (in a public class), <code>static</code> and take either no parameters + * or an array of {@link String}s. + * <p> + * This method sets {@link WebView#getUserData()} and {@link #runInBrowser(javafx.scene.web.WebView, java.lang.Runnable)} + * relies on the value. Please don't alter it. + * <p> + * Since introduction of {@link Id technology identifiers} the + * provided <code>args</code> strings are also passed to the + * {@link BrwsrCtx context} when it is being + * {@link Contexts#newBuilder(java.lang.Object...) created} + * and can influence the selection + * of available technologies + * (like {@link org.netbeans.html.json.spi.Technology}, + * {@link org.netbeans.html.json.spi.Transfer} or + * {@link org.netbeans.html.json.spi.WSTransfer}). + * + * @param webView the instance of Web View to tweak + * @param url the URL of the HTML page to load into the view + * @param onPageLoad callback class with method <code>methodName</code> + * @param methodName the method to call when the page is loaded + * @param args arguments to pass to the <code>methodName</code> method + */ + public static void load( + final WebView webView, final URL url, + Class<?> onPageLoad, String methodName, + String... args + ) { + Object[] context = new Object[args.length + 1]; + System.arraycopy(args, 0, context, 1, args.length); + final Load load = new Load(webView, null); + context[0] = load; + BrowserBuilder.newBrowser(context). + loadPage(url.toExternalForm()). + loadFinished(load). + loadClass(onPageLoad). + invoke(methodName, args). + showAndWait(); + } + + /** Enables the Java/JavaScript bridge (that supports {@link JavaScriptBody} and co.) + * in the provided <code>webView</code>. This method returns + * immediately. Once the support is active, it calls back specified + * method in <code>onPageLoad</code>'s run method. + * This is more convenient way to initialize the webview, + * but it requires one to make sure + * all {@link JavaScriptBody} methods has been post-processed during + * compilation and there will be no need to instantiate new classloader. + * <p> + * This method sets {@link WebView#getUserData()} and {@link #runInBrowser(javafx.scene.web.WebView, java.lang.Runnable)} + * relies on the value. Please don't alter it. + * + * @param webView the instance of Web View to tweak + * @param url the URL of the HTML page to load into the view + * @param onPageLoad callback to call when the page is ready + * @since 0.8.1 + */ + public static void load( + WebView webView, final URL url, Runnable onPageLoad + ) { + load(webView, url, onPageLoad, null); + } + + /** Enables the Java/JavaScript bridge (that supports {@link JavaScriptBody} and co.) + * in the provided <code>webView</code>. This method returns + * immediately. Once the support is active, it calls back {@link Runnable#run() run} + * method in <code>onPageLoad</code>. + * This is more convenient way to initialize the webview, + * but it requires one to make sure + * all {@link JavaScriptBody} methods has been post-processed during + * compilation and there will be no need to instantiate new classloader. + * <p> + * This method sets {@link WebView#getUserData()} and {@link #runInBrowser(javafx.scene.web.WebView, java.lang.Runnable)} + * relies on the value. Please don't alter it. + * + * @param webView the instance of Web View to tweak + * @param url the URL of the HTML page to load into the view + * @param onPageLoad callback to call when the page is ready + * @param loader the loader to use when constructing initial {@link BrwsrCtx} or <code>null</code> + * @since 0.9 + */ + public static void load( + WebView webView, final URL url, Runnable onPageLoad, ClassLoader loader + ) { + load(webView, url, onPageLoad, loader, new Object[0]); + } + + /** Enables the Java/JavaScript bridge (that supports {@link JavaScriptBody} and co.) + * in the provided <code>webView</code>. This method returns + * immediately. Once the support is active, it calls back {@link Runnable#run() run} + * method in <code>onPageLoad</code>. + * This is more convenient way to initialize the webview, + * but it requires one to make sure + * all {@link JavaScriptBody} methods has been post-processed during + * compilation and there will be no need to instantiate new classloader. + * <p> + * This method sets {@link WebView#getUserData()} and {@link #runInBrowser(javafx.scene.web.WebView, java.lang.Runnable)} + * relies on the value. Please don't alter it. + * + * @param webView the instance of Web View to tweak + * @param url the URL of the HTML page to load into the view + * @param onPageLoad callback to call when the page is ready + * @param loader the loader to use when constructing initial {@link BrwsrCtx} or <code>null</code> + * @param context additonal configuration to pass to {@link BrowserBuilder#newBrowser(java.lang.Object...)} + * and {@link Contexts#newBuilder(java.lang.Object...)} factory methods + * @since 1.1 + */ + public static void load( + WebView webView, final URL url, Runnable onPageLoad, ClassLoader loader, + Object... context + ) { + Object[] newCtx = new Object[context.length + 1]; + System.arraycopy(context, 0, newCtx, 1, context.length); + final Load load = new Load(webView, onPageLoad); + newCtx[0] = load; + BrowserBuilder.newBrowser(newCtx). + loadPage(url.toExternalForm()). + loadFinished(load). + classloader(loader). + showAndWait(); + } + + /** Executes a code inside of provided {@link WebView}. This method + * associates the {@link BrwsrCtx execution context} with provided browser, + * so the {@link JavaScriptBody} annotations know where to execute + * their JavaScript bodies. + * The code is going to be executed synchronously + * in case {@link Platform#isFxApplicationThread()} returns <code>true</code>. + * Otherwise this method returns immediately and the code is executed + * later via {@link Platform#runLater(java.lang.Runnable)}. + * <p> + * This method relies on {@link WebView#getUserData()} being properly + * provided by the <code>load</code> methods in this class. + * + * @param webView the web view previously prepared by one of the <code>load</code> + * methods in this class + * @param code the code to execute + * @throws IllegalArgumentException if the web view was not properly + * initialized + * @see BrwsrCtx#execute(java.lang.Runnable) + * @since 0.8.1 + */ + public static void runInBrowser(WebView webView, Runnable code) { + Object ud = webView.getUserData(); + if (!(ud instanceof Load)) { + throw new IllegalArgumentException(); + } + ((Load)ud).ctx.execute(code); + } + + private static class Load extends AbstractFXPresenter implements Runnable { + private final WebView webView; + private final Runnable myLoad; + private BrwsrCtx ctx; + + public Load(WebView webView, Runnable onLoad) { + this.webView = webView; + this.myLoad = onLoad; + webView.setUserData(this); + } + + public void run() { + ctx = BrwsrCtx.findDefault(Load.class); + if (myLoad != null) { + myLoad.run(); + } + } + + @Override + protected void waitFinished() { + // don't wait + } + + @Override + protected WebView findView(final URL resource) { + final Worker<Void> w = webView.getEngine().getLoadWorker(); + w.stateProperty().addListener(new ChangeListener<Worker.State>() { + private String previous; + + @Override + public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State newState) { + if (newState.equals(Worker.State.SUCCEEDED)) { + if (checkValid()) { + onPageLoad(); + } + } + if (newState.equals(Worker.State.FAILED)) { + checkValid(); + throw new IllegalStateException("Failed to load " + resource); + } + } + + private boolean checkValid() { + final String crnt = webView.getEngine().getLocation(); + if (previous != null && !previous.equals(crnt)) { + w.stateProperty().removeListener(this); + return false; + } + previous = crnt; + return true; + } + }); + + return webView; + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-fx/src/main/java/net/java/html/boot/fx/package.html ---------------------------------------------------------------------- diff --git a/boot-fx/src/main/java/net/java/html/boot/fx/package.html b/boot-fx/src/main/java/net/java/html/boot/fx/package.html new file mode 100644 index 0000000..d2ed2c4 --- /dev/null +++ b/boot-fx/src/main/java/net/java/html/boot/fx/package.html @@ -0,0 +1,51 @@ +<!-- + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + + Oracle and Java are registered trademarks of Oracle and/or its affiliates. + Other names may be trademarks of their respective owners. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 2 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with the + License. You can obtain a copy of the License at + http://www.netbeans.org/cddl-gplv2.html + or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + specific language governing permissions and limitations under the + License. When distributing the software, include this License Header + Notice in each file and include the License file at + nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + particular file as subject to the "Classpath" exception as provided + by Oracle in the GPL Version 2 section of the License file that + accompanied this code. If applicable, add the following below the + License Header, with the fields enclosed by brackets [] replaced by + your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + Contributor(s): + + The Original Software is NetBeans. The Initial Developer of the Original + Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + + If you wish your version of this file to be governed by only the CDDL + or only the GPL Version 2, indicate your decision by adding + "[Contributor] elects to include this software in this distribution + under the [CDDL or GPL Version 2] license." If you do not indicate a + single choice of license, a recipient has the option to distribute + your version of this file under either the CDDL, the GPL Version 2 or + to extend the choice of license to its licensees as provided above. + However, if you add GPL Version 2 code and therefore, elected the GPL + Version 2 license, then the option applies only if the new code is + made subject to such option by the copyright holder. + +--> +<body> + <p> + Implementation of {@link net.java.html.boot.BrowserBuilder} that renders + using JavaFX WebView and additional {@link net.java.html.boot.fx.FXBrowsers utilities} + to configure individual WebViews. + </p> +</body> http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-fx/src/main/java/org/netbeans/html/boot/fx/AbstractFXPresenter.java ---------------------------------------------------------------------- diff --git a/boot-fx/src/main/java/org/netbeans/html/boot/fx/AbstractFXPresenter.java b/boot-fx/src/main/java/org/netbeans/html/boot/fx/AbstractFXPresenter.java new file mode 100644 index 0000000..9164140 --- /dev/null +++ b/boot-fx/src/main/java/org/netbeans/html/boot/fx/AbstractFXPresenter.java @@ -0,0 +1,433 @@ +/** + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ +package org.netbeans.html.boot.fx; + +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.IOException; +import java.io.Reader; +import java.lang.ref.WeakReference; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Executor; +import java.util.logging.Level; +import java.util.logging.Logger; +import javafx.application.Platform; +import javafx.scene.Parent; +import javafx.scene.layout.BorderPane; +import javafx.scene.web.WebEngine; +import javafx.scene.web.WebView; +import netscape.javascript.JSObject; +import org.netbeans.html.boot.spi.Fn; + +/** + * + * @author Jaroslav Tulach + */ +public abstract class AbstractFXPresenter implements Fn.Presenter, +Fn.KeepAlive, Fn.ToJavaScript, Fn.FromJavaScript, Executor, Cloneable { + static final Logger LOG = Logger.getLogger(FXPresenter.class.getName()); + protected static int cnt; + protected Runnable onLoad; + protected WebEngine engine; + + // transient - e.g. not cloneable + private JSObject arraySize; + private JSObject wrapArrImpl; + private Object undefined; + + @Override + protected AbstractFXPresenter clone() { + try { + AbstractFXPresenter p = (AbstractFXPresenter) super.clone(); + p.arraySize = null; + p.wrapArrImpl = null; + p.undefined = null; + return p; + } catch (CloneNotSupportedException ex) { + throw new IllegalStateException(ex); + } + } + + @Override + public Fn defineFn(String code, String... names) { + return defineJSFn(code, names, null); + } + + @Override + public Fn defineFn(String code, String[] names, boolean[] keepAlive) { + return defineJSFn(code, names, keepAlive); + } + + + + final JSFn defineJSFn(String code, String[] names, boolean[] keepAlive) { + StringBuilder sb = new StringBuilder(); + sb.append("(function() {\n"); + sb.append(" return function(\n "); + String sep = ""; + if (names != null) for (String n : names) { + sb.append(sep).append(n); + sep = ","; + } + sb.append(" \n) {\n"); + sb.append(code); + sb.append("};\n"); + sb.append("})();\n"); + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, + "defining function #{0}:\n{1}\n", + new Object[] { ++cnt, code } + ); + } + JSObject x = (JSObject) engine.executeScript(sb.toString()); + return new JSFn(this, x, cnt, keepAlive); + } + + @Override + public void loadScript(Reader code) throws Exception { + BufferedReader r = new BufferedReader(code); + StringBuilder sb = new StringBuilder(); + for (;;) { + String l = r.readLine(); + if (l == null) { + break; + } + sb.append(l).append('\n'); + } + final String script = sb.toString(); + engine.executeScript(script); + } + + protected final void onPageLoad() { + Closeable c = Fn.activate(this.clone()); + try { + onLoad.run(); + } finally { + try { + c.close(); + } catch (IOException ex) { + LOG.log(Level.SEVERE, null, ex); + } + } + } + + @Override + public void displayPage(final URL resource, final Runnable onLoad) { + this.onLoad = onLoad; + final WebView view = findView(resource); + this.engine = view.getEngine(); + boolean inspectOn = false; + try { + if (FXInspect.initialize(engine)) { + inspectOn = true; + } + } catch (Throwable ex) { + ex.printStackTrace(); + } + final boolean isFirebugOn = Boolean.getBoolean("firebug.lite"); // NOI18N + final boolean isInspectOn = inspectOn; + class Run implements Runnable { + + @Override + public void run() { + if (isInspectOn || isFirebugOn) { + view.setContextMenuEnabled(true); + final Parent p = view.getParent(); + if (p instanceof BorderPane) { + BorderPane bp = (BorderPane) p; + if (bp.getTop() == null) { + bp.setTop(new FXToolbar(view, bp, isFirebugOn)); + } + } + } + engine.load(resource.toExternalForm()); + } + } + Run run = new Run(); + if (Platform.isFxApplicationThread()) { + run.run(); + } else { + Platform.runLater(run); + } + waitFinished(); + } + + protected abstract void waitFinished(); + + protected abstract WebView findView(final URL resource); + + final JSObject convertArrays(Object[] arr) { + for (int i = 0; i < arr.length; i++) { + if (arr[i] instanceof Object[]) { + arr[i] = convertArrays((Object[]) arr[i]); + } + } + final JSObject wrapArr = (JSObject)wrapArrFn().call("array", arr); // NOI18N + return wrapArr; + } + + private final JSObject wrapArrFn() { + if (wrapArrImpl == null) { + try { + wrapArrImpl = (JSObject)defineJSFn(" var k = {};" + + " k.array= function() {" + + " return Array.prototype.slice.call(arguments);" + + " };" + + " return k;", null, null + ).invokeImpl(null, false); + } catch (Exception ex) { + throw new IllegalStateException(ex); + } + } + return wrapArrImpl; + } + + final Object undefined() { + if (undefined == null) { + undefined = engine.executeScript("undefined"); + } + return undefined; + } + + final Object checkArray(Object val) { + if (!(val instanceof JSObject)) { + return val; + } + int length = ((Number) arraySizeFn().call("array", val, null)).intValue(); + if (length == -1) { + return val; + } + Object[] arr = new Object[length]; + arraySizeFn().call("array", val, arr); + clearUndefinedArray(arr); + return arr; + } + + private void clearUndefinedArray(Object[] arr) { + for (int i = 0; i < arr.length; i++) { + if (arr[i] == undefined) { + arr[i] = null; + continue; + } + if (arr[i] instanceof Object[]) { + clearUndefinedArray((Object[])arr[i]); + } + } + } + + private final JSObject arraySizeFn() { + if (arraySize == null) { + try { + arraySize = (JSObject)defineJSFn(" var k = {};" + + " k.array = function(arr, to) {" + + " if (to === null) {" + + " if (Object.prototype.toString.call(arr) === '[object Array]') return arr.length;" + + " else return -1;" + + " } else {" + + " var l = arr.length;" + + " for (var i = 0; i < l; i++) to[i] = arr[i];" + + " return l;" + + " }" + + " };" + + " return k;", null, null + ).invokeImpl(null, false); + } catch (Exception ex) { + throw new IllegalStateException(ex); + } + } + return arraySize; + } + + @Override + public Object toJava(Object toJS) { + if (toJS instanceof Weak) { + toJS = ((Weak)toJS).get(); + } + if (toJS == undefined()) { + return null; + } + return checkArray(toJS); + } + + @Override + public Object toJavaScript(Object toReturn) { + if (toReturn instanceof Object[]) { + return convertArrays((Object[])toReturn); + } else { + if (toReturn instanceof Character) { + return (int)(Character)toReturn; + } + return toReturn; + } + } + + @Override public void execute(final Runnable r) { + if (Platform.isFxApplicationThread()) { + Closeable c = Fn.activate(this); + try { + r.run(); + } finally { + try { + c.close(); + } catch (IOException ex) { + // ignore + } + } + } else { + class Wrap implements Runnable { + @Override + public void run() { + Closeable c = Fn.activate(AbstractFXPresenter.this); + try { + r.run(); + } finally { + try { + c.close(); + } catch (IOException ex) { + // ignore + } + } + } + } + Platform.runLater(new Wrap()); + } + } + + private static final class JSFn extends Fn { + + private final JSObject fn; + private static int call; + private final int id; + private final boolean[] keepAlive; + + public JSFn(AbstractFXPresenter p, JSObject fn, int id, boolean[] keepAlive) { + super(p); + this.fn = fn; + this.id = id; + this.keepAlive = keepAlive; + } + + @Override + public Object invoke(Object thiz, Object... args) throws Exception { + return invokeImpl(thiz, true, args); + } + + final Object invokeImpl(Object thiz, boolean arrayChecks, Object... args) throws Exception { + try { + final AbstractFXPresenter presenter = (AbstractFXPresenter) presenter(); + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, "calling {0} function #{1}", new Object[]{++call, id}); + LOG.log(Level.FINER, " thiz : {0}", thiz); + LOG.log(Level.FINER, " params: {0}", Arrays.asList(args)); + } + List<Object> all = new ArrayList<Object>(args.length + 1); + all.add(thiz == null ? fn : thiz); + for (int i = 0; i < args.length; i++) { + Object conv = args[i]; + if (arrayChecks) { + if (args[i] instanceof Object[]) { + Object[] arr = (Object[]) args[i]; + conv = presenter.convertArrays(arr); + } + if (conv != null && keepAlive != null && + !keepAlive[i] && !isJSReady(conv) && + !conv.getClass().getSimpleName().equals("$JsCallbacks$") // NOI18N + ) { + conv = new Weak(conv); + } + if (conv instanceof Character) { + conv = (int)(Character)conv; + } + } + all.add(conv); + } + Object ret = fn.call("call", all.toArray()); // NOI18N + if (ret instanceof Weak) { + ret = ((Weak)ret).get(); + } + if (ret == fn || ret == presenter.undefined()) { + return null; + } + if (!arrayChecks) { + return ret; + } + return presenter.checkArray(ret); + } catch (Error t) { + t.printStackTrace(); + throw t; + } catch (Exception t) { + t.printStackTrace(); + throw t; + } + } + } + + private static boolean isJSReady(Object obj) { + if (obj == null) { + return true; + } + if (obj instanceof String) { + return true; + } + if (obj instanceof Number) { + return true; + } + if (obj instanceof JSObject) { + return true; + } + if (obj instanceof Character) { + return true; + } + return false; + } + + private static final class Weak extends WeakReference<Object> { + public Weak(Object referent) { + super(referent); + assert !(referent instanceof Weak); + } + } // end of Weak +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/boot-fx/src/main/java/org/netbeans/html/boot/fx/Dbgr.java ---------------------------------------------------------------------- diff --git a/boot-fx/src/main/java/org/netbeans/html/boot/fx/Dbgr.java b/boot-fx/src/main/java/org/netbeans/html/boot/fx/Dbgr.java new file mode 100644 index 0000000..0d2b325 --- /dev/null +++ b/boot-fx/src/main/java/org/netbeans/html/boot/fx/Dbgr.java @@ -0,0 +1,87 @@ +/** + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * Contributor(s): + * + * The Original Software is NetBeans. The Initial Developer of the Original + * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved. + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + */ +package org.netbeans.html.boot.fx; + +import java.lang.reflect.Method; +import java.util.logging.Level; +import javafx.scene.web.WebEngine; +import javafx.util.Callback; +import static org.netbeans.html.boot.fx.AbstractFXPresenter.LOG; + +/** Debugger bridge to shield us from propriatory impl APIs. + * + * @author Jaroslav Tulach + */ +final class Dbgr { + final Object dbg; + final Method sendMsg; + + Dbgr(WebEngine eng, Callback<String,Void> callback) { + Object d; + Method m; + try { + d = eng.getClass().getMethod("impl_getDebugger").invoke(eng); // NOI18N + Class<?> debugger = eng.getClass().getClassLoader().loadClass("com.sun.javafx.scene.web.Debugger"); // NOI18N + debugger.getMethod("setEnabled", boolean.class).invoke(d, true); // NOI18N + debugger.getMethod("setMessageCallback", Callback.class).invoke(d, callback); // NOI18N + m = debugger.getMethod("sendMessage", String.class); // NOI18N + } catch (Exception ex) { + LOG.log(Level.INFO, null, ex); + d = null; + m = null; + } + dbg = d; + sendMsg = m; + } + + void sendMessage(String msg) { + try { + if (dbg != null) { + sendMsg.invoke(dbg, msg); + } + } catch (Exception ex) { + LOG.log(Level.INFO, null, ex); + } + } + +}
