Skip to content

Commit

Permalink
DRM (#3082)
Browse files Browse the repository at this point in the history
  • Loading branch information
keianhzo committed Apr 9, 2020
1 parent 0e24c19 commit ec3b681
Show file tree
Hide file tree
Showing 45 changed files with 603 additions and 442 deletions.
Expand Up @@ -105,7 +105,7 @@ void handleWebXRPermission(GeckoSession aGeckoSession, final String aUri, final
.findFirst().orElse(null);
}

if (site == null || site.allowed) {
if (site == null) {
aCallback.grant();
session.setWebXRState(SessionState.WEBXR_ALLOWED);
} else {
Expand All @@ -127,11 +127,11 @@ public void release() {
public void onAndroidPermissionsRequest(GeckoSession aSession, String[] permissions, Callback aCallback) {
Log.d(LOGTAG, "onAndroidPermissionsRequest: " + Arrays.toString(permissions));
ArrayList<String> missingPermissions = new ArrayList<>();
ArrayList<String> filteredPemissions = new ArrayList<>();
ArrayList<String> filteredPermissions = new ArrayList<>();
for (String permission: permissions) {
if (PlatformActivity.filterPermission(permission)) {
Log.d(LOGTAG, "Skipping permission: " + permission);
filteredPemissions.add(permission);
filteredPermissions.add(permission);
continue;
}
Log.d(LOGTAG, "permission = " + permission);
Expand All @@ -141,7 +141,7 @@ public void onAndroidPermissionsRequest(GeckoSession aSession, String[] permissi
}

if (missingPermissions.size() == 0) {
if (filteredPemissions.size() == 0) {
if (filteredPermissions.size() == 0) {
Log.d(LOGTAG, "Android permissions granted");
aCallback.grant();
} else {
Expand Down Expand Up @@ -178,7 +178,21 @@ public void onContentPermissionRequest(GeckoSession aSession, String aUri, int a
} else if (aType == PERMISSION_GEOLOCATION) {
type = PermissionWidget.PermissionType.Location;
} else if (aType == PERMISSION_MEDIA_KEY_SYSTEM_ACCESS) {
callback.grant();
WindowWidget windowWidget = mWidgetManager.getFocusedWindow();
Runnable enableDrm = () -> {
if (SettingsStore.getInstance(mContext).isDrmContentPlaybackEnabled()) {
callback.grant();
} else {
callback.reject();
}
};
if (SettingsStore.getInstance(mContext).isDrmContentPlaybackSet()) {
enableDrm.run();

} else {
windowWidget.showFirstTimeDrmDialog(enableDrm);
}
windowWidget.setDrmUsed(true);
return;
} else {
Log.e(LOGTAG, "onContentPermissionRequest unknown permission: " + aType);
Expand Down Expand Up @@ -274,24 +288,35 @@ public void reject() {
}
}

public void setPermissionAllowed(String uri, @SitePermission.Category int category, boolean allowed) {
public void addPermissionException(String uri, @SitePermission.Category int category) {
@Nullable SitePermission site = mSitePermissions.stream()
.filter((item) -> item.category == category && item.url.equals(uri))
.findFirst().orElse(null);
boolean wasAllowed = site == null || site.allowed;
if (allowed == wasAllowed) {
return;

if (site == null) {
site = new SitePermission(uri, uri, category);
mSitePermissions.add(site);
}
if (allowed) {
mSitePermissions.removeIf(sitePermission -> sitePermission.url.equals(uri));
mSitePermissionModel.deleteSite(site);
} else {
if (site == null) {
site = new SitePermission(uri, uri, false, category);
mSitePermissions.add(site);
mSitePermissionModel.insertSite(site);

// Reload URIs with the same domain
for (WindowWidget window: mWidgetManager.getWindows().getCurrentWindows()) {
Session session = window.getSession();
if (uri.equalsIgnoreCase(UrlUtils.getHost(session.getCurrentUri()))) {
session.reload(GeckoSession.LOAD_FLAGS_BYPASS_CACHE);
}
site.allowed = false;
mSitePermissionModel.insertSite(site);
}

}

public void removePermissionException(String uri, @SitePermission.Category int category) {
@Nullable SitePermission site = mSitePermissions.stream()
.filter((item) -> item.category == category && item.url.equals(uri))
.findFirst().orElse(null);

mSitePermissions.removeIf(sitePermission -> sitePermission.url.equals(uri));
if (site != null) {
mSitePermissionModel.deleteSite(site);
}

// Reload URIs with the same domain
Expand Down
176 changes: 17 additions & 159 deletions app/src/common/shared/org/mozilla/vrbrowser/browser/PromptDelegate.java
Expand Up @@ -2,8 +2,6 @@

import android.app.Application;
import android.content.Context;
import android.util.Pair;
import android.util.SparseArray;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
Expand All @@ -13,53 +11,40 @@
import org.mozilla.geckoview.GeckoResult;
import org.mozilla.geckoview.GeckoSession;
import org.mozilla.geckoview.SlowScriptResponse;
import org.mozilla.vrbrowser.AppExecutors;
import org.mozilla.vrbrowser.R;
import org.mozilla.vrbrowser.VRBrowserApplication;
import org.mozilla.vrbrowser.browser.engine.Session;
import org.mozilla.vrbrowser.browser.engine.SessionState;
import org.mozilla.vrbrowser.db.SitePermission;
import org.mozilla.vrbrowser.ui.viewmodel.SitePermissionViewModel;
import org.mozilla.vrbrowser.ui.widgets.UIWidget;
import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement;
import org.mozilla.vrbrowser.ui.widgets.WindowWidget;
import org.mozilla.vrbrowser.ui.widgets.dialogs.PopUpBlockDialogWidget;
import org.mozilla.vrbrowser.ui.widgets.dialogs.QuickPermissionWidget;
import org.mozilla.vrbrowser.ui.widgets.prompts.AlertPromptWidget;
import org.mozilla.vrbrowser.ui.widgets.prompts.AuthPromptWidget;
import org.mozilla.vrbrowser.ui.widgets.prompts.ChoicePromptWidget;
import org.mozilla.vrbrowser.ui.widgets.prompts.ConfirmPromptWidget;
import org.mozilla.vrbrowser.ui.widgets.prompts.PromptWidget;
import org.mozilla.vrbrowser.ui.widgets.prompts.TextPromptWidget;
import org.mozilla.vrbrowser.utils.UrlUtils;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

public class PromptDelegate implements
GeckoSession.PromptDelegate,
WindowWidget.WindowListener,
GeckoSession.NavigationDelegate,
GeckoSession.ContentDelegate {

public interface PopUpDelegate {
void onPopUpAvailable();
void onPopUpsCleared();
}

private PromptWidget mPrompt;
private PopUpBlockDialogWidget mPopUpPrompt;
private ConfirmPromptWidget mSlowScriptPrompt;
private Context mContext;
private WindowWidget mAttachedWindow;
private List<SitePermission> mAllowedPopUpSites;
private SitePermissionViewModel mViewModel;
private AppExecutors mExecutors;
private PopUpDelegate mPopupDelegate;

public PromptDelegate(@NonNull Context context) {
mContext = context;
mExecutors = ((VRBrowserApplication)context.getApplicationContext()).getExecutors();
mViewModel = new SitePermissionViewModel(((Application)context.getApplicationContext()));
mAllowedPopUpSites = new ArrayList<>();
}
Expand Down Expand Up @@ -89,8 +74,6 @@ public void detachFromWindow() {
mAttachedWindow = null;
}
mViewModel.getAll(SitePermission.SITE_PERMISSION_POPUP).removeObserver(mPopUpSiteObserver);

clearPopUps();
}

private Session getSession() {
Expand All @@ -110,19 +93,6 @@ private void cleanSession(@NonNull Session aSession) {
aSession.setPromptDelegate(null);
aSession.removeNavigationListener(this);
aSession.removeContentListener(this);
mPopUpRequests.remove(aSession.hashCode());
}

public void setPopupDelegate(@Nullable PopUpDelegate delegate) {
mPopupDelegate = delegate;
}

public void clearPopUps() {
mPopUpRequests.clear();

if (mPopupDelegate != null) {
mPopupDelegate.onPopUpsCleared();
}
}

@Nullable
Expand Down Expand Up @@ -276,136 +246,31 @@ public GeckoResult<PromptResponse> onPopupPrompt(@NonNull GeckoSession geckoSess
result.complete(popupPrompt.confirm(AllowOrDeny.ALLOW));

} else {
final int sessionId = geckoSession.hashCode();
final String uri = mAttachedWindow.getSession().getCurrentUri();

Optional<SitePermission> site = mAllowedPopUpSites.stream().filter((item) -> item.url.equals(uri)).findFirst();
if (site.isPresent()) {
mAttachedWindow.postDelayed(() -> {
if (site.get().allowed) {
Session session = mAttachedWindow.getSession();
if (session != null) {
final String uri = UrlUtils.getHost(session.getCurrentUri());
SitePermission site = mAllowedPopUpSites.stream().filter((item) -> item.url.equals(uri)).findFirst().orElse(null);
if (site != null) {
mAttachedWindow.postDelayed(() -> {
result.complete(popupPrompt.confirm(AllowOrDeny.ALLOW));
session.setPopUpState(SessionState.POPUP_ALLOWED);
}, 500);

} else {
result.complete(popupPrompt.dismiss());
}
}, 500);

} else {
PopUpRequest request = PopUpRequest.newRequest(popupPrompt, result, sessionId);
Pair<String, LinkedList<PopUpRequest>> domainRequestList = mPopUpRequests.get(sessionId);
if (domainRequestList == null) {
LinkedList<PopUpRequest> requestList = new LinkedList<>();
domainRequestList = new Pair<>(uri, requestList);
mPopUpRequests.put(sessionId, domainRequestList);
} else {
mAttachedWindow.postDelayed(() -> {
result.complete(popupPrompt.confirm(AllowOrDeny.DENY));
session.setPopUpState(SessionState.POPUP_BLOCKED);
}, 500);
}
domainRequestList.second.add(request);

if (mPopupDelegate != null) {
mPopupDelegate.onPopUpAvailable();
}
} else {
result.complete(popupPrompt.confirm(AllowOrDeny.DENY));
}
}

return result;
}

static class PopUpRequest {

public static PopUpRequest newRequest(@NonNull PopupPrompt prompt, @NonNull GeckoResult<PromptResponse> response, int sessionId) {
PopUpRequest request = new PopUpRequest();
request.prompt = prompt;
request.response = response;
request.sessionId = sessionId;

return request;
}

PopupPrompt prompt;
GeckoResult<PromptResponse> response;
int sessionId;
}

private SparseArray<Pair<String, LinkedList<PopUpRequest>>> mPopUpRequests = new SparseArray<>();

public void showPopUps(GeckoSession session) {
if (session == null) {
return;
}
Pair<String, LinkedList<PopUpRequest>> requests = mPopUpRequests.get(session.hashCode());
if (requests != null && !requests.second.isEmpty()) {
showPopUp(session.hashCode(), requests);
}
}

public boolean hasPendingPopUps(GeckoSession session) {
if (session != null) {
Pair<String, LinkedList<PopUpRequest>> requests = mPopUpRequests.get(session.hashCode());
if (requests != null) {
return !requests.second.isEmpty();
}
}

return false;
}

private void showPopUp(int sessionId, @NonNull Pair<String, LinkedList<PopUpRequest>> requests) {
String uri = requests.first;
Optional<SitePermission> site = mAllowedPopUpSites.stream().filter((item) -> item.url.equals(uri)).findFirst();
if (!site.isPresent()) {
mPopUpPrompt = new PopUpBlockDialogWidget(mContext);
mPopUpPrompt.setButtonsDelegate(index -> {
boolean allowed = index != PopUpBlockDialogWidget.NEGATIVE;
boolean askAgain = mPopUpPrompt.askAgain();
if (allowed && !askAgain) {
SitePermission permission = new SitePermission(uri, uri, allowed, SitePermission.SITE_PERMISSION_POPUP);
mAllowedPopUpSites.add(permission);
mViewModel.insertSite(permission);
}

if (allowed) {
requests.second.forEach((request) -> {
request.response.complete(request.prompt.confirm(AllowOrDeny.ALLOW));
});

mPopUpRequests.remove(sessionId);

mExecutors.mainThread().execute(() -> {
if (mPopupDelegate != null) {
mPopupDelegate.onPopUpsCleared();
}
});

} else {
mExecutors.mainThread().execute(() -> {
if (mPopupDelegate != null) {
mPopupDelegate.onPopUpAvailable();
}
});
}

mPopUpPrompt.hide(UIWidget.REMOVE_WIDGET);
mPopUpPrompt.releaseWidget();
mPopUpPrompt = null;
});
mPopUpPrompt.setDelegate(() -> mExecutors.mainThread().execute(() -> {
if (mPopupDelegate != null) {
mPopupDelegate.onPopUpAvailable();
}
}));
mPopUpPrompt.show(UIWidget.REQUEST_FOCUS);

} else {
requests.second.forEach((request) -> {
if (site.get().allowed) {
request.response.complete(request.prompt.confirm(AllowOrDeny.ALLOW));

} else {
request.response.complete(request.prompt.dismiss());
}
});
}
}

@Nullable
@Override
public GeckoResult<SlowScriptResponse> onSlowScript(@NonNull GeckoSession aSession, @NonNull String aScriptFileName) {
Expand Down Expand Up @@ -450,11 +315,4 @@ public void onSessionChanged(@NonNull Session aOldSession, @NonNull Session aSes
cleanSession(aOldSession);
setUpSession(aSession);
}

// NavigationDelegate

@Override
public void onLocationChange(@NonNull GeckoSession geckoSession, @Nullable String s) {
clearPopUps();
}
}

0 comments on commit ec3b681

Please sign in to comment.