2020import com .facebook .react .bridge .ReadableArray ;
2121import com .facebook .react .bridge .ReadableMap ;
2222import com .facebook .react .bridge .WritableMap ;
23+ import com .facebook .react .module .annotations .ReactModule ;
2324
2425import java .io .ByteArrayInputStream ;
2526import java .io .IOException ;
4041/**
4142 * @author Sam Macbeth
4243 */
44+ @ ReactModule (name = "WebRequest" )
4345public class WebRequest extends ReactContextBaseJavaModule {
4446
4547 private final static String TAG = WebRequest .class .getSimpleName ();
@@ -88,7 +90,40 @@ public void isWindowActive(int tabId, Promise promise) {
8890
8991 private boolean isTabActive (final int tabId ) {
9092 Pair <Uri , WeakReference <WebView >> tuple = tabs .get (tabId );
91- return tuple != null && tuple .second .get () != null ;
93+ final boolean active = tuple != null && tuple .second .get () != null ;
94+
95+ if (!active ) {
96+ // send core:tab_close event to notify extension that tab is gone
97+ final WritableMap tab = Arguments .createMap ();
98+ tab .putInt ("tabId" , tabId );
99+ engine .publishEvent ("core:tab_close" , tab );
100+ }
101+ return active ;
102+ }
103+
104+ private JSBridge ensureBridge () {
105+ try {
106+ return engine .getBridge ();
107+ } catch (EngineNotYetAvailable e ) {
108+ Log .w ("webrequest" , "jsengine not yet loaded, waiting" , e );
109+ try {
110+ Thread .sleep (250 );
111+ } finally {
112+ return ensureBridge ();
113+ }
114+ }
115+ }
116+
117+ private ReadableMap triggerWebRequest (final WritableMap requestInfo ) throws EmptyResponseException {
118+ try {
119+ return ensureBridge ().callAction ("webRequest" , requestInfo );
120+ } catch (ActionNotAvailable e ) {
121+ try {
122+ Thread .sleep (200 );
123+ } finally {
124+ return triggerWebRequest (requestInfo );
125+ }
126+ }
92127 }
93128
94129 @ TargetApi (Build .VERSION_CODES .LOLLIPOP )
@@ -158,6 +193,7 @@ public WebResourceResponse shouldInterceptRequest(final WebView view, final WebR
158193 requestInfo .putString ("originUrl" , originUrl );
159194 requestInfo .putString ("sourceUrl" , originUrl );
160195 requestInfo .putString ("frameUrl" , originUrl );
196+ requestInfo .putString ("tabUrl" , originUrl );
161197 requestInfo .putInt ("type" , contentPolicyType );
162198
163199 final WritableMap requestHeaders = Arguments .createMap ();
@@ -167,7 +203,7 @@ public WebResourceResponse shouldInterceptRequest(final WebView view, final WebR
167203 requestInfo .putMap ("requestHeaders" , requestHeaders );
168204
169205 try {
170- final ReadableMap response = engine . getBridge (). callAction ( "webRequest" , requestInfo );
206+ final ReadableMap response = triggerWebRequest ( requestInfo );
171207 final ReadableMap blockResponse = response .getMap ("result" );
172208 final String source = blockResponse .hasKey ("source" ) ? blockResponse .getString ("source" ) : "" ;
173209 // counter for tab
@@ -195,12 +231,8 @@ public WebResourceResponse shouldInterceptRequest(final WebView view, final WebR
195231 Log .d (TAG , "Modify request from: " + requestUrl .toString ());
196232 return modifyRequest (source , request , newUrl , modifiedHeaders );
197233 }
198- } catch (ActionNotAvailable e ) {
199- Log .w ("webrequest" , "jsengine not ready yet" , e );
200234 } catch (EmptyResponseException e ) {
201235 Log .w ("webrequest" , "jsengine timed out" , e );
202- } catch (EngineNotYetAvailable e ) {
203- Log .w ("webrequest" , "jsengine not yet loaded" , e );
204236 } catch (NoSuchKeyException e ) {
205237 Log .e ("webrequest" , "error in jsengine response" , e );
206238 }
0 commit comments