// Copyright (c) 2016 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef SHELL_BROWSER_ELECTRON_PERMISSION_MANAGER_H_ #define SHELL_BROWSER_ELECTRON_PERMISSION_MANAGER_H_ #include #include #include "base/callback.h" #include "base/containers/id_map.h" #include "content/public/browser/permission_controller_delegate.h" #include "gin/dictionary.h" namespace base { class DictionaryValue; class Value; } // namespace base namespace content { class WebContents; } namespace electron { class ElectronPermissionManager : public content::PermissionControllerDelegate { public: ElectronPermissionManager(); ~ElectronPermissionManager() override; using StatusCallback = base::OnceCallback; using StatusesCallback = base::OnceCallback&)>; using RequestHandler = base::RepeatingCallback; using CheckHandler = base::RepeatingCallback; using DeviceCheckHandler = base::RepeatingCallback&)>; // Handler to dispatch permission requests in JS. void SetPermissionRequestHandler(const RequestHandler& handler); void SetPermissionCheckHandler(const CheckHandler& handler); void SetDevicePermissionHandler(const DeviceCheckHandler& handler); // content::PermissionControllerDelegate: void RequestPermission(content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, bool user_gesture, StatusCallback callback) override; void RequestPermissionWithDetails(content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, bool user_gesture, const base::DictionaryValue* details, StatusCallback callback); void RequestPermissions( const std::vector& permissions, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, bool user_gesture, StatusesCallback callback) override; void RequestPermissionsWithDetails( const std::vector& permissions, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, bool user_gesture, const base::DictionaryValue* details, StatusesCallback callback); blink::mojom::PermissionStatus GetPermissionStatusForFrame( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin) override; bool CheckPermissionWithDetails(content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, const base::DictionaryValue* details) const; bool CheckDevicePermission(content::PermissionType permission, const url::Origin& origin, const base::Value* object, content::RenderFrameHost* render_frame_host) const; void GrantDevicePermission(content::PermissionType permission, const url::Origin& origin, const base::Value* object, content::RenderFrameHost* render_frame_host) const; protected: void OnPermissionResponse(int request_id, int permission_id, blink::mojom::PermissionStatus status); // content::PermissionControllerDelegate: void ResetPermission(content::PermissionType permission, const GURL& requesting_origin, const GURL& embedding_origin) override; blink::mojom::PermissionStatus GetPermissionStatus( content::PermissionType permission, const GURL& requesting_origin, const GURL& embedding_origin) override; SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback callback) override; void UnsubscribePermissionStatusChange(SubscriptionId id) override; private: class PendingRequest; using PendingRequestsMap = base::IDMap>; RequestHandler request_handler_; CheckHandler check_handler_; DeviceCheckHandler device_permission_handler_; PendingRequestsMap pending_requests_; DISALLOW_COPY_AND_ASSIGN(ElectronPermissionManager); }; } // namespace electron #endif // SHELL_BROWSER_ELECTRON_PERMISSION_MANAGER_H_