1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/* 2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved. 3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without 5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are 6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met: 7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions of source code must retain the above copyright 9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer. 10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Redistributions in binary form must reproduce the above 11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer 12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the 13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution. 14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * * Neither the name of Google Inc. nor the names of its 15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from 16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission. 17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * 18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */ 30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h" 32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebDragData.h" 33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ChromiumDataObject.h" 35a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "ChromiumDataObjectLegacy.h" 36a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "ClipboardMimeTypes.h" 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebData.h" 38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebString.h" 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURL.h" 40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebVector.h" 41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/PassRefPtr.h> 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebCore; 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit { 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebDragDataPrivate : public ChromiumDataObject { 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}; 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::initialize() 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch assign(static_cast<WebDragDataPrivate*>(ChromiumDataObject::create(Clipboard::DragAndDrop).releaseRef())); 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::reset() 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(0); 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::assign(const WebDragData& other) 62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block WebDragDataPrivate* p = const_cast<WebDragDataPrivate*>(other.m_private); 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (p) 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block p->ref(); 66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(p); 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 69a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebString WebDragData::url() const 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 72a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool ignoredSuccess; 73a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->getData(mimeTypeURL, ignoredSuccess); 74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 76643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::setURL(const WebURL& url) 77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 79a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setData(mimeTypeURL, KURL(url).string()); 80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 82643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebDragData::urlTitle() const 83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 85a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->urlTitle(); 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::setURLTitle(const WebString& urlTitle) 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 91a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setUrlTitle(urlTitle); 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve BlockWebString WebDragData::downloadMetadata() const 958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block ASSERT(!isNull()); 97a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool ignoredSuccess; 98a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->getData(mimeTypeDownloadURL, ignoredSuccess); 998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 1008a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 1018a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid WebDragData::setDownloadMetadata(const WebString& downloadMetadata) 1028a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{ 1038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block ensureMutable(); 104a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setData(mimeTypeDownloadURL, downloadMetadata); 1058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block} 1068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 107643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebDragData::fileExtension() const 108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 110a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->fileExtension(); 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 113643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::setFileExtension(const WebString& fileExtension) 114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 116a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setFileExtension(fileExtension); 117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 119a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool WebDragData::containsFilenames() const 120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 122a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->containsFilenames(); 123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 125a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WebDragData::filenames(WebVector<WebString>& filenames) const 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 128a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch filenames = m_private->filenames(); 129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 131a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WebDragData::setFilenames(const WebVector<WebString>& filenames) 132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 134a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Vector<String> filenamesCopy; 135a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch filenamesCopy.append(filenames.data(), filenames.size()); 136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setFilenames(filenamesCopy); 137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 139a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WebDragData::appendToFilenames(const WebString& filename) 140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 142a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch Vector<String> filenames = m_private->filenames(); 143a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch filenames.append(filename); 144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setFilenames(filenames); 145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 147643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebDragData::plainText() const 148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 150a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool ignoredSuccess; 151a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->getData(mimeTypeTextPlain, ignoredSuccess); 152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 154643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::setPlainText(const WebString& plainText) 155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setData(mimeTypeTextPlain, plainText); 158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 160643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebDragData::htmlText() const 161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 163a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool ignoredSuccess; 164a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->getData(mimeTypeTextHTML, ignoredSuccess); 165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 167643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::setHTMLText(const WebString& htmlText) 168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 170a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setData(mimeTypeTextHTML, htmlText); 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 173643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebURL WebDragData::htmlBaseURL() const 174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 176a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->htmlBaseUrl(); 177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 179643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::setHTMLBaseURL(const WebURL& htmlBaseURL) 180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 182a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setHtmlBaseUrl(htmlBaseURL); 183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 185a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochWebString WebDragData::fileContentFilename() const 186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 188a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return m_private->fileContentFilename(); 189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 191a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid WebDragData::setFileContentFilename(const WebString& filename) 192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 194a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setFileContentFilename(filename); 195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 197643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebData WebDragData::fileContent() const 198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 200a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return WebData(m_private->fileContent()); 201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 203643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::setFileContent(const WebData& fileContent) 204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ensureMutable(); 206a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch m_private->setFileContent(fileContent); 207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 209643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebDragData::WebDragData(const WTF::PassRefPtr<WebCore::ChromiumDataObject>& data) 210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : m_private(static_cast<WebDragDataPrivate*>(data.releaseRef())) 211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 214643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebDragData& WebDragData::operator=(const WTF::PassRefPtr<WebCore::ChromiumDataObject>& data) 215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block assign(static_cast<WebDragDataPrivate*>(data.releaseRef())); 217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return *this; 218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 220643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebDragData::operator WTF::PassRefPtr<WebCore::ChromiumDataObject>() const 221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return PassRefPtr<ChromiumDataObject>(const_cast<WebDragDataPrivate*>(m_private)); 223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 225643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::assign(WebDragDataPrivate* p) 226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // p is already ref'd for us by the caller 228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_private) 229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private->deref(); 230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_private = p; 231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 233643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebDragData::ensureMutable() 234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(!isNull()); 236a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ASSERT(m_private->hasOneRef()); 237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit 240