Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit ec3b681

Browse files
authored
DRM (#3082)
1 parent 0e24c19 commit ec3b681

45 files changed

Lines changed: 603 additions & 442 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/src/common/shared/org/mozilla/vrbrowser/browser/PermissionDelegate.java

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ void handleWebXRPermission(GeckoSession aGeckoSession, final String aUri, final
105105
.findFirst().orElse(null);
106106
}
107107

108-
if (site == null || site.allowed) {
108+
if (site == null) {
109109
aCallback.grant();
110110
session.setWebXRState(SessionState.WEBXR_ALLOWED);
111111
} else {
@@ -127,11 +127,11 @@ public void release() {
127127
public void onAndroidPermissionsRequest(GeckoSession aSession, String[] permissions, Callback aCallback) {
128128
Log.d(LOGTAG, "onAndroidPermissionsRequest: " + Arrays.toString(permissions));
129129
ArrayList<String> missingPermissions = new ArrayList<>();
130-
ArrayList<String> filteredPemissions = new ArrayList<>();
130+
ArrayList<String> filteredPermissions = new ArrayList<>();
131131
for (String permission: permissions) {
132132
if (PlatformActivity.filterPermission(permission)) {
133133
Log.d(LOGTAG, "Skipping permission: " + permission);
134-
filteredPemissions.add(permission);
134+
filteredPermissions.add(permission);
135135
continue;
136136
}
137137
Log.d(LOGTAG, "permission = " + permission);
@@ -141,7 +141,7 @@ public void onAndroidPermissionsRequest(GeckoSession aSession, String[] permissi
141141
}
142142

143143
if (missingPermissions.size() == 0) {
144-
if (filteredPemissions.size() == 0) {
144+
if (filteredPermissions.size() == 0) {
145145
Log.d(LOGTAG, "Android permissions granted");
146146
aCallback.grant();
147147
} else {
@@ -178,7 +178,21 @@ public void onContentPermissionRequest(GeckoSession aSession, String aUri, int a
178178
} else if (aType == PERMISSION_GEOLOCATION) {
179179
type = PermissionWidget.PermissionType.Location;
180180
} else if (aType == PERMISSION_MEDIA_KEY_SYSTEM_ACCESS) {
181-
callback.grant();
181+
WindowWidget windowWidget = mWidgetManager.getFocusedWindow();
182+
Runnable enableDrm = () -> {
183+
if (SettingsStore.getInstance(mContext).isDrmContentPlaybackEnabled()) {
184+
callback.grant();
185+
} else {
186+
callback.reject();
187+
}
188+
};
189+
if (SettingsStore.getInstance(mContext).isDrmContentPlaybackSet()) {
190+
enableDrm.run();
191+
192+
} else {
193+
windowWidget.showFirstTimeDrmDialog(enableDrm);
194+
}
195+
windowWidget.setDrmUsed(true);
182196
return;
183197
} else {
184198
Log.e(LOGTAG, "onContentPermissionRequest unknown permission: " + aType);
@@ -274,24 +288,35 @@ public void reject() {
274288
}
275289
}
276290

277-
public void setPermissionAllowed(String uri, @SitePermission.Category int category, boolean allowed) {
291+
public void addPermissionException(String uri, @SitePermission.Category int category) {
278292
@Nullable SitePermission site = mSitePermissions.stream()
279293
.filter((item) -> item.category == category && item.url.equals(uri))
280294
.findFirst().orElse(null);
281-
boolean wasAllowed = site == null || site.allowed;
282-
if (allowed == wasAllowed) {
283-
return;
295+
296+
if (site == null) {
297+
site = new SitePermission(uri, uri, category);
298+
mSitePermissions.add(site);
284299
}
285-
if (allowed) {
286-
mSitePermissions.removeIf(sitePermission -> sitePermission.url.equals(uri));
287-
mSitePermissionModel.deleteSite(site);
288-
} else {
289-
if (site == null) {
290-
site = new SitePermission(uri, uri, false, category);
291-
mSitePermissions.add(site);
300+
mSitePermissionModel.insertSite(site);
301+
302+
// Reload URIs with the same domain
303+
for (WindowWidget window: mWidgetManager.getWindows().getCurrentWindows()) {
304+
Session session = window.getSession();
305+
if (uri.equalsIgnoreCase(UrlUtils.getHost(session.getCurrentUri()))) {
306+
session.reload(GeckoSession.LOAD_FLAGS_BYPASS_CACHE);
292307
}
293-
site.allowed = false;
294-
mSitePermissionModel.insertSite(site);
308+
}
309+
310+
}
311+
312+
public void removePermissionException(String uri, @SitePermission.Category int category) {
313+
@Nullable SitePermission site = mSitePermissions.stream()
314+
.filter((item) -> item.category == category && item.url.equals(uri))
315+
.findFirst().orElse(null);
316+
317+
mSitePermissions.removeIf(sitePermission -> sitePermission.url.equals(uri));
318+
if (site != null) {
319+
mSitePermissionModel.deleteSite(site);
295320
}
296321

297322
// Reload URIs with the same domain

app/src/common/shared/org/mozilla/vrbrowser/browser/PromptDelegate.java

Lines changed: 17 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import android.app.Application;
44
import android.content.Context;
5-
import android.util.Pair;
6-
import android.util.SparseArray;
75

86
import androidx.annotation.NonNull;
97
import androidx.annotation.Nullable;
@@ -13,53 +11,40 @@
1311
import org.mozilla.geckoview.GeckoResult;
1412
import org.mozilla.geckoview.GeckoSession;
1513
import org.mozilla.geckoview.SlowScriptResponse;
16-
import org.mozilla.vrbrowser.AppExecutors;
1714
import org.mozilla.vrbrowser.R;
18-
import org.mozilla.vrbrowser.VRBrowserApplication;
1915
import org.mozilla.vrbrowser.browser.engine.Session;
16+
import org.mozilla.vrbrowser.browser.engine.SessionState;
2017
import org.mozilla.vrbrowser.db.SitePermission;
2118
import org.mozilla.vrbrowser.ui.viewmodel.SitePermissionViewModel;
2219
import org.mozilla.vrbrowser.ui.widgets.UIWidget;
2320
import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement;
2421
import org.mozilla.vrbrowser.ui.widgets.WindowWidget;
25-
import org.mozilla.vrbrowser.ui.widgets.dialogs.PopUpBlockDialogWidget;
26-
import org.mozilla.vrbrowser.ui.widgets.dialogs.QuickPermissionWidget;
2722
import org.mozilla.vrbrowser.ui.widgets.prompts.AlertPromptWidget;
2823
import org.mozilla.vrbrowser.ui.widgets.prompts.AuthPromptWidget;
2924
import org.mozilla.vrbrowser.ui.widgets.prompts.ChoicePromptWidget;
3025
import org.mozilla.vrbrowser.ui.widgets.prompts.ConfirmPromptWidget;
3126
import org.mozilla.vrbrowser.ui.widgets.prompts.PromptWidget;
3227
import org.mozilla.vrbrowser.ui.widgets.prompts.TextPromptWidget;
28+
import org.mozilla.vrbrowser.utils.UrlUtils;
3329

3430
import java.util.ArrayList;
35-
import java.util.LinkedList;
3631
import java.util.List;
37-
import java.util.Optional;
3832

3933
public 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

Comments
 (0)