22
33import android .app .Application ;
44import android .content .Context ;
5- import android .util .Pair ;
6- import android .util .SparseArray ;
75
86import androidx .annotation .NonNull ;
97import androidx .annotation .Nullable ;
1311import org .mozilla .geckoview .GeckoResult ;
1412import org .mozilla .geckoview .GeckoSession ;
1513import org .mozilla .geckoview .SlowScriptResponse ;
16- import org .mozilla .vrbrowser .AppExecutors ;
1714import org .mozilla .vrbrowser .R ;
18- import org .mozilla .vrbrowser .VRBrowserApplication ;
1915import org .mozilla .vrbrowser .browser .engine .Session ;
16+ import org .mozilla .vrbrowser .browser .engine .SessionState ;
2017import org .mozilla .vrbrowser .db .SitePermission ;
2118import org .mozilla .vrbrowser .ui .viewmodel .SitePermissionViewModel ;
2219import org .mozilla .vrbrowser .ui .widgets .UIWidget ;
2320import org .mozilla .vrbrowser .ui .widgets .WidgetPlacement ;
2421import org .mozilla .vrbrowser .ui .widgets .WindowWidget ;
25- import org .mozilla .vrbrowser .ui .widgets .dialogs .PopUpBlockDialogWidget ;
26- import org .mozilla .vrbrowser .ui .widgets .dialogs .QuickPermissionWidget ;
2722import org .mozilla .vrbrowser .ui .widgets .prompts .AlertPromptWidget ;
2823import org .mozilla .vrbrowser .ui .widgets .prompts .AuthPromptWidget ;
2924import org .mozilla .vrbrowser .ui .widgets .prompts .ChoicePromptWidget ;
3025import org .mozilla .vrbrowser .ui .widgets .prompts .ConfirmPromptWidget ;
3126import org .mozilla .vrbrowser .ui .widgets .prompts .PromptWidget ;
3227import org .mozilla .vrbrowser .ui .widgets .prompts .TextPromptWidget ;
28+ import org .mozilla .vrbrowser .utils .UrlUtils ;
3329
3430import java .util .ArrayList ;
35- import java .util .LinkedList ;
3631import java .util .List ;
37- import java .util .Optional ;
3832
3933public class PromptDelegate implements
4034 GeckoSession .PromptDelegate ,
4135 WindowWidget .WindowListener ,
4236 GeckoSession .NavigationDelegate ,
4337 GeckoSession .ContentDelegate {
4438
45- public interface PopUpDelegate {
46- void onPopUpAvailable ();
47- void onPopUpsCleared ();
48- }
49-
5039 private PromptWidget mPrompt ;
51- private PopUpBlockDialogWidget mPopUpPrompt ;
5240 private ConfirmPromptWidget mSlowScriptPrompt ;
5341 private Context mContext ;
5442 private WindowWidget mAttachedWindow ;
5543 private List <SitePermission > mAllowedPopUpSites ;
5644 private SitePermissionViewModel mViewModel ;
57- private AppExecutors mExecutors ;
58- private PopUpDelegate mPopupDelegate ;
5945
6046 public PromptDelegate (@ NonNull Context context ) {
6147 mContext = context ;
62- mExecutors = ((VRBrowserApplication )context .getApplicationContext ()).getExecutors ();
6348 mViewModel = new SitePermissionViewModel (((Application )context .getApplicationContext ()));
6449 mAllowedPopUpSites = new ArrayList <>();
6550 }
@@ -89,8 +74,6 @@ public void detachFromWindow() {
8974 mAttachedWindow = null ;
9075 }
9176 mViewModel .getAll (SitePermission .SITE_PERMISSION_POPUP ).removeObserver (mPopUpSiteObserver );
92-
93- clearPopUps ();
9477 }
9578
9679 private Session getSession () {
@@ -110,19 +93,6 @@ private void cleanSession(@NonNull Session aSession) {
11093 aSession .setPromptDelegate (null );
11194 aSession .removeNavigationListener (this );
11295 aSession .removeContentListener (this );
113- mPopUpRequests .remove (aSession .hashCode ());
114- }
115-
116- public void setPopupDelegate (@ Nullable PopUpDelegate delegate ) {
117- mPopupDelegate = delegate ;
118- }
119-
120- public void clearPopUps () {
121- mPopUpRequests .clear ();
122-
123- if (mPopupDelegate != null ) {
124- mPopupDelegate .onPopUpsCleared ();
125- }
12696 }
12797
12898 @ Nullable
@@ -276,136 +246,31 @@ public GeckoResult<PromptResponse> onPopupPrompt(@NonNull GeckoSession geckoSess
276246 result .complete (popupPrompt .confirm (AllowOrDeny .ALLOW ));
277247
278248 } else {
279- final int sessionId = geckoSession .hashCode ();
280- final String uri = mAttachedWindow .getSession ().getCurrentUri ();
281-
282- Optional <SitePermission > site = mAllowedPopUpSites .stream ().filter ((item ) -> item .url .equals (uri )).findFirst ();
283- if (site .isPresent ()) {
284- mAttachedWindow .postDelayed (() -> {
285- if (site .get ().allowed ) {
249+ Session session = mAttachedWindow .getSession ();
250+ if (session != null ) {
251+ final String uri = UrlUtils .getHost (session .getCurrentUri ());
252+ SitePermission site = mAllowedPopUpSites .stream ().filter ((item ) -> item .url .equals (uri )).findFirst ().orElse (null );
253+ if (site != null ) {
254+ mAttachedWindow .postDelayed (() -> {
286255 result .complete (popupPrompt .confirm (AllowOrDeny .ALLOW ));
256+ session .setPopUpState (SessionState .POPUP_ALLOWED );
257+ }, 500 );
287258
288- } else {
289- result .complete (popupPrompt .dismiss ());
290- }
291- }, 500 );
292-
293- } else {
294- PopUpRequest request = PopUpRequest .newRequest (popupPrompt , result , sessionId );
295- Pair <String , LinkedList <PopUpRequest >> domainRequestList = mPopUpRequests .get (sessionId );
296- if (domainRequestList == null ) {
297- LinkedList <PopUpRequest > requestList = new LinkedList <>();
298- domainRequestList = new Pair <>(uri , requestList );
299- mPopUpRequests .put (sessionId , domainRequestList );
259+ } else {
260+ mAttachedWindow .postDelayed (() -> {
261+ result .complete (popupPrompt .confirm (AllowOrDeny .DENY ));
262+ session .setPopUpState (SessionState .POPUP_BLOCKED );
263+ }, 500 );
300264 }
301- domainRequestList .second .add (request );
302265
303- if (mPopupDelegate != null ) {
304- mPopupDelegate .onPopUpAvailable ();
305- }
266+ } else {
267+ result .complete (popupPrompt .confirm (AllowOrDeny .DENY ));
306268 }
307269 }
308270
309271 return result ;
310272 }
311273
312- static class PopUpRequest {
313-
314- public static PopUpRequest newRequest (@ NonNull PopupPrompt prompt , @ NonNull GeckoResult <PromptResponse > response , int sessionId ) {
315- PopUpRequest request = new PopUpRequest ();
316- request .prompt = prompt ;
317- request .response = response ;
318- request .sessionId = sessionId ;
319-
320- return request ;
321- }
322-
323- PopupPrompt prompt ;
324- GeckoResult <PromptResponse > response ;
325- int sessionId ;
326- }
327-
328- private SparseArray <Pair <String , LinkedList <PopUpRequest >>> mPopUpRequests = new SparseArray <>();
329-
330- public void showPopUps (GeckoSession session ) {
331- if (session == null ) {
332- return ;
333- }
334- Pair <String , LinkedList <PopUpRequest >> requests = mPopUpRequests .get (session .hashCode ());
335- if (requests != null && !requests .second .isEmpty ()) {
336- showPopUp (session .hashCode (), requests );
337- }
338- }
339-
340- public boolean hasPendingPopUps (GeckoSession session ) {
341- if (session != null ) {
342- Pair <String , LinkedList <PopUpRequest >> requests = mPopUpRequests .get (session .hashCode ());
343- if (requests != null ) {
344- return !requests .second .isEmpty ();
345- }
346- }
347-
348- return false ;
349- }
350-
351- private void showPopUp (int sessionId , @ NonNull Pair <String , LinkedList <PopUpRequest >> requests ) {
352- String uri = requests .first ;
353- Optional <SitePermission > site = mAllowedPopUpSites .stream ().filter ((item ) -> item .url .equals (uri )).findFirst ();
354- if (!site .isPresent ()) {
355- mPopUpPrompt = new PopUpBlockDialogWidget (mContext );
356- mPopUpPrompt .setButtonsDelegate (index -> {
357- boolean allowed = index != PopUpBlockDialogWidget .NEGATIVE ;
358- boolean askAgain = mPopUpPrompt .askAgain ();
359- if (allowed && !askAgain ) {
360- SitePermission permission = new SitePermission (uri , uri , allowed , SitePermission .SITE_PERMISSION_POPUP );
361- mAllowedPopUpSites .add (permission );
362- mViewModel .insertSite (permission );
363- }
364-
365- if (allowed ) {
366- requests .second .forEach ((request ) -> {
367- request .response .complete (request .prompt .confirm (AllowOrDeny .ALLOW ));
368- });
369-
370- mPopUpRequests .remove (sessionId );
371-
372- mExecutors .mainThread ().execute (() -> {
373- if (mPopupDelegate != null ) {
374- mPopupDelegate .onPopUpsCleared ();
375- }
376- });
377-
378- } else {
379- mExecutors .mainThread ().execute (() -> {
380- if (mPopupDelegate != null ) {
381- mPopupDelegate .onPopUpAvailable ();
382- }
383- });
384- }
385-
386- mPopUpPrompt .hide (UIWidget .REMOVE_WIDGET );
387- mPopUpPrompt .releaseWidget ();
388- mPopUpPrompt = null ;
389- });
390- mPopUpPrompt .setDelegate (() -> mExecutors .mainThread ().execute (() -> {
391- if (mPopupDelegate != null ) {
392- mPopupDelegate .onPopUpAvailable ();
393- }
394- }));
395- mPopUpPrompt .show (UIWidget .REQUEST_FOCUS );
396-
397- } else {
398- requests .second .forEach ((request ) -> {
399- if (site .get ().allowed ) {
400- request .response .complete (request .prompt .confirm (AllowOrDeny .ALLOW ));
401-
402- } else {
403- request .response .complete (request .prompt .dismiss ());
404- }
405- });
406- }
407- }
408-
409274 @ Nullable
410275 @ Override
411276 public GeckoResult <SlowScriptResponse > onSlowScript (@ NonNull GeckoSession aSession , @ NonNull String aScriptFileName ) {
@@ -450,11 +315,4 @@ public void onSessionChanged(@NonNull Session aOldSession, @NonNull Session aSes
450315 cleanSession (aOldSession );
451316 setUpSession (aSession );
452317 }
453-
454- // NavigationDelegate
455-
456- @ Override
457- public void onLocationChange (@ NonNull GeckoSession geckoSession , @ Nullable String s ) {
458- clearPopUps ();
459- }
460318}
0 commit comments