diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/WrapperFactory.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/WrapperFactory.java index 28cb810fb92..d471cf2533f 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/WrapperFactory.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/WrapperFactory.java @@ -51,6 +51,20 @@ public interface WrapperFactory { public String getProfile(); public void setProfile(String profileName); + /** + * + *

This method must not be called by the developer. + * + *

Cause the native library to be loaded, if necessary. This method + * must be called from the native event thread.

+ * + *

POSTCONDITION: Native library for webclient has been loaded.

+ * + * @return implmentation specific native int. + * + */ + public int loadNativeLibraryIfNecessary(); + /** * *

Cause the native library to be loaded, if necessary.

diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java index 7073b1f4ae4..60e33cebe72 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/CurrentPageImpl.java @@ -87,7 +87,15 @@ public CurrentPageImpl(WrapperFactory yourFactory, super(yourFactory, yourBrowserControl); // force the class to be loaded, thus loading the JNI library if (!domInitialized) { - DOMAccessor.initialize(); + NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable() { + public Object run() { + DOMAccessor.initialize(); + return null; + } + public String toString() { + return "WCRunnable.CurrentPageImpl ctor"; + } + }); } domDumper = new DOMTreeDumper(); } @@ -295,13 +303,24 @@ public String getCurrentURL() public Document getDOM() { - // PENDING(edburns): run this on the event thread. - Document result = nativeGetDOM(getNativeBrowserControl()); - if (LOGGER.isLoggable((Level.INFO))) { - LOGGER.info("CurrentPageImpl.getDOM(): getting DOM with URI: " + - result.getDocumentURI()); - } - return result; + final Document[] resultHolder = new Document[1]; + resultHolder[0] = null; + NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable() { + public Object run() { + Document result = nativeGetDOM(getNativeBrowserControl()); + if (LOGGER.isLoggable((Level.INFO))) { + LOGGER.info("CurrentPageImpl.getDOM(): getting DOM with URI: " + + result.getDocumentURI()); + } + resultHolder[0] = result; + return null; + } + public String toString() { + return "WCRunnable.CurrentPageImpl.getDOM"; + } + }); + + return resultHolder[0]; } public Properties getPageInfo() diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/EventRegistrationImpl.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/EventRegistrationImpl.java index 75efaeccda6..8f2db7407d8 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/EventRegistrationImpl.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/EventRegistrationImpl.java @@ -263,28 +263,26 @@ public void setNewWindowListener(NewWindowListener listener) { getWrapperFactory().verifyInitialized(); - synchronized(this) { - final boolean doClear = null == listener; - NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable(){ - public Object run() { - if (doClear) { - nativeSetNewWindowListenerAttached(getNativeBrowserControl(), - false); - } - else { - nativeSetNewWindowListenerAttached(getNativeBrowserControl(), - true); - } - return null; - } - public String toString() { - return "WCRunnable.nativeSetNewWindowListenerAttached"; - } + final boolean doClear = null == listener; + NativeEventThread.instance.pushBlockingWCRunnable(new WCRunnable(){ + public Object run() { + if (doClear) { + nativeSetNewWindowListenerAttached(getNativeBrowserControl(), + false); + } + else { + nativeSetNewWindowListenerAttached(getNativeBrowserControl(), + true); + } + return null; + } + public String toString() { + return "WCRunnable.nativeSetNewWindowListenerAttached"; + } - }); - - newWindowListener = listener; - } + }); + + newWindowListener = listener; } /** diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NativeEventThread.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NativeEventThread.java index 84b43293c16..304558eaf44 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NativeEventThread.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/NativeEventThread.java @@ -76,8 +76,7 @@ public class NativeEventThread extends Thread { // public NativeEventThread(String threadName, - WrapperFactory yourFactory, - int yourNativeWrapperFactory) { + WrapperFactory yourFactory) { super(threadName); // Don't do this check for subclasses if (this.getClass() == NativeEventThread.class) { @@ -86,8 +85,6 @@ public class NativeEventThread extends Thread { ParameterCheck.nonNull(yourFactory); wrapperFactory = yourFactory; - nativeWrapperFactory = yourNativeWrapperFactory; - blockingRunnables = new ConcurrentLinkedQueue(); runnables = new ConcurrentLinkedQueue(); } @@ -142,6 +139,8 @@ public class NativeEventThread extends Thread { public void run() { + nativeWrapperFactory = wrapperFactory.loadNativeLibraryIfNecessary(); + // our owner must have put an event in the queue Assert.assert_it(!runnables.isEmpty()); ((Runnable)runnables.poll()).run(); diff --git a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WrapperFactoryImpl.java b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WrapperFactoryImpl.java index 52ad592d49c..3eecbd45970 100644 --- a/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WrapperFactoryImpl.java +++ b/mozilla/java/webclient/classes_spec/org/mozilla/webclient/impl/wrapper_native/WrapperFactoryImpl.java @@ -277,22 +277,24 @@ public class WrapperFactoryImpl extends Object implements WrapperFactory { return profileName; } + public int loadNativeLibraryIfNecessary() { + System.loadLibrary("webclient"); + + nativeWrapperFactory = nativeCreateNativeWrapperFactory(); + Assert.assert_it(-1 != nativeWrapperFactory); + return nativeWrapperFactory; + } + public void initialize(String verifiedBinDirAbsolutePath) throws SecurityException, UnsatisfiedLinkError { if (initialized) { return; } - System.loadLibrary("webclient"); - // // Do the first initialization call // - nativeWrapperFactory = nativeCreateNativeWrapperFactory(); - Assert.assert_it(-1 != nativeWrapperFactory); - - eventThread = new NativeEventThread("WebclientEventThread", this, - nativeWrapperFactory); + eventThread = new NativeEventThread("WebclientEventThread", this); final String finalStr = new String(verifiedBinDirAbsolutePath);