Give user access to the URL that is attempting to be openExternal'ed
This commit is contained in:
parent
39ec40b901
commit
98e9311669
6 changed files with 83 additions and 11 deletions
|
@ -97,11 +97,28 @@ int AtomPermissionManager::RequestPermission(
|
||||||
const GURL& requesting_origin,
|
const GURL& requesting_origin,
|
||||||
bool user_gesture,
|
bool user_gesture,
|
||||||
const StatusCallback& response_callback) {
|
const StatusCallback& response_callback) {
|
||||||
return RequestPermissions(
|
return RequestPermissionWithDetails(
|
||||||
|
permission,
|
||||||
|
render_frame_host,
|
||||||
|
requesting_origin,
|
||||||
|
user_gesture,
|
||||||
|
nullptr,
|
||||||
|
response_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
int AtomPermissionManager::RequestPermissionWithDetails(
|
||||||
|
content::PermissionType permission,
|
||||||
|
content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& requesting_origin,
|
||||||
|
bool user_gesture,
|
||||||
|
const base::DictionaryValue* details,
|
||||||
|
const StatusCallback& response_callback) {
|
||||||
|
return RequestPermissionsWithDetails(
|
||||||
std::vector<content::PermissionType>(1, permission),
|
std::vector<content::PermissionType>(1, permission),
|
||||||
render_frame_host,
|
render_frame_host,
|
||||||
requesting_origin,
|
requesting_origin,
|
||||||
user_gesture,
|
user_gesture,
|
||||||
|
details,
|
||||||
base::Bind(&PermissionRequestResponseCallbackWrapper, response_callback));
|
base::Bind(&PermissionRequestResponseCallbackWrapper, response_callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,6 +128,18 @@ int AtomPermissionManager::RequestPermissions(
|
||||||
const GURL& requesting_origin,
|
const GURL& requesting_origin,
|
||||||
bool user_gesture,
|
bool user_gesture,
|
||||||
const StatusesCallback& response_callback) {
|
const StatusesCallback& response_callback) {
|
||||||
|
return RequestPermissionsWithDetails(
|
||||||
|
permissions, render_frame_host, requesting_origin,
|
||||||
|
user_gesture, nullptr, response_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
int AtomPermissionManager::RequestPermissionsWithDetails(
|
||||||
|
const std::vector<content::PermissionType>& permissions,
|
||||||
|
content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& requesting_origin,
|
||||||
|
bool user_gesture,
|
||||||
|
const base::DictionaryValue* details,
|
||||||
|
const StatusesCallback& response_callback) {
|
||||||
if (permissions.empty()) {
|
if (permissions.empty()) {
|
||||||
response_callback.Run(std::vector<blink::mojom::PermissionStatus>());
|
response_callback.Run(std::vector<blink::mojom::PermissionStatus>());
|
||||||
return kNoPendingOperation;
|
return kNoPendingOperation;
|
||||||
|
@ -143,7 +172,11 @@ int AtomPermissionManager::RequestPermissions(
|
||||||
const auto callback =
|
const auto callback =
|
||||||
base::Bind(&AtomPermissionManager::OnPermissionResponse,
|
base::Bind(&AtomPermissionManager::OnPermissionResponse,
|
||||||
base::Unretained(this), request_id, i);
|
base::Unretained(this), request_id, i);
|
||||||
request_handler_.Run(web_contents, permission, callback);
|
if (details == nullptr) {
|
||||||
|
request_handler_.Run(web_contents, permission, callback, base::DictionaryValue());
|
||||||
|
} else {
|
||||||
|
request_handler_.Run(web_contents, permission, callback, *details);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return request_id;
|
return request_id;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include "base/callback.h"
|
#include "base/callback.h"
|
||||||
#include "base/id_map.h"
|
#include "base/id_map.h"
|
||||||
|
#include "base/values.h"
|
||||||
#include "content/public/browser/permission_manager.h"
|
#include "content/public/browser/permission_manager.h"
|
||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
|
@ -30,7 +31,8 @@ class AtomPermissionManager : public content::PermissionManager {
|
||||||
using RequestHandler =
|
using RequestHandler =
|
||||||
base::Callback<void(content::WebContents*,
|
base::Callback<void(content::WebContents*,
|
||||||
content::PermissionType,
|
content::PermissionType,
|
||||||
const StatusCallback&)>;
|
const StatusCallback&,
|
||||||
|
const base::DictionaryValue&)>;
|
||||||
|
|
||||||
// Handler to dispatch permission requests in JS.
|
// Handler to dispatch permission requests in JS.
|
||||||
void SetPermissionRequestHandler(const RequestHandler& handler);
|
void SetPermissionRequestHandler(const RequestHandler& handler);
|
||||||
|
@ -43,6 +45,13 @@ class AtomPermissionManager : public content::PermissionManager {
|
||||||
bool user_gesture,
|
bool user_gesture,
|
||||||
const base::Callback<void(blink::mojom::PermissionStatus)>& callback)
|
const base::Callback<void(blink::mojom::PermissionStatus)>& callback)
|
||||||
override;
|
override;
|
||||||
|
int RequestPermissionWithDetails(
|
||||||
|
content::PermissionType permission,
|
||||||
|
content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& requesting_origin,
|
||||||
|
bool user_gesture,
|
||||||
|
const base::DictionaryValue* details,
|
||||||
|
const base::Callback<void(blink::mojom::PermissionStatus)>& callback);
|
||||||
int RequestPermissions(
|
int RequestPermissions(
|
||||||
const std::vector<content::PermissionType>& permissions,
|
const std::vector<content::PermissionType>& permissions,
|
||||||
content::RenderFrameHost* render_frame_host,
|
content::RenderFrameHost* render_frame_host,
|
||||||
|
@ -51,6 +60,14 @@ class AtomPermissionManager : public content::PermissionManager {
|
||||||
const base::Callback<void(
|
const base::Callback<void(
|
||||||
const std::vector<blink::mojom::PermissionStatus>&)>& callback)
|
const std::vector<blink::mojom::PermissionStatus>&)>& callback)
|
||||||
override;
|
override;
|
||||||
|
int RequestPermissionsWithDetails(
|
||||||
|
const std::vector<content::PermissionType>& permissions,
|
||||||
|
content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& requesting_origin,
|
||||||
|
bool user_gesture,
|
||||||
|
const base::DictionaryValue* details,
|
||||||
|
const base::Callback<void(
|
||||||
|
const std::vector<blink::mojom::PermissionStatus>&)>& callback);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void OnPermissionResponse(int request_id,
|
void OnPermissionResponse(int request_id,
|
||||||
|
|
|
@ -61,7 +61,7 @@ void HandleExternalProtocolInUI(
|
||||||
|
|
||||||
GURL escaped_url(net::EscapeExternalHandlerValue(url.spec()));
|
GURL escaped_url(net::EscapeExternalHandlerValue(url.spec()));
|
||||||
auto callback = base::Bind(&OnOpenExternal, escaped_url);
|
auto callback = base::Bind(&OnOpenExternal, escaped_url);
|
||||||
permission_helper->RequestOpenExternalPermission(callback, has_user_gesture);
|
permission_helper->RequestOpenExternalPermission(callback, has_user_gesture, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnPdfResourceIntercepted(
|
void OnPdfResourceIntercepted(
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "atom/browser/atom_permission_manager.h"
|
#include "atom/browser/atom_permission_manager.h"
|
||||||
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
#include "brightray/browser/media/media_stream_devices_controller.h"
|
#include "brightray/browser/media/media_stream_devices_controller.h"
|
||||||
#include "content/public/browser/browser_context.h"
|
#include "content/public/browser/browser_context.h"
|
||||||
#include "content/public/browser/render_process_host.h"
|
#include "content/public/browser/render_process_host.h"
|
||||||
|
@ -55,13 +56,21 @@ void WebContentsPermissionHelper::RequestPermission(
|
||||||
content::PermissionType permission,
|
content::PermissionType permission,
|
||||||
const base::Callback<void(bool)>& callback,
|
const base::Callback<void(bool)>& callback,
|
||||||
bool user_gesture) {
|
bool user_gesture) {
|
||||||
|
RequestPermissionWithDetails(permission, callback, user_gesture, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebContentsPermissionHelper::RequestPermissionWithDetails(
|
||||||
|
content::PermissionType permission,
|
||||||
|
const base::Callback<void(bool)>& callback,
|
||||||
|
bool user_gesture,
|
||||||
|
const base::DictionaryValue* details) {
|
||||||
auto rfh = web_contents_->GetMainFrame();
|
auto rfh = web_contents_->GetMainFrame();
|
||||||
auto permission_manager = static_cast<AtomPermissionManager*>(
|
auto permission_manager = static_cast<AtomPermissionManager*>(
|
||||||
web_contents_->GetBrowserContext()->GetPermissionManager());
|
web_contents_->GetBrowserContext()->GetPermissionManager());
|
||||||
auto origin = web_contents_->GetLastCommittedURL();
|
auto origin = web_contents_->GetLastCommittedURL();
|
||||||
permission_manager->RequestPermission(
|
permission_manager->RequestPermissionWithDetails(
|
||||||
permission, rfh, origin, false,
|
permission, rfh, origin, false, details,
|
||||||
base::Bind(&OnPermissionResponse, callback));
|
base::Bind(&OnPermissionResponse, callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContentsPermissionHelper::RequestFullscreenPermission(
|
void WebContentsPermissionHelper::RequestFullscreenPermission(
|
||||||
|
@ -94,10 +103,14 @@ void WebContentsPermissionHelper::RequestPointerLockPermission(
|
||||||
|
|
||||||
void WebContentsPermissionHelper::RequestOpenExternalPermission(
|
void WebContentsPermissionHelper::RequestOpenExternalPermission(
|
||||||
const base::Callback<void(bool)>& callback,
|
const base::Callback<void(bool)>& callback,
|
||||||
bool user_gesture) {
|
bool user_gesture,
|
||||||
RequestPermission(
|
const GURL& url) {
|
||||||
|
base::DictionaryValue details;
|
||||||
|
details.SetString("scheme", url.scheme());
|
||||||
|
details.SetString("url", url.spec());
|
||||||
|
RequestPermissionWithDetails(
|
||||||
static_cast<content::PermissionType>(PermissionType::OPEN_EXTERNAL),
|
static_cast<content::PermissionType>(PermissionType::OPEN_EXTERNAL),
|
||||||
callback, user_gesture);
|
callback, user_gesture, &details);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|
|
@ -33,7 +33,8 @@ class WebContentsPermissionHelper
|
||||||
void RequestPointerLockPermission(bool user_gesture);
|
void RequestPointerLockPermission(bool user_gesture);
|
||||||
void RequestOpenExternalPermission(
|
void RequestOpenExternalPermission(
|
||||||
const base::Callback<void(bool)>& callback,
|
const base::Callback<void(bool)>& callback,
|
||||||
bool user_gesture);
|
bool user_gesture,
|
||||||
|
const GURL& url);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit WebContentsPermissionHelper(content::WebContents* web_contents);
|
explicit WebContentsPermissionHelper(content::WebContents* web_contents);
|
||||||
|
@ -43,6 +44,11 @@ class WebContentsPermissionHelper
|
||||||
content::PermissionType permission,
|
content::PermissionType permission,
|
||||||
const base::Callback<void(bool)>& callback,
|
const base::Callback<void(bool)>& callback,
|
||||||
bool user_gesture = false);
|
bool user_gesture = false);
|
||||||
|
void RequestPermissionWithDetails(
|
||||||
|
content::PermissionType permission,
|
||||||
|
const base::Callback<void(bool)>& callback,
|
||||||
|
bool user_gesture,
|
||||||
|
const base::DictionaryValue* details);
|
||||||
|
|
||||||
content::WebContents* web_contents_;
|
content::WebContents* web_contents_;
|
||||||
|
|
||||||
|
|
|
@ -293,6 +293,9 @@ win.webContents.session.setCertificateVerifyProc((request, callback) => {
|
||||||
'pointerLock', 'fullscreen', 'openExternal'.
|
'pointerLock', 'fullscreen', 'openExternal'.
|
||||||
* `callback` Function
|
* `callback` Function
|
||||||
* `permissionGranted` Boolean - Allow or deny the permission.
|
* `permissionGranted` Boolean - Allow or deny the permission.
|
||||||
|
* `details` Object - Some properties are only available on certain permission types.
|
||||||
|
* `url` String - The url of the `openExternal` request.
|
||||||
|
* `scheme` String - The protocol scheme of the `openExternal` request.
|
||||||
|
|
||||||
Sets the handler which can be used to respond to permission requests for the `session`.
|
Sets the handler which can be used to respond to permission requests for the `session`.
|
||||||
Calling `callback(true)` will allow the permission and `callback(false)` will reject it.
|
Calling `callback(true)` will allow the permission and `callback(false)` will reject it.
|
||||||
|
|
Loading…
Reference in a new issue