Commit 5bbe9a8c authored by kling@webkit.org's avatar kling@webkit.org

Clipboard::types() should return an ordered collection.

<http://webkit.org/b/98547>

Reviewed by Darin Adler.

Let Clipboard::types() return a ListHashSet<String> instead of a HashSet<String> to make sure
it retains the order in which type strings are added.

No test, this fixes an issue that was uncovered when lowering the default table size of WTF
hash tables, causing the HashSet<String> to rehash and reorder itself.

* bindings/js/JSClipboardCustom.cpp:
(WebCore::JSClipboard::types):
* bindings/v8/custom/V8ClipboardCustom.cpp:
(WebCore::V8Clipboard::typesAccessorGetter):
* dom/Clipboard.h:
(Clipboard):
* platform/blackberry/ClipboardBlackBerry.cpp:
(WebCore::ClipboardBlackBerry::types):
* platform/blackberry/ClipboardBlackBerry.h:
(ClipboardBlackBerry):
* platform/chromium/ChromiumDataObject.cpp:
(WebCore::ChromiumDataObject::types):
* platform/chromium/ChromiumDataObject.h:
(ChromiumDataObject):
* platform/chromium/ClipboardChromium.cpp:
(WebCore::ClipboardChromium::types):
* platform/chromium/ClipboardChromium.h:
(ClipboardChromium):
* platform/efl/ClipboardEfl.cpp:
(WebCore::ClipboardEfl::types):
* platform/efl/ClipboardEfl.h:
(ClipboardEfl):
* platform/gtk/ClipboardGtk.cpp:
(WebCore::ClipboardGtk::types):
* platform/gtk/ClipboardGtk.h:
(ClipboardGtk):
* platform/mac/ClipboardMac.h:
(ClipboardMac):
* platform/mac/ClipboardMac.mm:
(WebCore::addHTMLClipboardTypesForCocoaType):
(WebCore::ClipboardMac::types):
* platform/qt/ClipboardQt.cpp:
(WebCore::ClipboardQt::types):
* platform/qt/ClipboardQt.h:
(ClipboardQt):
* platform/win/ClipboardWin.cpp:
(WebCore::addMimeTypesForFormat):
(WebCore::ClipboardWin::types):
* platform/win/ClipboardWin.h:
(ClipboardWin):
* platform/wx/ClipboardWx.cpp:
(WebCore::ClipboardWx::types):
* platform/wx/ClipboardWx.h:
(ClipboardWx):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@130588 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 0d4406d5
2012-10-06 Andreas Kling <kling@webkit.org>
Clipboard::types() should return an ordered collection.
<http://webkit.org/b/98547>
Reviewed by Darin Adler.
Let Clipboard::types() return a ListHashSet<String> instead of a HashSet<String> to make sure
it retains the order in which type strings are added.
No test, this fixes an issue that was uncovered when lowering the default table size of WTF
hash tables, causing the HashSet<String> to rehash and reorder itself.
* bindings/js/JSClipboardCustom.cpp:
(WebCore::JSClipboard::types):
* bindings/v8/custom/V8ClipboardCustom.cpp:
(WebCore::V8Clipboard::typesAccessorGetter):
* dom/Clipboard.h:
(Clipboard):
* platform/blackberry/ClipboardBlackBerry.cpp:
(WebCore::ClipboardBlackBerry::types):
* platform/blackberry/ClipboardBlackBerry.h:
(ClipboardBlackBerry):
* platform/chromium/ChromiumDataObject.cpp:
(WebCore::ChromiumDataObject::types):
* platform/chromium/ChromiumDataObject.h:
(ChromiumDataObject):
* platform/chromium/ClipboardChromium.cpp:
(WebCore::ClipboardChromium::types):
* platform/chromium/ClipboardChromium.h:
(ClipboardChromium):
* platform/efl/ClipboardEfl.cpp:
(WebCore::ClipboardEfl::types):
* platform/efl/ClipboardEfl.h:
(ClipboardEfl):
* platform/gtk/ClipboardGtk.cpp:
(WebCore::ClipboardGtk::types):
* platform/gtk/ClipboardGtk.h:
(ClipboardGtk):
* platform/mac/ClipboardMac.h:
(ClipboardMac):
* platform/mac/ClipboardMac.mm:
(WebCore::addHTMLClipboardTypesForCocoaType):
(WebCore::ClipboardMac::types):
* platform/qt/ClipboardQt.cpp:
(WebCore::ClipboardQt::types):
* platform/qt/ClipboardQt.h:
(ClipboardQt):
* platform/win/ClipboardWin.cpp:
(WebCore::addMimeTypesForFormat):
(WebCore::ClipboardWin::types):
* platform/win/ClipboardWin.h:
(ClipboardWin):
* platform/wx/ClipboardWx.cpp:
(WebCore::ClipboardWx::types):
* platform/wx/ClipboardWx.h:
(ClipboardWx):
2012-10-06 Geoffrey Garen <ggaren@apple.com>
If Node X is reachable from JavaScript, all Nodes in the same tree should be kept alive
......
......@@ -38,7 +38,6 @@
#include "Node.h"
#include <runtime/ArrayPrototype.h>
#include <runtime/Error.h>
#include <wtf/HashSet.h>
#include <wtf/text/StringHash.h>
#include <wtf/text/WTFString.h>
......@@ -52,13 +51,13 @@ JSValue JSClipboard::types(ExecState* exec) const
{
Clipboard* clipboard = impl();
HashSet<String> types = clipboard->types();
ListHashSet<String> types = clipboard->types();
if (types.isEmpty())
return jsNull();
MarkedArgumentBuffer list;
HashSet<String>::const_iterator end = types.end();
for (HashSet<String>::const_iterator it = types.begin(); it != end; ++it)
ListHashSet<String>::const_iterator end = types.end();
for (ListHashSet<String>::const_iterator it = types.begin(); it != end; ++it)
list.append(jsStringWithCache(exec, *it));
return constructArray(exec, globalObject(), list);
}
......
......@@ -48,14 +48,14 @@ v8::Handle<v8::Value> V8Clipboard::typesAccessorGetter(v8::Local<v8::String> nam
INC_STATS("DOM.Clipboard.types()");
Clipboard* clipboard = V8Clipboard::toNative(info.Holder());
HashSet<String> types = clipboard->types();
ListHashSet<String> types = clipboard->types();
if (types.isEmpty())
return v8::Null(info.GetIsolate());
v8::Local<v8::Array> result = v8::Array::New(types.size());
HashSet<String>::const_iterator end = types.end();
ListHashSet<String>::const_iterator end = types.end();
int index = 0;
for (HashSet<String>::const_iterator it = types.begin(); it != end; ++it, ++index)
for (ListHashSet<String>::const_iterator it = types.begin(); it != end; ++it, ++index)
result->Set(v8Integer(index, info.GetIsolate()), v8String(*it, info.GetIsolate()));
return result;
......
......@@ -66,7 +66,7 @@ namespace WebCore {
virtual bool setData(const String& type, const String& data) = 0;
// extensions beyond IE's API
virtual HashSet<String> types() const = 0;
virtual ListHashSet<String> types() const = 0;
virtual PassRefPtr<FileList> files() const = 0;
IntPoint dragLocation() const { return m_dragLoc; }
......
......@@ -78,13 +78,13 @@ bool ClipboardBlackBerry::setData(const String& type, const String& text)
return true;
}
HashSet<String> ClipboardBlackBerry::types() const
ListHashSet<String> ClipboardBlackBerry::types() const
{
if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
return HashSet<String>();
return ListHashSet<String>();
// We use hardcoded list here since there seems to be no API to get the list.
HashSet<String> ret;
ListHashSet<String> ret;
ret.add("text/plain");
ret.add("text/html");
ret.add("text/url");
......
......@@ -39,7 +39,7 @@ public:
bool setData(const String& type, const String& data);
// extensions beyond IE's API
virtual HashSet<String> types() const;
virtual ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
virtual DragImageRef createDragImage(IntPoint&) const;
virtual void declareAndWriteDragImage(Element*, const KURL&, const String& title, Frame*);
......
......@@ -126,9 +126,9 @@ void ChromiumDataObject::clearAllExceptFiles()
}
}
HashSet<String> ChromiumDataObject::types() const
ListHashSet<String> ChromiumDataObject::types() const
{
HashSet<String> results;
ListHashSet<String> results;
bool containsFiles = false;
for (size_t i = 0; i < m_itemList.size(); ++i) {
if (m_itemList[i]->kind() == DataTransferItem::kindString)
......
......@@ -33,7 +33,7 @@
#include "ChromiumDataObjectItem.h"
#include "Supplementable.h"
#include <wtf/HashSet.h>
#include <wtf/ListHashSet.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
#include <wtf/text/StringHash.h>
......@@ -69,7 +69,7 @@ public:
void clearData(const String& type);
void clearAllExceptFiles();
HashSet<String> types() const;
ListHashSet<String> types() const;
String getData(const String& type) const;
bool setData(const String& type, const String& data);
......
......@@ -275,10 +275,10 @@ bool ClipboardChromium::setData(const String& type, const String& data)
}
// extensions beyond IE's API
HashSet<String> ClipboardChromium::types() const
ListHashSet<String> ClipboardChromium::types() const
{
if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
return HashSet<String>();
return ListHashSet<String>();
return m_dataObject->types();
}
......
......@@ -84,7 +84,7 @@ namespace WebCore {
bool platformClipboardChanged() const;
// extensions beyond IE's API
virtual HashSet<String> types() const;
virtual ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
void setDragImage(CachedImage*, const IntPoint&);
......
......@@ -76,10 +76,10 @@ bool ClipboardEfl::setData(const String&, const String&)
return false;
}
HashSet<String> ClipboardEfl::types() const
ListHashSet<String> ClipboardEfl::types() const
{
notImplemented();
return HashSet<String>();
return ListHashSet<String>();
}
PassRefPtr<FileList> ClipboardEfl::files() const
......
......@@ -39,7 +39,7 @@ public:
String getData(const String&) const;
bool setData(const String&, const String&);
HashSet<String> types() const;
ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
IntPoint dragLocation() const;
......
......@@ -186,15 +186,15 @@ bool ClipboardGtk::setData(const String& typeString, const String& data)
return success;
}
HashSet<String> ClipboardGtk::types() const
ListHashSet<String> ClipboardGtk::types() const
{
if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
return HashSet<String>();
return ListHashSet<String>();
if (m_clipboard)
PasteboardHelper::defaultPasteboardHelper()->getClipboardContents(m_clipboard);
HashSet<String> types;
ListHashSet<String> types;
if (m_dataObject->hasText()) {
types.add("text/plain");
types.add("Text");
......
......@@ -57,7 +57,7 @@ namespace WebCore {
String getData(const String&) const;
bool setData(const String&, const String&);
virtual HashSet<String> types() const;
virtual ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
void setDragImage(CachedImage*, const IntPoint&);
......
......@@ -62,7 +62,7 @@ public:
virtual bool hasData();
// extensions beyond IE's API
virtual HashSet<String> types() const;
virtual ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
void setDragImage(CachedImage*, const IntPoint&);
......
......@@ -122,7 +122,7 @@ static String utiTypeFromCocoaType(const String& type)
return String();
}
static void addHTMLClipboardTypesForCocoaType(HashSet<String>& resultTypes, const String& cocoaType, const String& pasteboardName)
static void addHTMLClipboardTypesForCocoaType(ListHashSet<String>& resultTypes, const String& cocoaType, const String& pasteboardName)
{
// UTI may not do these right, so make sure we get the right, predictable result
if (cocoaType == String(NSStringPboardType)) {
......@@ -284,10 +284,10 @@ bool ClipboardMac::setData(const String &type, const String &data)
return false;
}
HashSet<String> ClipboardMac::types() const
ListHashSet<String> ClipboardMac::types() const
{
if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
return HashSet<String>();
return ListHashSet<String>();
Vector<String> types;
platformStrategies()->pasteboardStrategy()->getTypes(types, m_pasteboardName);
......@@ -295,9 +295,9 @@ HashSet<String> ClipboardMac::types() const
// Enforce changeCount ourselves for security. We check after reading instead of before to be
// sure it doesn't change between our testing the change count and accessing the data.
if (m_changeCount != platformStrategies()->pasteboardStrategy()->changeCount(m_pasteboardName))
return HashSet<String>();
return ListHashSet<String>();
HashSet<String> result;
ListHashSet<String> result;
// FIXME: This loop could be split into two stages. One which adds all the HTML5 specified types
// and a second which adds all the extra types from the cocoa clipboard (which is Mac-only behavior).
for (size_t i = 0; i < types.size(); i++) {
......
......@@ -183,13 +183,13 @@ bool ClipboardQt::setData(const String& type, const String& data)
}
// extensions beyond IE's API
HashSet<String> ClipboardQt::types() const
ListHashSet<String> ClipboardQt::types() const
{
if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
return HashSet<String>();
return ListHashSet<String>();
ASSERT(m_readableData);
HashSet<String> result;
ListHashSet<String> result;
QStringList formats = m_readableData->formats();
for (int i = 0; i < formats.count(); ++i)
result.add(formats.at(i));
......
......@@ -57,7 +57,7 @@ public:
bool setData(const String& type, const String& data);
// extensions beyond IE's API
virtual HashSet<String> types() const;
virtual ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
void setDragImage(CachedImage*, const IntPoint&);
......
......@@ -484,7 +484,7 @@ bool ClipboardWin::setData(const String& type, const String& data)
return false;
}
static void addMimeTypesForFormat(HashSet<String>& results, const FORMATETC& format)
static void addMimeTypesForFormat(ListHashSet<String>& results, const FORMATETC& format)
{
// URL and Text are provided for compatibility with IE's model
if (format.cfFormat == urlFormat()->cfFormat || format.cfFormat == urlWFormat()->cfFormat) {
......@@ -499,9 +499,9 @@ static void addMimeTypesForFormat(HashSet<String>& results, const FORMATETC& for
}
// extensions beyond IE's API
HashSet<String> ClipboardWin::types() const
ListHashSet<String> ClipboardWin::types() const
{
HashSet<String> results;
ListHashSet<String> results;
if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable)
return results;
......
......@@ -64,7 +64,7 @@ public:
bool setData(const String& type, const String& data);
// extensions beyond IE's API
virtual HashSet<String> types() const;
virtual ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
void setDragImage(CachedImage*, const IntPoint&);
......
......@@ -71,10 +71,10 @@ bool ClipboardWx::setData(const String& type, const String& data)
}
// extensions beyond IE's API
HashSet<String> ClipboardWx::types() const
ListHashSet<String> ClipboardWx::types() const
{
notImplemented();
HashSet<String> result;
ListHashSet<String> result;
return result;
}
......
......@@ -46,7 +46,7 @@ namespace WebCore {
bool setData(const String& type, const String& data);
// extensions beyond IE's API
virtual HashSet<String> types() const;
virtual ListHashSet<String> types() const;
virtual PassRefPtr<FileList> files() const;
IntPoint dragLocation() const;
......
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