Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 54 additions & 31 deletions java/org/cef/CefClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,8 @@
package org.cef;

import org.cef.browser.*;
import org.cef.callback.CefAuthCallback;
import org.cef.callback.CefBeforeDownloadCallback;
import org.cef.callback.CefCallback;
import org.cef.callback.CefContextMenuParams;
import org.cef.callback.CefDownloadItem;
import org.cef.callback.CefDownloadItemCallback;
import org.cef.callback.CefDragData;
import org.cef.callback.CefFileDialogCallback;
import org.cef.callback.CefJSDialogCallback;
import org.cef.callback.CefMenuModel;
import org.cef.callback.CefPrintDialogCallback;
import org.cef.callback.CefPrintJobCallback;
import org.cef.handler.CefClientHandler;
import org.cef.handler.CefContextMenuHandler;
import org.cef.handler.CefDialogHandler;
import org.cef.handler.CefDisplayHandler;
import org.cef.handler.CefDownloadHandler;
import org.cef.handler.CefDragHandler;
import org.cef.handler.CefFocusHandler;
import org.cef.handler.CefJSDialogHandler;
import org.cef.handler.CefKeyboardHandler;
import org.cef.handler.CefLifeSpanHandler;
import org.cef.handler.CefLoadHandler;
import org.cef.handler.CefPrintHandler;
import org.cef.handler.CefRenderHandler;
import org.cef.handler.CefRequestHandler;
import org.cef.handler.CefResourceHandler;
import org.cef.handler.CefResourceRequestHandler;
import org.cef.handler.CefScreenInfo;
import org.cef.handler.CefWindowHandler;
import org.cef.callback.*;
import org.cef.handler.*;
import org.cef.misc.BoolRef;
import org.cef.misc.CefPrintSettings;
import org.cef.misc.StringRef;
Expand All @@ -54,6 +26,7 @@
import java.beans.PropertyChangeListener;
import java.nio.ByteBuffer;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Vector;
import java.util.function.Consumer;
Expand All @@ -67,7 +40,7 @@ public class CefClient extends CefClientHandler
implements CefContextMenuHandler, CefDialogHandler, CefDisplayHandler, CefDownloadHandler,
CefDragHandler, CefFocusHandler, CefJSDialogHandler, CefKeyboardHandler,
CefLifeSpanHandler, CefLoadHandler, CefPrintHandler, CefRenderHandler,
CefRequestHandler, CefWindowHandler {
CefRequestHandler, CefWindowHandler, CefPermissionHandler {
private HashMap<Integer, CefBrowser> browser_ = new HashMap<Integer, CefBrowser>();
private CefContextMenuHandler contextMenuHandler_ = null;
private CefDialogHandler dialogHandler_ = null;
Expand All @@ -81,6 +54,7 @@ public class CefClient extends CefClientHandler
private CefLoadHandler loadHandler_ = null;
private CefPrintHandler printHandler_ = null;
private CefRequestHandler requestHandler_ = null;
private CefPermissionHandler permissionHandler_ = null;
private boolean isDisposed_ = false;
private volatile CefBrowser focusedBrowser_ = null;
private final PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
Expand Down Expand Up @@ -794,6 +768,55 @@ public void updateDragCursor(CefBrowser browser, int operation) {
if (realHandler != null) realHandler.updateDragCursor(browser, operation);
}

// CefPermissionHandler

@Override
protected CefPermissionHandler getPermissionHandler() {
return this;
}

public CefClient addPermissionHandler(CefPermissionHandler handler) {
if (permissionHandler_ == null) permissionHandler_ = handler;
return this;
}

public void removePermissionHandler() {
permissionHandler_ = null;
}

@Override
public boolean onRequestMediaAccessPermission(
CefBrowser browser,
CefFrame frame,
String requestingOrigin,
int requestedPermissions,
CefMediaAccessCallback callback) {
if (permissionHandler_ != null && browser != null) {
return permissionHandler_.onRequestMediaAccessPermission(rowser, frame, requestingOrigin, requestedPermissions, callback);
}
return false;
}

@Override
public boolean onShowPermissionPrompt(
CefBrowser browser,
long promptId,
String requestingOrigin,
EnumSet<CefPermissionRequestType> requestedPermissions,
CefPermissionPromptCallback callback) {
if (permissionHandler_ != null && browser != null) {
return permissionHandler_.onShowPermissionPrompt(browser, promptId, requestingOrigin, requestedPermissions, callback);
}
return false;
}

@Override
public void onDismissPermissionPrompt(CefBrowser browser, long promptId, CefPermissionRequestResult result) {
if (permissionHandler_ != null && browser != null) {
permissionHandler_.onDismissPermissionPrompt(browser, promptId, result);
}
}

// CefRequestHandler

public CefClient addRequestHandler(CefRequestHandler handler) {
Expand Down
6 changes: 6 additions & 0 deletions java/org/cef/callback/CefMediaAccessCallback.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.cef.callback;

public interface CefMediaAccessCallback {
void Continue(int allowedPermissions);
void Cancel();
}
32 changes: 32 additions & 0 deletions java/org/cef/callback/CefMediaAccessCallback_N.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.cef.callback;

class CefMediaAccessCallback_N extends CefNativeAdapter implements CefMediaAccessCallback {
CefMediaAccessCallback_N() {}

@Override
protected void finalize() throws Throwable {
Cancel();
super.finalize();
}

@Override
public void Continue(int allowedPermissions) {
try {
N_Continue(getNativeRef(null), allowedPermissions);
} catch (UnsatisfiedLinkError ule) {
ule.printStackTrace();
}
}

@Override
public void Cancel() {
try {
N_Cancel(getNativeRef(null));
} catch (UnsatisfiedLinkError ule) {
ule.printStackTrace();
}
}

private final native void N_Continue(long self, int allowedPermissions);
private final native void N_Cancel(long self);
}
7 changes: 7 additions & 0 deletions java/org/cef/callback/CefPermissionPromptCallback.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.cef.callback;

import org.cef.handler.CefPermissionRequestResult;

public interface CefPermissionPromptCallback {
void Continue(CefPermissionRequestResult result);
}
24 changes: 24 additions & 0 deletions java/org/cef/callback/CefPermissionPromptCallback_N.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.cef.callback;

import org.cef.handler.CefPermissionRequestResult;

class CefPermissionPromptCallback_N extends CefNativeAdapter implements CefPermissionPromptCallback {
CefPermissionPromptCallback_N() {}

@Override
protected void finalize() throws Throwable {
Continue(CefPermissionRequestResult.DISMISS);
super.finalize();
}

@Override
public void Continue(CefPermissionRequestResult result) {
try {
N_Continue(getNativeRef(null), result.getNativeValue());
} catch (UnsatisfiedLinkError ule) {
ule.printStackTrace();
}
}

private final native void N_Continue(long self, int result);
}
7 changes: 7 additions & 0 deletions java/org/cef/handler/CefClientHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,13 @@ protected void dispose() {
*/
abstract protected CefRequestHandler getRequestHandler();

/**
* Return the handler for permission requests.
* This method is a callback method and is called by
* the native code.
*/
abstract protected CefPermissionHandler getPermissionHandler();

/**
* Return the handler for windowed rendering events.
* This method is a callback method and is called by
Expand Down
28 changes: 28 additions & 0 deletions java/org/cef/handler/CefPermissionHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.cef.handler;

import java.util.EnumSet;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.callback.CefMediaAccessCallback;
import org.cef.callback.CefPermissionPromptCallback;

public interface CefPermissionHandler {
boolean onRequestMediaAccessPermission(
CefBrowser browser,
CefFrame frame,
String requestingOrigin,
int requestedPermissions,
CefMediaAccessCallback callback);

boolean onShowPermissionPrompt(
CefBrowser browser,
long promptId,
String requestingOrigin,
EnumSet<CefPermissionRequestType> requestedPermissions,
CefPermissionPromptCallback callback);

void onDismissPermissionPrompt(
CefBrowser browser,
long promptId,
CefPermissionRequestResult result);
}
107 changes: 107 additions & 0 deletions java/org/cef/handler/CefPermissionHandlerAdapter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package org.cef.handler;

import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Map;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.callback.CefMediaAccessCallback;
import org.cef.callback.CefPermissionPromptCallback;

public abstract class CefPermissionHandlerAdapter implements CefPermissionHandler {
private final Map<CefPermissionRequestType, Boolean> promptPolicy = new EnumMap<>(CefPermissionRequestType.class);

protected CefPermissionHandlerAdapter() {
for (CefPermissionRequestType type : CefPermissionRequestType.values()) {
promptPolicy.put(type, Boolean.FALSE);
}
promptPolicy.put(CefPermissionRequestType.NONE, Boolean.FALSE);
}

public CefPermissionHandlerAdapter setPermission(CefPermissionRequestType type, boolean allow) {
promptPolicy.put(type, allow);
return this;
}

public boolean isAllowed(CefPermissionRequestType type) {
return Boolean.TRUE.equals(promptPolicy.get(type));
}

protected CefPermissionRequestResult evaluatePrompt(
CefBrowser browser,
long promptId,
String requestingOrigin,
EnumSet<CefPermissionRequestType> requestedPermissions) {

for (CefPermissionRequestType type : requestedPermissions) {
switch (type) {
case AR_SESSION:
case CAMERA_PAN_TILT_ZOOM:
case CAMERA_STREAM:
case CAPTURED_SURFACE_CONTROL:
case CLIPBOARD:
case TOP_LEVEL_STORAGE_ACCESS:
case DISK_QUOTA:
case LOCAL_FONTS:
case GEOLOCATION:
case HAND_TRACKING:
case IDENTITY_PROVIDER:
case IDLE_DETECTION:
case MIC_STREAM:
case MIDI_SYSEX:
case MULTIPLE_DOWNLOADS:
case NOTIFICATIONS:
case KEYBOARD_LOCK:
case POINTER_LOCK:
case PROTECTED_MEDIA_IDENTIFIER:
case REGISTER_PROTOCOL_HANDLER:
case STORAGE_ACCESS:
case VR_SESSION:
case WEB_APP_INSTALLATION:
case WINDOW_MANAGEMENT:
case FILE_SYSTEM_ACCESS:
case LOCAL_NETWORK_ACCESS:
case LOCAL_NETWORK:
case LOOPBACK_NETWORK:
if (!isAllowed(type)) {
return CefPermissionRequestResult.DENY;
}
break;
case NONE:
default:
return CefPermissionRequestResult.IGNORE;
}
}

return CefPermissionRequestResult.ACCEPT;
}

@Override
public boolean onShowPermissionPrompt(
CefBrowser browser,
long promptId,
String requestingOrigin,
EnumSet<CefPermissionRequestType> requestedPermissions,
CefPermissionPromptCallback callback) {
callback.Continue(evaluatePrompt(browser, promptId, requestingOrigin, requestedPermissions));
return true;
}

@Override
public boolean onRequestMediaAccessPermission(
CefBrowser browser,
CefFrame frame,
String requestingOrigin,
int requestedPermissions,
CefMediaAccessCallback callback) {
callback.Continue(requestedPermissions);
return true;
}

@Override
public void onDismissPermissionPrompt(
CefBrowser browser,
long promptId,
CefPermissionRequestResult result) {
}
}
18 changes: 18 additions & 0 deletions java/org/cef/handler/CefPermissionRequestResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.cef.handler;

public enum CefPermissionRequestResult {
ACCEPT(0),
DENY(1),
DISMISS(2),
IGNORE(3);

private final int nativeValue;

CefPermissionRequestResult(int nativeValue) {
this.nativeValue = nativeValue;
}

public int getNativeValue() {
return nativeValue;
}
}
Loading