summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.cc6
-rw-r--r--webkit/api/public/WebBindings.h75
-rw-r--r--webkit/api/src/WebBindings.cpp177
-rw-r--r--webkit/glue/npruntime_util.cc158
-rw-r--r--webkit/glue/npruntime_util.h17
5 files changed, 270 insertions, 163 deletions
diff --git a/chrome/renderer/webplugin_delegate_proxy.cc b/chrome/renderer/webplugin_delegate_proxy.cc
index 233749b9..ba7b197 100644
--- a/chrome/renderer/webplugin_delegate_proxy.cc
+++ b/chrome/renderer/webplugin_delegate_proxy.cc
@@ -31,6 +31,7 @@
#include "grit/renderer_resources.h"
#include "net/base/mime_util.h"
#include "printing/native_metafile.h"
+#include "webkit/api/public/WebBindings.h"
#include "webkit/api/public/WebCursorInfo.h"
#include "webkit/api/public/WebDragData.h"
#include "webkit/api/public/WebString.h"
@@ -48,6 +49,7 @@
#include "base/scoped_cftyperef.h"
#endif
+using WebKit::WebBindings;
using WebKit::WebCursorInfo;
using WebKit::WebInputEvent;
using WebKit::WebDragData;
@@ -872,7 +874,7 @@ void WebPluginDelegateProxy::OnGetDragData(const NPVariant_Param& object,
WebDragData data;
NPObject* event = reinterpret_cast<NPObject*>(object.npobject_pointer);
const int32 drag_id = webview->GetDragIdentity();
- if (!drag_id || !webkit_glue::GetDragData(event, &event_id, &data))
+ if (!drag_id || !WebBindings::getDragData(event, &event_id, &data))
return;
NPVariant results[4];
@@ -903,7 +905,7 @@ void WebPluginDelegateProxy::OnSetDropEffect(const NPVariant_Param& object,
NPObject* event = reinterpret_cast<NPObject*>(object.npobject_pointer);
const int32 drag_id = webview->GetDragIdentity();
- if (!drag_id || !webkit_glue::IsDragEvent(event))
+ if (!drag_id || !WebBindings::isDragEvent(event))
return;
*success = webview->SetDropEffect(effect != 0);
diff --git a/webkit/api/public/WebBindings.h b/webkit/api/public/WebBindings.h
new file mode 100644
index 0000000..f6eeb7d
--- /dev/null
+++ b/webkit/api/public/WebBindings.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebBindings_h
+#define WebBindings_h
+
+#include <bindings/npruntime.h>
+#include "WebCommon.h"
+
+namespace WebKit {
+
+ class WebDragData;
+
+ // A haphazard collection of functions for dealing with plugins.
+ class WebBindings {
+ public:
+ // NPN Functions ------------------------------------------------------
+ // These are all defined in npruntime.h and are well documented.
+
+ // NPN_GetStringIdentifier
+ WEBKIT_API static NPIdentifier getStringIdentifier(const NPUTF8*);
+
+ // NPN_GetIntIdentifier
+ WEBKIT_API static NPIdentifier getIntIdentifier(int32_t);
+
+
+ // Miscellaneous utility functions ------------------------------------
+
+ // Complement to NPN_Get___Identifier functions. Extracts data from the NPIdentifier data
+ // structure. If isString is true upon return, string will be set but number's value is
+ // undefined. If iString is false, the opposite is true.
+ WEBKIT_API static void extractIdentifierData(const NPIdentifier&, const NPUTF8*& string, int32_t& number, bool& isString);
+
+ // Return true (success) if the given npobj is the current drag event in browser dispatch,
+ // and is accessible based on context execution frames and their security origins and
+ // WebKit clipboard access policy. If so, return the event id and the clipboard data (WebDragData).
+ // This only works with V8. If compiled without V8, it'll always return false.
+ WEBKIT_API static bool getDragData(NPObject* event, int* event_id, WebDragData* data);
+
+ // Invoke the event access policy checks listed above with GetDragData(). No need for clipboard
+ // data or event_id outputs, just confirm the given npobj is the current & accessible drag event.
+ // This only works with V8. If compiled without V8, it'll always return false.
+ WEBKIT_API static bool isDragEvent(NPObject* event);
+ };
+
+} // namespace WebKit
+
+#endif
diff --git a/webkit/api/src/WebBindings.cpp b/webkit/api/src/WebBindings.cpp
new file mode 100644
index 0000000..d6ee73d
--- /dev/null
+++ b/webkit/api/src/WebBindings.cpp
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebBindings.h"
+
+#include "npruntime_priv.h"
+#include "webkit/api/public/WebDragData.h"
+
+#if USE(V8_BINDING)
+#include "ChromiumDataObject.h"
+#include "ClipboardChromium.h"
+#include "EventNames.h"
+#include "MouseEvent.h"
+#include "NPV8Object.h" // for PrivateIdentifier
+#include "V8Helpers.h"
+#include "V8Proxy.h"
+#elif USE(JAVASCRIPTCORE_BINDINGS)
+#include "bridge/c/c_utility.h"
+#endif
+
+#if USE(JAVASCRIPTCORE_BINDINGS)
+using JSC::Bindings::PrivateIdentifier;
+#endif
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebBindings::extractIdentifierData(const NPIdentifier& identifier, const NPUTF8*& string, int32_t& number, bool& isString)
+{
+ PrivateIdentifier* priv = static_cast<PrivateIdentifier*>(identifier);
+ if (!priv) {
+ isString = false;
+ number = 0;
+ return;
+ }
+
+ isString = priv->isString;
+ if (isString)
+ string = priv->value.string;
+ else
+ number = priv->value.number;
+}
+
+NPIdentifier WebBindings::getStringIdentifier(const NPUTF8* string)
+{
+ return NPN_GetStringIdentifier(string);
+}
+
+NPIdentifier WebBindings::getIntIdentifier(int32_t number)
+{
+ return NPN_GetIntIdentifier(number);
+}
+
+#if USE(V8)
+
+static v8::Local<v8::Value> getEvent(const v8::Handle<v8::Context>& context)
+{
+ static v8::Persistent<v8::String> event(v8::Persistent<v8::String>::New(v8::String::NewSymbol("event")));
+ return context->Global()->GetHiddenValue(event);
+}
+
+static bool getDragDataImpl(NPObject* npobj, int* eventId, WebDragData* data)
+{
+ if (npobj == NULL)
+ return false;
+ if (npobj->_class != npScriptObjectClass)
+ return false;
+
+ v8::HandleScope handleScope;
+ v8::Handle<v8::Context> context = v8::Context::GetEntered();
+ if (context.IsEmpty())
+ return false;
+
+ // Get the current WebCore event.
+ v8::Handle<v8::Value> currentEvent(getEvent(context));
+ Event* event = V8DOMWrapper::convertToNativeEvent(currentEvent);
+ if (event == NULL)
+ return false;
+
+ // Check that the given npobj is that event.
+ V8NPObject* object = reinterpret_cast<V8NPObject*>(npobj);
+ Event* given = V8DOMWrapper::convertToNativeEvent(object->v8Object);
+ if (given != event)
+ return false;
+
+ // Check the execution frames are same origin.
+ V8Proxy* current = V8Proxy::retrieve(V8Proxy::retrieveFrame());
+ Frame* frame = V8Proxy::retrieveFrame(context);
+ if (!current || !current->canAccessFrame(frame, false))
+ return false;
+
+ const EventNames& names(eventNames());
+ const AtomicString& eventType(event->type());
+
+ enum DragTargetMouseEventId {
+ DragEnterId = 1, DragOverId = 2, DragLeaveId = 3, DropId = 4
+ };
+
+ // The event type should be a drag event.
+ if (eventType == names.dragenterEvent)
+ *eventId = DragEnterId;
+ else if (eventType == names.dragoverEvent)
+ *eventId = DragOverId;
+ else if (eventType == names.dragleaveEvent)
+ *eventId = DragLeaveId;
+ else if (eventType == names.dropEvent)
+ *eventId = DropId;
+ else
+ return false;
+
+ // Drag events are mouse events and should have a clipboard.
+ MouseEvent* me = reinterpret_cast<MouseEvent*>(event);
+ Clipboard* clipboard = me->clipboard();
+ if (!clipboard)
+ return false;
+
+ // And that clipboard should be accessible by WebKit policy.
+ ClipboardChromium* chrome = reinterpret_cast<ClipboardChromium*>(clipboard);
+ HashSet<String> accessible(chrome->types());
+ if (accessible.isEmpty())
+ return false;
+
+ RefPtr<ChromiumDataObject> dataObject(chrome->dataObject());
+ if (dataObject && data)
+ *data = WebDragData(dataObject);
+
+ return dataObject != NULL;
+}
+
+#endif
+
+bool WebBindings::getDragData(NPObject* event, int* eventId, WebDragData* data)
+{
+#if USE(V8)
+ return getDragDataImpl(event, eventId, data);
+#else
+ // Not supported on other ports (JSC, etc).
+ return false;
+#endif
+}
+
+bool WebBindings::isDragEvent(NPObject* event)
+{
+ int eventId;
+ return getDragData(event, &eventId, NULL);
+}
+
+} // namespace WebKit
diff --git a/webkit/glue/npruntime_util.cc b/webkit/glue/npruntime_util.cc
index 681f621..e2edc72 100644
--- a/webkit/glue/npruntime_util.cc
+++ b/webkit/glue/npruntime_util.cc
@@ -1,60 +1,29 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "config.h"
-
#include "webkit/glue/npruntime_util.h"
-#if USE(V8_BINDING)
-#include "ChromiumDataObject.h"
-#include "ClipboardChromium.h"
-#include "EventNames.h"
-#include "MouseEvent.h"
-#include "NPV8Object.h" // for PrivateIdentifier
-#include "V8Helpers.h"
-#include "V8Proxy.h"
-#elif USE(JAVASCRIPTCORE_BINDINGS)
-#include "bridge/c/c_utility.h"
-#endif
-
-#undef LOG
-
#include "base/pickle.h"
-#if USE(V8_BINDING)
-#include "webkit/api/public/WebDragData.h"
-#include "webkit/glue/glue_util.h"
-#endif
-
-using WebKit::WebDragData;
-#if USE(JAVASCRIPTCORE_BINDINGS)
-using JSC::Bindings::PrivateIdentifier;
-#endif
+#include "webkit/api/public/WebBindings.h"
+using WebKit::WebBindings;
namespace webkit_glue {
bool SerializeNPIdentifier(NPIdentifier identifier, Pickle* pickle) {
- PrivateIdentifier* priv = static_cast<PrivateIdentifier*>(identifier);
-
- // If the identifier was null, then we just send a numeric 0. This is to
- // support cases where the other end doesn't care about the NPIdentifier
- // being serialized, so the bogus value of 0 is really inconsequential.
- PrivateIdentifier null_id;
- if (!priv) {
- priv = &null_id;
- priv->isString = false;
- priv->value.number = 0;
- }
+ const NPUTF8* string;
+ int32_t number;
+ bool is_string;
+ WebBindings::extractIdentifierData(identifier, string, number, is_string);
- if (!pickle->WriteBool(priv->isString))
+ if (!pickle->WriteBool(is_string))
return false;
- if (priv->isString) {
+ if (is_string) {
// Write the null byte for efficiency on the other end.
- return pickle->WriteData(
- priv->value.string, strlen(priv->value.string) + 1);
+ return pickle->WriteData(string, strlen(string) + 1);
}
- return pickle->WriteInt(priv->value.number);
+ return pickle->WriteInt(number);
}
bool DeserializeNPIdentifier(const Pickle& pickle, void** pickle_iter,
@@ -69,115 +38,14 @@ bool DeserializeNPIdentifier(const Pickle& pickle, void** pickle_iter,
if (!pickle.ReadData(pickle_iter, &data, &data_len))
return false;
DCHECK_EQ((static_cast<size_t>(data_len)), strlen(data) + 1);
- *identifier = NPN_GetStringIdentifier(data);
+ *identifier = WebBindings::getStringIdentifier(data);
} else {
int number;
if (!pickle.ReadInt(pickle_iter, &number))
return false;
- *identifier = NPN_GetIntIdentifier(number);
+ *identifier = WebBindings::getIntIdentifier(number);
}
return true;
}
-#if USE(V8)
-
-inline v8::Local<v8::Value> GetEvent(const v8::Handle<v8::Context>& context) {
- static v8::Persistent<v8::String> event(
- v8::Persistent<v8::String>::New(v8::String::NewSymbol("event")));
- return context->Global()->GetHiddenValue(event);
-}
-
-static bool DragEventData(NPObject* npobj, int* event_id, WebDragData* data) {
- using WebCore::V8DOMWrapper;
- using WebCore::V8Proxy;
-
- if (npobj == NULL)
- return false;
- if (npobj->_class != npScriptObjectClass)
- return false;
-
- v8::HandleScope handle_scope;
- v8::Handle<v8::Context> context = v8::Context::GetEntered();
- if (context.IsEmpty())
- return false;
-
- // Get the current WebCore event.
- v8::Handle<v8::Value> current_event(GetEvent(context));
- WebCore::Event* event = V8DOMWrapper::convertToNativeEvent(current_event);
- if (event == NULL)
- return false;
-
- // Check that the given npobj is that event.
- V8NPObject* object = reinterpret_cast<V8NPObject*>(npobj);
- WebCore::Event* given = V8DOMWrapper::convertToNativeEvent(object->v8Object);
- if (given != event)
- return false;
-
- // Check the execution frames are same origin.
- V8Proxy* current = V8Proxy::retrieve(V8Proxy::retrieveFrame());
- WebCore::Frame* frame = V8Proxy::retrieveFrame(context);
- if (!current || !current->canAccessFrame(frame, false))
- return false;
-
- const WebCore::EventNames& event_names(WebCore::eventNames());
- const WebCore::AtomicString& event_type(event->type());
-
- enum DragTargetMouseEventId {
- DragEnterId = 1, DragOverId = 2, DragLeaveId = 3, DropId = 4
- };
-
- // The event type should be a drag event.
- if (event_type == event_names.dragenterEvent) {
- *event_id = DragEnterId;
- } else if (event_type == event_names.dragoverEvent) {
- *event_id = DragOverId;
- } else if (event_type == event_names.dragleaveEvent) {
- *event_id = DragLeaveId;
- } else if (event_type == event_names.dropEvent) {
- *event_id = DropId;
- } else {
- return false;
- }
-
- // Drag events are mouse events and should have a clipboard.
- WebCore::MouseEvent* me = reinterpret_cast<WebCore::MouseEvent*>(event);
- WebCore::Clipboard* clipboard = me->clipboard();
- if (!clipboard)
- return false;
-
- // And that clipboard should be accessible by WebKit policy.
- WebCore::ClipboardChromium* chrome =
- reinterpret_cast<WebCore::ClipboardChromium*>(clipboard);
- HashSet<WebCore::String> accessible(chrome->types());
- if (accessible.isEmpty())
- return false;
-
- RefPtr<WebCore::ChromiumDataObject> data_object(chrome->dataObject());
- if (data_object && data)
- *data = ChromiumDataObjectToWebDragData(data_object);
-
- return data_object != NULL;
-}
-
-#endif
-
-bool GetDragData(NPObject* event, int* event_id, WebDragData* data) {
-#if USE(V8)
- return DragEventData(event, event_id, data);
-#else
- // Not supported on other ports (JSC, etc).
- return false;
-#endif
-}
-
-bool IsDragEvent(NPObject* event) {
-#if USE(V8)
- int event_id;
- return DragEventData(event, &event_id, NULL); // Check the event only.
-#else
- // Not supported on other ports (JSC, etc).
- return false;
-#endif
-}
-
} // namespace webkit_glue
diff --git a/webkit/glue/npruntime_util.h b/webkit/glue/npruntime_util.h
index 1e27191..a655873 100644
--- a/webkit/glue/npruntime_util.h
+++ b/webkit/glue/npruntime_util.h
@@ -5,14 +5,10 @@
#ifndef WEBKIT_GLUE_NPRUNTIME_UTIL_H_
#define WEBKIT_GLUE_NPRUNTIME_UTIL_H_
-#include "third_party/npapi/bindings/npruntime.h"
+#include "bindings/npruntime.h"
class Pickle;
-namespace WebKit {
-class WebDragData;
-}
-
namespace webkit_glue {
// Efficiently serialize/deserialize a NPIdentifier
@@ -20,17 +16,6 @@ bool SerializeNPIdentifier(NPIdentifier identifier, Pickle* pickle);
bool DeserializeNPIdentifier(const Pickle& pickle, void** pickle_iter,
NPIdentifier* identifier);
-// Return true (success) if the given npobj is the current
-// drag event in browser dispatch, and is accessible based on context execution
-// frames and their security origins and WebKit clipboard access policy. If so,
-// return the event id and the clipboard data (WebDragData).
-bool GetDragData(NPObject* npobj, int* event_id, WebKit::WebDragData* data);
-
-// Invoke the event access policy checks listed above with
-// GetDragData(). No need for clipboard data or event_id outputs, just confirm
-// the given npobj is the current & accessible drag event.
-bool IsDragEvent(NPObject* npobj);
-
} // namespace webkit_glue
#endif // WEBKIT_GLUE_NPRUNTIME_UTIL_H_