Upstream version 10.39.233.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / core_internal / src / org / xwalk / core / internal / XWalkDevToolsServer.java
index 9947f27..cd33954 100644 (file)
@@ -5,17 +5,33 @@
 package org.xwalk.core.internal;
 
 import org.chromium.base.JNINamespace;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import org.chromium.base.CalledByNative;
 
 /**
  * Controller for Remote Web Debugging (Developer Tools).
  */
 @JNINamespace("xwalk")
 class XWalkDevToolsServer {
+    private static final String DEBUG_PERMISSION_SIFFIX = ".permission.DEBUG";
 
     private long mNativeDevToolsServer = 0;
+    private String mSocketName = null;
+
+    // Defines what processes may access to the socket.
+    public enum Security {
+        // Use content::CanUserConnectToDevTools to authorize access to the socket.
+        DEFAULT,
+
+        // In addition to default authorization allows access to an app with android permission
+        // named chromeAppPackageName + DEBUG_PERMISSION_SUFFIX.
+        ALLOW_DEBUG_PERMISSION,
+    }
 
     public XWalkDevToolsServer(String socketName) {
         mNativeDevToolsServer = nativeInitRemoteDebugging(socketName);
+        mSocketName = socketName;
     }
 
     public void destroy() {
@@ -27,17 +43,34 @@ class XWalkDevToolsServer {
         return nativeIsRemoteDebuggingEnabled(mNativeDevToolsServer);
     }
 
+    public void setRemoteDebuggingEnabled(boolean enabled, Security security) {
+        boolean allowDebugPermission = security == Security.ALLOW_DEBUG_PERMISSION;
+        nativeSetRemoteDebuggingEnabled(mNativeDevToolsServer, enabled, allowDebugPermission);
+    }
+
     public void setRemoteDebuggingEnabled(boolean enabled) {
-        nativeSetRemoteDebuggingEnabled(mNativeDevToolsServer, enabled);
+        setRemoteDebuggingEnabled(enabled, Security.DEFAULT);
     }
 
     public void allowConnectionFromUid(int uid) {
         nativeAllowConnectionFromUid(mNativeDevToolsServer, uid);
     }
 
+    public String getSocketName() {
+        return mSocketName;
+    }
+
     private native long nativeInitRemoteDebugging(String socketName);
     private native void nativeDestroyRemoteDebugging(long devToolsServer);
     private native boolean nativeIsRemoteDebuggingEnabled(long devToolsServer);
-    private native void nativeSetRemoteDebuggingEnabled(long devToolsServer, boolean enabled);
+    private native void nativeSetRemoteDebuggingEnabled(
+            long devToolsServer, boolean enabled, boolean allowDebugPermission);
     private native void nativeAllowConnectionFromUid(long devToolsServer, int uid);
+
+    @CalledByNative
+    private static boolean checkDebugPermission(Context context, int pid, int uid) {
+        String debugPermissionName = context.getPackageName() + DEBUG_PERMISSION_SIFFIX;
+        return context.checkPermission(debugPermissionName, pid, uid)
+                == PackageManager.PERMISSION_GRANTED;
+    }
 }