@@ -88,8 +88,19 @@ class BrowserFrame extends Handler {
8888 // Is this frame the main frame?
8989 private boolean mIsMainFrame ;
9090
91+ // Javascript interface object
92+ private class JSObject {
93+ Object object ;
94+ boolean requireAnnotation ;
95+
96+ public JSObject (Object object , boolean requireAnnotation ) {
97+ this .object = object ;
98+ this .requireAnnotation = requireAnnotation ;
99+ }
100+ }
101+
91102 // Attached Javascript interfaces
92- private Map <String , Object > mJavaScriptObjects ;
103+ private Map <String , JSObject > mJavaScriptObjects ;
93104 private Set <Object > mRemovedJavaScriptObjects ;
94105
95106 // Key store handler when Chromium HTTP stack is used.
@@ -233,10 +244,8 @@ public BrowserFrame(Context context, WebViewCore w, CallbackProxy proxy,
233244 }
234245 sConfigCallback .addHandler (this );
235246
236- mJavaScriptObjects = javascriptInterfaces ;
237- if (mJavaScriptObjects == null ) {
238- mJavaScriptObjects = new HashMap <String , Object >();
239- }
247+ mJavaScriptObjects = new HashMap <String , JSObject >();
248+ addJavaScriptObjects (javascriptInterfaces );
240249 mRemovedJavaScriptObjects = new HashSet <Object >();
241250
242251 mSettings = settings ;
@@ -590,15 +599,34 @@ private void windowObjectCleared(int nativeFramePointer) {
590599 Iterator <String > iter = mJavaScriptObjects .keySet ().iterator ();
591600 while (iter .hasNext ()) {
592601 String interfaceName = iter .next ();
593- Object object = mJavaScriptObjects .get (interfaceName );
594- if (object != null ) {
602+ JSObject jsobject = mJavaScriptObjects .get (interfaceName );
603+ if (jsobject != null && jsobject . object != null ) {
595604 nativeAddJavascriptInterface (nativeFramePointer ,
596- mJavaScriptObjects . get ( interfaceName ) , interfaceName );
605+ jsobject . object , interfaceName , jsobject . requireAnnotation );
597606 }
598607 }
599608 mRemovedJavaScriptObjects .clear ();
600609 }
601610
611+ /*
612+ * Add javascript objects to the internal list of objects. The default behavior
613+ * is to allow access to inherited methods (no annotation needed). This is only
614+ * used when js objects are passed through a constructor (via a hidden constructor).
615+ *
616+ */
617+ private void addJavaScriptObjects (Map <String , Object > javascriptInterfaces ) {
618+
619+ if (javascriptInterfaces == null ) return ;
620+ Iterator <String > iter = javascriptInterfaces .keySet ().iterator ();
621+ while (iter .hasNext ()) {
622+ String interfaceName = iter .next ();
623+ Object object = javascriptInterfaces .get (interfaceName );
624+ if (object != null ) {
625+ mJavaScriptObjects .put (interfaceName , new JSObject (object , false ));
626+ }
627+ }
628+ }
629+
602630 /**
603631 * This method is called by WebCore to check whether application
604632 * wants to hijack url loading
@@ -616,11 +644,11 @@ public boolean handleUrl(String url) {
616644 }
617645 }
618646
619- public void addJavascriptInterface (Object obj , String interfaceName ) {
647+ public void addJavascriptInterface (Object obj , String interfaceName ,
648+ boolean requireAnnotation ) {
620649 assert obj != null ;
621650 removeJavascriptInterface (interfaceName );
622-
623- mJavaScriptObjects .put (interfaceName , obj );
651+ mJavaScriptObjects .put (interfaceName , new JSObject (obj , requireAnnotation ));
624652 }
625653
626654 public void removeJavascriptInterface (String interfaceName ) {
@@ -1246,7 +1274,7 @@ private native void nativeCallPolicyFunction(int policyFunction,
12461274 * Add a javascript interface to the main frame.
12471275 */
12481276 private native void nativeAddJavascriptInterface (int nativeFramePointer ,
1249- Object obj , String interfaceName );
1277+ Object obj , String interfaceName , boolean requireAnnotation );
12501278
12511279 public native void clearCache ();
12521280
0 commit comments