Commit 0fddf11f authored by lalitm's avatar lalitm Committed by Commit bot

content: permissions: add plumbing to revoke permissions

Add plumbing code in content layer to allow revocation of permissions.

NOTE: this is a part of a three sided patch:
https://codereview.chromium.org/1234023002
https://codereview.chromium.org/1238673002 (this)
https://codereview.chromium.org/1241133002

BUG=510405

Review URL: https://codereview.chromium.org/1238673002

Cr-Commit-Position: refs/heads/master@{#339715}
parent 6bda7c88
...@@ -75,13 +75,13 @@ bool PermissionDispatcher::IsObservable(blink::WebPermissionType type) { ...@@ -75,13 +75,13 @@ bool PermissionDispatcher::IsObservable(blink::WebPermissionType type) {
} }
PermissionDispatcher::CallbackInformation::CallbackInformation( PermissionDispatcher::CallbackInformation::CallbackInformation(
blink::WebPermissionQueryCallback* callback, blink::WebPermissionCallback* callback,
int worker_thread_id) int worker_thread_id)
: callback_(callback), : callback_(callback),
worker_thread_id_(worker_thread_id) { worker_thread_id_(worker_thread_id) {
} }
blink::WebPermissionQueryCallback* blink::WebPermissionCallback*
PermissionDispatcher::CallbackInformation::callback() const { PermissionDispatcher::CallbackInformation::callback() const {
return callback_.get(); return callback_.get();
} }
...@@ -90,7 +90,7 @@ int PermissionDispatcher::CallbackInformation::worker_thread_id() const { ...@@ -90,7 +90,7 @@ int PermissionDispatcher::CallbackInformation::worker_thread_id() const {
return worker_thread_id_; return worker_thread_id_;
} }
blink::WebPermissionQueryCallback* blink::WebPermissionCallback*
PermissionDispatcher::CallbackInformation::ReleaseCallback() { PermissionDispatcher::CallbackInformation::ReleaseCallback() {
return callback_.release(); return callback_.release();
} }
...@@ -108,11 +108,19 @@ PermissionDispatcher::~PermissionDispatcher() { ...@@ -108,11 +108,19 @@ PermissionDispatcher::~PermissionDispatcher() {
void PermissionDispatcher::queryPermission( void PermissionDispatcher::queryPermission(
blink::WebPermissionType type, blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
blink::WebPermissionQueryCallback* callback) { blink::WebPermissionCallback* callback) {
QueryPermissionInternal( QueryPermissionInternal(
type, origin.string().utf8(), callback, kNoWorkerThread); type, origin.string().utf8(), callback, kNoWorkerThread);
} }
void PermissionDispatcher::revokePermission(
blink::WebPermissionType type,
const blink::WebURL& origin,
blink::WebPermissionCallback* callback) {
RevokePermissionInternal(
type, origin.string().utf8(), callback, kNoWorkerThread);
}
void PermissionDispatcher::startListening( void PermissionDispatcher::startListening(
blink::WebPermissionType type, blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
...@@ -141,11 +149,19 @@ void PermissionDispatcher::stopListening(WebPermissionObserver* observer) { ...@@ -141,11 +149,19 @@ void PermissionDispatcher::stopListening(WebPermissionObserver* observer) {
void PermissionDispatcher::QueryPermissionForWorker( void PermissionDispatcher::QueryPermissionForWorker(
blink::WebPermissionType type, blink::WebPermissionType type,
const std::string& origin, const std::string& origin,
blink::WebPermissionQueryCallback* callback, blink::WebPermissionCallback* callback,
int worker_thread_id) { int worker_thread_id) {
QueryPermissionInternal(type, origin, callback, worker_thread_id); QueryPermissionInternal(type, origin, callback, worker_thread_id);
} }
void PermissionDispatcher::RevokePermissionForWorker(
blink::WebPermissionType type,
const std::string& origin,
blink::WebPermissionCallback* callback,
int worker_thread_id) {
RevokePermissionInternal(type, origin, callback, worker_thread_id);
}
void PermissionDispatcher::StartListeningForWorker( void PermissionDispatcher::StartListeningForWorker(
blink::WebPermissionType type, blink::WebPermissionType type,
const std::string& origin, const std::string& origin,
...@@ -183,7 +199,7 @@ void PermissionDispatcher::GetNextPermissionChangeForWorker( ...@@ -183,7 +199,7 @@ void PermissionDispatcher::GetNextPermissionChangeForWorker(
// static // static
void PermissionDispatcher::RunCallbackOnWorkerThread( void PermissionDispatcher::RunCallbackOnWorkerThread(
blink::WebPermissionQueryCallback* callback, blink::WebPermissionCallback* callback,
scoped_ptr<blink::WebPermissionStatus> status) { scoped_ptr<blink::WebPermissionStatus> status) {
callback->onSuccess(status.release()); callback->onSuccess(status.release());
delete callback; delete callback;
...@@ -200,7 +216,7 @@ PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { ...@@ -200,7 +216,7 @@ PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() {
void PermissionDispatcher::QueryPermissionInternal( void PermissionDispatcher::QueryPermissionInternal(
blink::WebPermissionType type, blink::WebPermissionType type,
const std::string& origin, const std::string& origin,
blink::WebPermissionQueryCallback* callback, blink::WebPermissionCallback* callback,
int worker_thread_id) { int worker_thread_id) {
// We need to save the |callback| in an IDMap so if |this| gets deleted, the // We need to save the |callback| in an IDMap so if |this| gets deleted, the
// callback will not leak. In the case of |this| gets deleted, the // callback will not leak. In the case of |this| gets deleted, the
...@@ -211,13 +227,32 @@ void PermissionDispatcher::QueryPermissionInternal( ...@@ -211,13 +227,32 @@ void PermissionDispatcher::QueryPermissionInternal(
GetPermissionServicePtr()->HasPermission( GetPermissionServicePtr()->HasPermission(
GetPermissionName(type), GetPermissionName(type),
origin, origin,
base::Bind(&PermissionDispatcher::OnQueryPermission, base::Bind(&PermissionDispatcher::OnPermissionResponse,
base::Unretained(this),
request_id));
}
void PermissionDispatcher::RevokePermissionInternal(
blink::WebPermissionType type,
const std::string& origin,
blink::WebPermissionCallback* callback,
int worker_thread_id) {
// We need to save the |callback| in an IDMap so if |this| gets deleted, the
// callback will not leak. In the case of |this| gets deleted, the
// |permission_service_| pipe will be destroyed too so OnQueryPermission will
// not be called.
int request_id = pending_callbacks_.Add(
new CallbackInformation(callback, worker_thread_id));
GetPermissionServicePtr()->RevokePermission(
GetPermissionName(type),
origin,
base::Bind(&PermissionDispatcher::OnPermissionResponse,
base::Unretained(this), base::Unretained(this),
request_id)); request_id));
} }
void PermissionDispatcher::OnQueryPermission(int request_id, void PermissionDispatcher::OnPermissionResponse(int request_id,
PermissionStatus result) { PermissionStatus result) {
CallbackInformation* callback_information = CallbackInformation* callback_information =
pending_callbacks_.Lookup(request_id); pending_callbacks_.Lookup(request_id);
DCHECK(callback_information && callback_information->callback()); DCHECK(callback_information && callback_information->callback());
...@@ -225,7 +260,7 @@ void PermissionDispatcher::OnQueryPermission(int request_id, ...@@ -225,7 +260,7 @@ void PermissionDispatcher::OnQueryPermission(int request_id,
new blink::WebPermissionStatus(GetWebPermissionStatus(result))); new blink::WebPermissionStatus(GetWebPermissionStatus(result)));
if (callback_information->worker_thread_id() != kNoWorkerThread) { if (callback_information->worker_thread_id() != kNoWorkerThread) {
blink::WebPermissionQueryCallback* callback = blink::WebPermissionCallback* callback =
callback_information->ReleaseCallback(); callback_information->ReleaseCallback();
int worker_thread_id = callback_information->worker_thread_id(); int worker_thread_id = callback_information->worker_thread_id();
pending_callbacks_.Remove(request_id); pending_callbacks_.Remove(request_id);
......
...@@ -39,7 +39,10 @@ class PermissionDispatcher : public blink::WebPermissionClient, ...@@ -39,7 +39,10 @@ class PermissionDispatcher : public blink::WebPermissionClient,
// blink::WebPermissionClient implementation. // blink::WebPermissionClient implementation.
virtual void queryPermission(blink::WebPermissionType type, virtual void queryPermission(blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
blink::WebPermissionQueryCallback* callback); blink::WebPermissionCallback* callback);
virtual void revokePermission(blink::WebPermissionType,
const blink::WebURL& origin,
blink::WebPermissionCallback* callback);
virtual void startListening(blink::WebPermissionType type, virtual void startListening(blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
blink::WebPermissionObserver* observer); blink::WebPermissionObserver* observer);
...@@ -48,8 +51,12 @@ class PermissionDispatcher : public blink::WebPermissionClient, ...@@ -48,8 +51,12 @@ class PermissionDispatcher : public blink::WebPermissionClient,
// The following methods must be called by workers on the main thread. // The following methods must be called by workers on the main thread.
void QueryPermissionForWorker(blink::WebPermissionType type, void QueryPermissionForWorker(blink::WebPermissionType type,
const std::string& origin, const std::string& origin,
blink::WebPermissionQueryCallback* callback, blink::WebPermissionCallback* callback,
int worker_thread_id); int worker_thread_id);
void RevokePermissionForWorker(blink::WebPermissionType type,
const std::string& origin,
blink::WebPermissionCallback* callback,
int worker_thread_id);
void StartListeningForWorker( void StartListeningForWorker(
blink::WebPermissionType type, blink::WebPermissionType type,
const std::string& origin, const std::string& origin,
...@@ -66,7 +73,7 @@ class PermissionDispatcher : public blink::WebPermissionClient, ...@@ -66,7 +73,7 @@ class PermissionDispatcher : public blink::WebPermissionClient,
// Runs the given |callback| with |status| as a parameter. It has to be run // Runs the given |callback| with |status| as a parameter. It has to be run
// on a worker thread. // on a worker thread.
static void RunCallbackOnWorkerThread( static void RunCallbackOnWorkerThread(
blink::WebPermissionQueryCallback* callback, blink::WebPermissionCallback* callback,
scoped_ptr<blink::WebPermissionStatus> status); scoped_ptr<blink::WebPermissionStatus> status);
// Helper method that returns an initialized PermissionServicePtr. // Helper method that returns an initialized PermissionServicePtr.
...@@ -74,10 +81,16 @@ class PermissionDispatcher : public blink::WebPermissionClient, ...@@ -74,10 +81,16 @@ class PermissionDispatcher : public blink::WebPermissionClient,
void QueryPermissionInternal(blink::WebPermissionType type, void QueryPermissionInternal(blink::WebPermissionType type,
const std::string& origin, const std::string& origin,
blink::WebPermissionQueryCallback* callback, blink::WebPermissionCallback* callback,
int worker_thread_id); int worker_thread_id);
void RevokePermissionInternal(blink::WebPermissionType type,
const std::string& origin,
blink::WebPermissionCallback* callback,
int worker_thread_id);
void OnQueryPermission(int request_id, PermissionStatus status); // This is the callback function used for query and revoke
void OnPermissionResponse(int request_id,
PermissionStatus status);
void OnPermissionChanged(blink::WebPermissionType type, void OnPermissionChanged(blink::WebPermissionType type,
const std::string& origin, const std::string& origin,
blink::WebPermissionObserver* observer, blink::WebPermissionObserver* observer,
...@@ -96,17 +109,17 @@ class PermissionDispatcher : public blink::WebPermissionClient, ...@@ -96,17 +109,17 @@ class PermissionDispatcher : public blink::WebPermissionClient,
// it in the right thread. // it in the right thread.
class CallbackInformation { class CallbackInformation {
public: public:
CallbackInformation(blink::WebPermissionQueryCallback* callback, CallbackInformation(blink::WebPermissionCallback* callback,
int worker_thread_id); int worker_thread_id);
~CallbackInformation(); ~CallbackInformation();
blink::WebPermissionQueryCallback* callback() const; blink::WebPermissionCallback* callback() const;
int worker_thread_id() const; int worker_thread_id() const;
blink::WebPermissionQueryCallback* ReleaseCallback(); blink::WebPermissionCallback* ReleaseCallback();
private: private:
scoped_ptr<blink::WebPermissionQueryCallback> callback_; scoped_ptr<blink::WebPermissionCallback> callback_;
int worker_thread_id_; int worker_thread_id_;
DISALLOW_COPY_AND_ASSIGN(CallbackInformation); DISALLOW_COPY_AND_ASSIGN(CallbackInformation);
......
...@@ -57,7 +57,7 @@ PermissionDispatcherThreadProxy::~PermissionDispatcherThreadProxy() { ...@@ -57,7 +57,7 @@ PermissionDispatcherThreadProxy::~PermissionDispatcherThreadProxy() {
void PermissionDispatcherThreadProxy::queryPermission( void PermissionDispatcherThreadProxy::queryPermission(
blink::WebPermissionType type, blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
blink::WebPermissionQueryCallback* callback) { blink::WebPermissionCallback* callback) {
main_thread_task_runner_->PostTask( main_thread_task_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::Bind(&PermissionDispatcher::QueryPermissionForWorker, base::Bind(&PermissionDispatcher::QueryPermissionForWorker,
...@@ -68,6 +68,20 @@ void PermissionDispatcherThreadProxy::queryPermission( ...@@ -68,6 +68,20 @@ void PermissionDispatcherThreadProxy::queryPermission(
WorkerTaskRunner::Instance()->CurrentWorkerId())); WorkerTaskRunner::Instance()->CurrentWorkerId()));
} }
void PermissionDispatcherThreadProxy::revokePermission(
blink::WebPermissionType type,
const blink::WebURL& origin,
blink::WebPermissionCallback* callback) {
main_thread_task_runner_->PostTask(
FROM_HERE,
base::Bind(&PermissionDispatcher::RevokePermissionForWorker,
base::Unretained(permission_dispatcher_),
type,
origin.string().utf8(),
base::Unretained(callback),
WorkerTaskRunner::Instance()->CurrentWorkerId()));
}
void PermissionDispatcherThreadProxy::startListening( void PermissionDispatcherThreadProxy::startListening(
blink::WebPermissionType type, blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
......
...@@ -35,7 +35,10 @@ class PermissionDispatcherThreadProxy : ...@@ -35,7 +35,10 @@ class PermissionDispatcherThreadProxy :
// blink::WebPermissionClient implementation. // blink::WebPermissionClient implementation.
virtual void queryPermission(blink::WebPermissionType type, virtual void queryPermission(blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
blink::WebPermissionQueryCallback* callback); blink::WebPermissionCallback* callback);
virtual void revokePermission(blink::WebPermissionType type,
const blink::WebURL& origin,
blink::WebPermissionCallback* callback);
virtual void startListening(blink::WebPermissionType type, virtual void startListening(blink::WebPermissionType type,
const blink::WebURL& origin, const blink::WebURL& origin,
blink::WebPermissionObserver* observer); blink::WebPermissionObserver* observer);
......
...@@ -57919,6 +57919,28 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries. ...@@ -57919,6 +57919,28 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<int value="874" label="V8Document_CreateTouch_Method"/> <int value="874" label="V8Document_CreateTouch_Method"/>
<int value="875" label="V8HTMLFrameElement_GetSVGDocument_Method"/> <int value="875" label="V8HTMLFrameElement_GetSVGDocument_Method"/>
<int value="876" label="RequestFileSystemNonWebbyOrigin"/> <int value="876" label="RequestFileSystemNonWebbyOrigin"/>
<int value="877" label="V8Console_Memory_AttributeGetter"/>
<int value="878" label="V8Console_Memory_AttributeSetter"/>
<int value="879" label="V8MemoryInfo_TotalJSHeapSize_AttributeGetter"/>
<int value="880" label="V8MemoryInfo_UsedJSHeapSize_AttributeGetter"/>
<int value="881" label="V8MemoryInfo_JSHeapSizeLimit_AttributeGetter"/>
<int value="882" label="V8Performance_Timing_AttributeGetter"/>
<int value="883" label="V8Performance_Navigation_AttributeGetter"/>
<int value="884" label="V8Performance_Memory_AttributeGetter"/>
<int value="885" label="V8SharedWorker_WorkerStart_AttributeGetter"/>
<int value="886" label="HTMLKeygenElement"/>
<int value="887" label="V8SVGElement_OffsetParent_AttributeGetter"/>
<int value="888" label="V8SVGElement_OffsetTop_AttributeGetter"/>
<int value="889" label="V8SVGElement_OffsetLeft_AttributeGetter"/>
<int value="890" label="V8SVGElement_OffsetWidth_AttributeGetter"/>
<int value="891" label="V8SVGElement_OffsetHeight_AttributeGetter"/>
<int value="892" label="HTMLMediaElementPreloadNone"/>
<int value="893" label="HTMLMediaElementPreloadMetadata"/>
<int value="894" label="HTMLMediaElementPreloadAuto"/>
<int value="895" label="HTMLMediaElementPreloadDefault"/>
<int value="896" label="MixedContentBlockableAllowed"/>
<int value="897" label="PseudoBeforeAfterForInputElement"/>
<int value="898" label="V8Permissions_Revoke_Method"/>
</enum> </enum>
<enum name="FFmpegCodecs" type="int"> <enum name="FFmpegCodecs" type="int">
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment