diff options
author | michaeln@google.com <michaeln@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-13 19:22:56 +0000 |
---|---|---|
committer | michaeln@google.com <michaeln@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-13 19:22:56 +0000 |
commit | 0167204bc9a6f6873af4b92c8f0969d5ae465088 (patch) | |
tree | 95e5e2d475da2c25152ebe31689fc8e1f74acf16 /chrome/plugin | |
parent | 89518924aa928807e7d5daf4d59fdb969cd19494 (diff) | |
download | chromium_src-0167204bc9a6f6873af4b92c8f0969d5ae465088.zip chromium_src-0167204bc9a6f6873af4b92c8f0969d5ae465088.tar.gz chromium_src-0167204bc9a6f6873af4b92c8f0969d5ae465088.tar.bz2 |
CPAPI gears drag drop and renderer IPC....
CPAPI (0.10) functions for gears drag drop; one to extract the
drag type/data given an NPObject *event, one to override the
drop effect (drag cursor).
Gears drag drop API receives a browser event as an NPObject* so
the event is untrusted. Provide IPC calls to the renderer so
gears can pass the event to renderer/V8 for checking, prior to
drag type/data extraction, or the setting of the drop effect.
V8 event checking is a TODO(noel), http://mondrian/10947778 for
the CPAPI (0.10) change submitted to gears.
BUG=7995
Original patch by Noel Gordon via:
http://codereview.chromium.org/99240
Review URL: http://codereview.chromium.org/115280
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15986 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/plugin')
-rw-r--r-- | chrome/plugin/chrome_plugin_host.cc | 37 | ||||
-rw-r--r-- | chrome/plugin/webplugin_proxy.cc | 52 | ||||
-rw-r--r-- | chrome/plugin/webplugin_proxy.h | 10 |
3 files changed, 99 insertions, 0 deletions
diff --git a/chrome/plugin/chrome_plugin_host.cc b/chrome/plugin/chrome_plugin_host.cc index 992afcf..4874e41 100644 --- a/chrome/plugin/chrome_plugin_host.cc +++ b/chrome/plugin/chrome_plugin_host.cc @@ -313,6 +313,41 @@ CPError STDCALL CPB_ShowHtmlDialog( return CPERR_FAILURE; } +CPError STDCALL CPB_GetDragData( + CPID id, CPBrowsingContext context, struct NPObject* event, bool add_data, + int32 *identity, int32 *event_id, char **drag_type, char **drag_data) { + CHECK(ChromePluginLib::IsPluginThread()); + + *identity = *event_id = 0; + WebPluginProxy* webplugin = WebPluginProxy::FromCPBrowsingContext(context); + if (!event || !webplugin) + return CPERR_INVALID_PARAMETER; + + std::string type_str, data_str; + if (!webplugin->GetDragData(event, add_data, + identity, event_id, &type_str, &data_str)) { + return CPERR_FAILURE; + } + + if (add_data) + *drag_data = CPB_StringDup(CPB_Alloc, data_str); + *drag_type = CPB_StringDup(CPB_Alloc, type_str); + return CPERR_SUCCESS; +} + +CPError STDCALL CPB_SetDropEffect( + CPID id, CPBrowsingContext context, struct NPObject* event, int effect) { + CHECK(ChromePluginLib::IsPluginThread()); + + WebPluginProxy* webplugin = WebPluginProxy::FromCPBrowsingContext(context); + if (!event || !webplugin) + return CPERR_INVALID_PARAMETER; + + if (webplugin->SetDropEffect(event, effect)) + return CPERR_SUCCESS; + return CPERR_FAILURE; +} + CPError STDCALL CPB_GetCommandLineArguments( CPID id, CPBrowsingContext context, const char* url, char** arguments) { CHECK(ChromePluginLib::IsPluginThread()); @@ -597,6 +632,8 @@ CPBrowserFuncs* GetCPBrowserFuncsForPlugin() { browser_funcs.send_sync_message = CPB_SendSyncMessage; browser_funcs.plugin_thread_async_call = CPB_PluginThreadAsyncCall; browser_funcs.open_file_dialog = CPB_OpenFileDialog; + browser_funcs.get_drag_data = CPB_GetDragData; + browser_funcs.set_drop_effect = CPB_SetDropEffect; browser_funcs.request_funcs = &request_funcs; browser_funcs.response_funcs = &response_funcs; diff --git a/chrome/plugin/webplugin_proxy.cc b/chrome/plugin/webplugin_proxy.cc index 38f3af6..6efff09 100644 --- a/chrome/plugin/webplugin_proxy.cc +++ b/chrome/plugin/webplugin_proxy.cc @@ -305,6 +305,58 @@ void WebPluginProxy::HandleURLRequest(const char *method, Send(new PluginHostMsg_URLRequest(route_id_, params)); } +bool WebPluginProxy::GetDragData(struct NPObject* event, bool add_data, + int32* identity, int32* event_id, + std::string* type, std::string* data) { + DCHECK(event); + NPObjectProxy* proxy = NPObjectProxy::GetProxy(event); + if (!proxy) // NPObject* event should have/be a renderer proxy. + return false; + + NPVariant_Param event_param; + event_param.type = NPVARIANT_PARAM_OBJECT_POINTER; + event_param.npobject_pointer = proxy->npobject_ptr(); + if (!event_param.npobject_pointer) + return false; + + std::vector<NPVariant_Param> values; + bool success = false; + Send(new PluginHostMsg_GetDragData(route_id_, event_param, add_data, + &values, &success)); + if (!success) + return false; + + DCHECK(values.size() == 4); + DCHECK(values[0].type == NPVARIANT_PARAM_INT); + *identity = static_cast<int32>(values[0].int_value); + DCHECK(values[1].type == NPVARIANT_PARAM_INT); + *event_id = static_cast<int32>(values[1].int_value); + DCHECK(values[2].type == NPVARIANT_PARAM_STRING); + type->swap(values[2].string_value); + if (add_data && (values[3].type == NPVARIANT_PARAM_STRING)) + data->swap(values[3].string_value); + + return true; +} + +bool WebPluginProxy::SetDropEffect(struct NPObject* event, int effect) { + DCHECK(event); + NPObjectProxy* proxy = NPObjectProxy::GetProxy(event); + if (!proxy) // NPObject* event should have/be a renderer proxy. + return false; + + NPVariant_Param event_param; + event_param.type = NPVARIANT_PARAM_OBJECT_POINTER; + event_param.npobject_pointer = proxy->npobject_ptr(); + if (!event_param.npobject_pointer) + return false; + + bool success = false; + Send(new PluginHostMsg_SetDropEffect(route_id_, event_param, effect, + &success)); + return success; +} + void WebPluginProxy::Paint(const gfx::Rect& rect) { #if defined(OS_WIN) if (!windowless_hdc_) diff --git a/chrome/plugin/webplugin_proxy.h b/chrome/plugin/webplugin_proxy.h index 2822fa8..e5594f0 100644 --- a/chrome/plugin/webplugin_proxy.h +++ b/chrome/plugin/webplugin_proxy.h @@ -5,6 +5,8 @@ #ifndef CHROME_PLUGIN_PLUGIN_WEBPLUGIN_PROXY_H__ #define CHROME_PLUGIN_PLUGIN_WEBPLUGIN_PROXY_H__ +#include <string> + #include "base/hash_tables.h" #include "base/ref_counted.h" #include "base/scoped_handle.h" @@ -55,6 +57,14 @@ class WebPluginProxy : public WebPlugin { void ShowModalHTMLDialog(const GURL& url, int width, int height, const std::string& json_arguments, std::string* json_retval); + + // Called by gears over the CPAPI interface to verify that the given event is + // the current (javascript) drag event the browser is dispatching, and return + // the drag data, or control the drop effect (drag cursor), if so. + bool GetDragData(struct NPObject* event, bool add_data, int32* identity, + int32* event_id, std::string* type, std::string* data); + bool SetDropEffect(struct NPObject* event, int effect); + void OnMissingPluginStatus(int status); // class-specific methods |