diff options
Diffstat (limited to 'src/3rdparty/webkit/WebCore/platform')
212 files changed, 6219 insertions, 2375 deletions
diff --git a/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp b/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp index 1c8ec2009..ee6aa4e27 100644 --- a/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp +++ b/src/3rdparty/webkit/WebCore/platform/ContextMenu.cpp @@ -27,6 +27,8 @@ #include "config.h" #include "ContextMenu.h" +#if ENABLE(CONTEXT_MENUS) + #include "ContextMenuController.h" #include "ContextMenuClient.h" #include "CSSComputedStyleDeclaration.h" @@ -359,10 +361,10 @@ void ContextMenu::populate() appendItem(StopItem); appendItem(ReloadItem); #else - if (loader->canGoBackOrForward(-1)) + if (frame->page() && frame->page()->canGoBackOrForward(-1)) appendItem(BackItem); - if (loader->canGoBackOrForward(1)) + if (frame->page() && frame->page()->canGoBackOrForward(1)) appendItem(ForwardItem); // use isLoadingInAPISense rather than isLoading because Stop/Reload are @@ -514,6 +516,7 @@ void ContextMenu::populate() } } +#if ENABLE(INSPECTOR) void ContextMenu::addInspectElementItem() { Node* node = m_hitTestResult.innerNonSharedNode(); @@ -535,6 +538,7 @@ void ContextMenu::addInspectElementItem() appendItem(*separatorItem()); appendItem(InspectElementItem); } +#endif // ENABLE(INSPECTOR) void ContextMenu::checkOrEnableIfNeeded(ContextMenuItem& item) const { @@ -711,13 +715,16 @@ void ContextMenu::checkOrEnableIfNeeded(ContextMenuItem& item) const case ContextMenuItemTagStopSpeaking: shouldEnable = controller() && controller()->client() && controller()->client()->isSpeaking(); break; -#endif // PLATFORM(MAC) +#else // PLATFORM(MAC) ends here + case ContextMenuItemTagStopSpeaking: + break; +#endif #if PLATFORM(GTK) case ContextMenuItemTagGoBack: - shouldEnable = frame->loader()->canGoBackOrForward(-1); + shouldEnable = frame->page() && frame->page()->canGoBackOrForward(-1); break; case ContextMenuItemTagGoForward: - shouldEnable = frame->loader()->canGoBackOrForward(1); + shouldEnable = frame->page() && frame->page()->canGoBackOrForward(1); break; case ContextMenuItemTagStop: shouldEnable = frame->loader()->documentLoader()->isLoadingInAPISense(); @@ -769,7 +776,9 @@ void ContextMenu::checkOrEnableIfNeeded(ContextMenuItem& item) const case ContextMenuItemTagTextDirectionMenu: case ContextMenuItemTagPDFSinglePageScrolling: case ContextMenuItemTagPDFFacingPagesScrolling: +#if ENABLE(INSPECTOR) case ContextMenuItemTagInspectElement: +#endif case ContextMenuItemBaseApplicationTag: break; } @@ -778,4 +787,6 @@ void ContextMenu::checkOrEnableIfNeeded(ContextMenuItem& item) const item.setEnabled(shouldEnable); } -} +} // namespace WebCore + +#endif // ENABLE(CONTEXT_MENUS) diff --git a/src/3rdparty/webkit/WebCore/platform/ContextMenuItem.h b/src/3rdparty/webkit/WebCore/platform/ContextMenuItem.h index 291258d81..0c6b81ab2 100644 --- a/src/3rdparty/webkit/WebCore/platform/ContextMenuItem.h +++ b/src/3rdparty/webkit/WebCore/platform/ContextMenuItem.h @@ -46,6 +46,8 @@ typedef struct _GtkMenuItem GtkMenuItem; #include <QAction> #elif PLATFORM(WX) class wxMenuItem; +#elif PLATFORM(HAIKU) +class BMenuItem; #endif namespace WebCore { @@ -119,7 +121,9 @@ namespace WebCore { ContextMenuItemTagRightToLeft, ContextMenuItemTagPDFSinglePageScrolling, ContextMenuItemTagPDFFacingPagesScrolling, +#if ENABLE(INSPECTOR) ContextMenuItemTagInspectElement, +#endif ContextMenuItemTagTextDirectionMenu, // Text Direction sub-menu ContextMenuItemTagTextDirectionDefault, ContextMenuItemTagTextDirectionLeftToRight, @@ -202,6 +206,8 @@ namespace WebCore { bool checked; bool enabled; }; +#elif PLATFORM(HAIKU) + typedef BMenuItem* PlatformMenuItemDescription; #else typedef void* PlatformMenuItemDescription; #endif diff --git a/src/3rdparty/webkit/WebCore/platform/Cookie.h b/src/3rdparty/webkit/WebCore/platform/Cookie.h new file mode 100644 index 000000000..0fe3851e2 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/Cookie.h @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2009 Joseph Pecoraro. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 Cookie_h +#define Cookie_h + +#include "PlatformString.h" +#include "StringHash.h" + +namespace WebCore { + + // This struct is currently only used to provide more cookies information + // to the Web Inspector. + + struct Cookie { + Cookie(const String& name, const String& value, const String& domain, + const String& path, double expires, bool httpOnly, bool secure, + bool session) + : name(name) + , value(value) + , domain(domain) + , path(path) + , expires(expires) + , httpOnly(httpOnly) + , secure(secure) + , session(session) + { + } + + String name; + String value; + String domain; + String path; + double expires; + bool httpOnly; + bool secure; + bool session; + }; + + struct CookieHash { + static unsigned hash(Cookie key) + { + return StringHash::hash(key.name) + StringHash::hash(key.domain) + StringHash::hash(key.path) + key.secure; + } + + static bool equal(Cookie a, Cookie b) + { + return a.name == b.name && a.domain == b.domain && a.path == b.path && a.secure == b.secure; + } + }; +} + +namespace WTF { + template<typename T> struct DefaultHash; + template<> struct DefaultHash<WebCore::Cookie> { + typedef WebCore::CookieHash Hash; + }; +} + +#endif diff --git a/src/3rdparty/webkit/WebCore/platform/CookieJar.h b/src/3rdparty/webkit/WebCore/platform/CookieJar.h index 615938645..987543edf 100644 --- a/src/3rdparty/webkit/WebCore/platform/CookieJar.h +++ b/src/3rdparty/webkit/WebCore/platform/CookieJar.h @@ -26,15 +26,21 @@ #ifndef CookieJar_h #define CookieJar_h +#include <wtf/Vector.h> + namespace WebCore { + class Document; class KURL; class String; - class Document; + + struct Cookie; String cookies(const Document*, const KURL&); void setCookies(Document*, const KURL&, const String&); bool cookiesEnabled(const Document*); + bool getRawCookies(const Document*, const KURL&, Vector<Cookie>&); + void deleteCookie(const Document*, const KURL&, const String&); } diff --git a/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp b/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp index 9ca626fef..d02da6c41 100644 --- a/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp +++ b/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.cpp @@ -41,7 +41,7 @@ namespace WebCore { CrossThreadCopierBase<false, String>::Type CrossThreadCopierBase<false, String>::copy(const String& str) { - return str.copy(); + return str.crossThreadString(); } CrossThreadCopierBase<false, ResourceError>::Type CrossThreadCopierBase<false, ResourceError>::copy(const ResourceError& error) diff --git a/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.h b/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.h index d12d72dc7..178e056ab 100644 --- a/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.h +++ b/src/3rdparty/webkit/WebCore/platform/CrossThreadCopier.h @@ -46,6 +46,7 @@ namespace WebCore { class String; struct CrossThreadResourceResponseData; struct CrossThreadResourceRequestData; + struct ThreadableLoaderOptions; template<typename T> struct CrossThreadCopierPassThrough { typedef T Type; @@ -65,6 +66,9 @@ namespace WebCore { template<typename T> struct CrossThreadCopierBase<false, T*> : public CrossThreadCopierPassThrough<T*> { }; + template<> struct CrossThreadCopierBase<false, ThreadableLoaderOptions> : public CrossThreadCopierPassThrough<ThreadableLoaderOptions> { + }; + // Custom copy methods. template<typename T> struct CrossThreadCopierBase<false, RefPtr<ThreadSafeShared<T> > > { typedef PassRefPtr<T> Type; diff --git a/src/3rdparty/webkit/WebCore/platform/Cursor.h b/src/3rdparty/webkit/WebCore/platform/Cursor.h index ea75191c2..2d041d23f 100644 --- a/src/3rdparty/webkit/WebCore/platform/Cursor.h +++ b/src/3rdparty/webkit/WebCore/platform/Cursor.h @@ -40,6 +40,8 @@ typedef struct _GdkCursor GdkCursor; #include <QCursor> #elif PLATFORM(CHROMIUM) #include "PlatformCursor.h" +#elif PLATFORM(HAIKU) +#include <app/Cursor.h> #endif #if PLATFORM(MAC) @@ -86,6 +88,9 @@ namespace WebCore { #elif PLATFORM(CHROMIUM) // See PlatformCursor.h typedef void* PlatformCursorHandle; +#elif PLATFORM(HAIKU) + typedef BCursor* PlatformCursor; + typedef BCursor* PlatformCursorHandle; #else typedef void* PlatformCursor; typedef void* PlatformCursorHandle; diff --git a/src/3rdparty/webkit/WebCore/platform/DragData.cpp b/src/3rdparty/webkit/WebCore/platform/DragData.cpp index bf2275a38..45189099d 100644 --- a/src/3rdparty/webkit/WebCore/platform/DragData.cpp +++ b/src/3rdparty/webkit/WebCore/platform/DragData.cpp @@ -26,6 +26,7 @@ #include "config.h" #include "DragData.h" +#if ENABLE(DRAG_SUPPORT) namespace WebCore { #if !PLATFORM(MAC) @@ -39,4 +40,6 @@ DragData::DragData(DragDataRef data, const IntPoint& clientPosition, const IntPo } #endif -} +} // namespace WebCore + +#endif // ENABLE(DRAG_SUPPORT) diff --git a/src/3rdparty/webkit/WebCore/platform/DragData.h b/src/3rdparty/webkit/WebCore/platform/DragData.h index a2c56288f..462424b02 100644 --- a/src/3rdparty/webkit/WebCore/platform/DragData.h +++ b/src/3rdparty/webkit/WebCore/platform/DragData.h @@ -56,6 +56,9 @@ typedef class wxDataObject* DragDataRef; typedef void* DragDataRef; #elif PLATFORM(CHROMIUM) #include "DragDataRef.h" +#elif PLATFORM(HAIKU) +class BMessage; +typedef class BMessage* DragDataRef; #endif diff --git a/src/3rdparty/webkit/WebCore/platform/DragImage.cpp b/src/3rdparty/webkit/WebCore/platform/DragImage.cpp index adf9a578d..aff4aba67 100644 --- a/src/3rdparty/webkit/WebCore/platform/DragImage.cpp +++ b/src/3rdparty/webkit/WebCore/platform/DragImage.cpp @@ -25,6 +25,8 @@ #include "config.h" #include "DragImage.h" + +#if ENABLE(DRAG_SUPPORT) #include "DragController.h" #include "Frame.h" @@ -71,4 +73,6 @@ DragImageRef createDragImageForSelection(Frame* frame) return image; } -} +} // namespace WebCore + +#endif // ENABLE(DRAG_SUPPORT) diff --git a/src/3rdparty/webkit/WebCore/platform/DragImage.h b/src/3rdparty/webkit/WebCore/platform/DragImage.h index a9039db19..91e8aa0bd 100644 --- a/src/3rdparty/webkit/WebCore/platform/DragImage.h +++ b/src/3rdparty/webkit/WebCore/platform/DragImage.h @@ -48,6 +48,8 @@ class wxDragImage; #include "DragImageRef.h" #elif PLATFORM(GTK) typedef struct _GdkPixbuf GdkPixbuf; +#elif PLATFORM(HAIKU) +class BBitmap; #endif //We need to #define YOffset as it needs to be shared with WebKit @@ -72,6 +74,8 @@ namespace WebCore { typedef wxDragImage* DragImageRef; #elif PLATFORM(GTK) typedef GdkPixbuf* DragImageRef; +#elif PLATFORM(HAIKU) + typedef BBitmap* DragImageRef; #endif IntSize dragImageSize(DragImageRef); diff --git a/src/3rdparty/webkit/WebCore/platform/FileSystem.h b/src/3rdparty/webkit/WebCore/platform/FileSystem.h index e23b6dada..791198d07 100644 --- a/src/3rdparty/webkit/WebCore/platform/FileSystem.h +++ b/src/3rdparty/webkit/WebCore/platform/FileSystem.h @@ -65,15 +65,23 @@ namespace WebCore { class CString; -#if PLATFORM(QT) - -typedef QFile* PlatformFileHandle; -const PlatformFileHandle invalidPlatformFileHandle = 0; +// PlatformModule +#if PLATFORM(WIN_OS) +typedef HMODULE PlatformModule; +#elif PLATFORM(QT) #if defined(Q_WS_MAC) typedef CFBundleRef PlatformModule; -typedef unsigned PlatformModuleVersion; -#elif defined(Q_OS_WIN) -typedef HMODULE PlatformModule; +#else +typedef QLibrary* PlatformModule; +#endif // defined(Q_WS_MAC) +#elif PLATFORM(GTK) +typedef GModule* PlatformModule; +#else +typedef void* PlatformModule; +#endif + +// PlatformModuleVersion +#if PLATFORM(WIN_OS) struct PlatformModuleVersion { unsigned leastSig; unsigned mostSig; @@ -90,46 +98,34 @@ struct PlatformModuleVersion { { } + bool operator != (const PlatformModuleVersion& rhs) const + { + return mostSig != rhs.mostSig && leastSig != rhs.leastSig; + } + + + bool operator > (const PlatformModuleVersion& rhs) const + { + return mostSig > rhs.mostSig && leastSig > rhs.leastSig; + } + }; #else -typedef QLibrary* PlatformModule; typedef unsigned PlatformModuleVersion; #endif +// PlatformFileHandle +#if PLATFORM(QT) +typedef QFile* PlatformFileHandle; +const PlatformFileHandle invalidPlatformFileHandle = 0; #elif PLATFORM(WIN_OS) typedef HANDLE PlatformFileHandle; -typedef HMODULE PlatformModule; // FIXME: -1 is INVALID_HANDLE_VALUE, defined in <winbase.h>. Chromium tries to // avoid using Windows headers in headers. We'd rather move this into the .cpp. const PlatformFileHandle invalidPlatformFileHandle = reinterpret_cast<HANDLE>(-1); - -struct PlatformModuleVersion { - unsigned leastSig; - unsigned mostSig; - - PlatformModuleVersion(unsigned) - : leastSig(0) - , mostSig(0) - { - } - - PlatformModuleVersion(unsigned lsb, unsigned msb) - : leastSig(lsb) - , mostSig(msb) - { - } - -}; #else typedef int PlatformFileHandle; -#if PLATFORM(GTK) -typedef GModule* PlatformModule; -#else -typedef void* PlatformModule; -#endif const PlatformFileHandle invalidPlatformFileHandle = -1; - -typedef unsigned PlatformModuleVersion; #endif bool fileExists(const String&); @@ -170,6 +166,10 @@ char* filenameFromString(const String&); String filenameForDisplay(const String&); #endif +#if PLATFORM(CHROMIUM) +String pathGetDisplayFileName(const String&); +#endif + } // namespace WebCore #endif // FileSystem_h diff --git a/src/3rdparty/webkit/WebCore/platform/GeolocationService.cpp b/src/3rdparty/webkit/WebCore/platform/GeolocationService.cpp index 9b362c8cc..e60ef0057 100644 --- a/src/3rdparty/webkit/WebCore/platform/GeolocationService.cpp +++ b/src/3rdparty/webkit/WebCore/platform/GeolocationService.cpp @@ -20,23 +20,39 @@ * 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. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "GeolocationService.h" +#include "Geoposition.h" +#include "GeolocationServiceMock.h" +#include "PositionError.h" +#include <wtf/CurrentTime.h> #include <wtf/Assertions.h> namespace WebCore { #if !ENABLE(GEOLOCATION) -GeolocationService* GeolocationService::create(GeolocationServiceClient*) +static GeolocationService* createGeolocationServiceNull(GeolocationServiceClient*) { return 0; } + +GeolocationService::FactoryFunction* GeolocationService::s_factoryFunction = &createGeolocationServiceNull; #endif +GeolocationService* GeolocationService::create(GeolocationServiceClient* client) +{ + return (*s_factoryFunction)(client); +} + +void GeolocationService::useMock() +{ + s_factoryFunction = &GeolocationServiceMock::create; +} + GeolocationService::GeolocationService(GeolocationServiceClient* client) : m_geolocationServiceClient(client) { diff --git a/src/3rdparty/webkit/WebCore/platform/GeolocationService.h b/src/3rdparty/webkit/WebCore/platform/GeolocationService.h index 74a6eade4..cebf31330 100644 --- a/src/3rdparty/webkit/WebCore/platform/GeolocationService.h +++ b/src/3rdparty/webkit/WebCore/platform/GeolocationService.h @@ -59,11 +59,16 @@ public: void positionChanged(); void errorOccurred(); + static void useMock(); + protected: GeolocationService(GeolocationServiceClient*); private: GeolocationServiceClient* m_geolocationServiceClient; + + typedef GeolocationService* (FactoryFunction)(GeolocationServiceClient*); + static FactoryFunction* s_factoryFunction; }; } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/HostWindow.h b/src/3rdparty/webkit/WebCore/platform/HostWindow.h index 3a024decc..80f6bdc35 100644 --- a/src/3rdparty/webkit/WebCore/platform/HostWindow.h +++ b/src/3rdparty/webkit/WebCore/platform/HostWindow.h @@ -48,12 +48,15 @@ public: virtual IntPoint screenToWindow(const IntPoint&) const = 0; virtual IntRect windowToScreen(const IntRect&) const = 0; - // Method for retrieving the native window. - virtual PlatformWidget platformWindow() const = 0; + // Method for retrieving the native client of the page. + virtual PlatformPageClient platformPageClient() const = 0; // For scrolling a rect into view recursively. Useful in the cases where a WebView is embedded inside some containing // platform-specific ScrollView. virtual void scrollRectIntoView(const IntRect&, const ScrollView*) const = 0; + + // To notify WebKit of scrollbar mode changes. + virtual void scrollbarsModeDidChange() const = 0; }; } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/KURL.cpp b/src/3rdparty/webkit/WebCore/platform/KURL.cpp index 4b750467c..c5829d235 100644 --- a/src/3rdparty/webkit/WebCore/platform/KURL.cpp +++ b/src/3rdparty/webkit/WebCore/platform/KURL.cpp @@ -302,13 +302,13 @@ void KURL::invalidate() m_fragmentEnd = 0; } -KURL::KURL(const char* url) +KURL::KURL(ParsedURLStringTag, const char* url) { parse(url, 0); ASSERT(url == m_string); } -KURL::KURL(const String& url) +KURL::KURL(ParsedURLStringTag, const String& url) { parse(url); ASSERT(url == m_string); @@ -529,7 +529,7 @@ void KURL::init(const KURL& base, const String& relative, const TextEncoding& en KURL KURL::copy() const { KURL result = *this; - result.m_string = result.m_string.copy(); + result.m_string = result.m_string.crossThreadString(); return result; } @@ -590,7 +590,7 @@ String KURL::user() const return decodeURLEscapeSequences(m_string.substring(m_userStart, m_userEnd - m_userStart)); } -String KURL::ref() const +String KURL::fragmentIdentifier() const { if (m_fragmentEnd == m_queryEnd) return String(); @@ -598,7 +598,7 @@ String KURL::ref() const return m_string.substring(m_queryEnd + 1, m_fragmentEnd - (m_queryEnd + 1)); } -bool KURL::hasRef() const +bool KURL::hasFragmentIdentifier() const { return m_fragmentEnd != m_queryEnd; } @@ -760,16 +760,16 @@ void KURL::setPass(const String& password) parse(m_string.left(m_userEnd) + p + m_string.substring(end)); } -void KURL::setRef(const String& s) +void KURL::setFragmentIdentifier(const String& s) { if (!m_isValid) return; // FIXME: Non-ASCII characters must be encoded and escaped to match parse() expectations. - parse(m_string.left(m_queryEnd) + (s.isNull() ? "" : "#" + s)); + parse(m_string.left(m_queryEnd) + "#" + s); } -void KURL::removeRef() +void KURL::removeFragmentIdentifier() { if (!m_isValid) return; @@ -843,7 +843,7 @@ String KURL::prettyURL() const if (m_fragmentEnd != m_queryEnd) { result.append('#'); - append(result, ref()); + append(result, fragmentIdentifier()); } return String::adopt(result); @@ -1269,8 +1269,8 @@ void KURL::parse(const char* url, const String* originalString) m_userStart = m_userEnd = m_passwordEnd = m_hostEnd = m_portEnd = p - buffer.data(); // For canonicalization, ensure we have a '/' for no path. - // Only do this for http and https. - if (m_protocolInHTTPFamily && pathEnd - pathStart == 0) + // Do this only for hierarchical URL with protocol http or https. + if (m_protocolInHTTPFamily && hierarchical && pathEnd == pathStart) *p++ = '/'; // add path, escaping bad characters @@ -1316,7 +1316,7 @@ void KURL::parse(const char* url, const String* originalString) m_isValid = true; } -bool equalIgnoringRef(const KURL& a, const KURL& b) +bool equalIgnoringFragmentIdentifier(const KURL& a, const KURL& b) { if (a.m_queryEnd != b.m_queryEnd) return false; @@ -1641,7 +1641,7 @@ String mimeTypeFromDataURL(const String& url) const KURL& blankURL() { - DEFINE_STATIC_LOCAL(KURL, staticBlankURL, ("about:blank")); + DEFINE_STATIC_LOCAL(KURL, staticBlankURL, (ParsedURLString, "about:blank")); return staticBlankURL; } diff --git a/src/3rdparty/webkit/WebCore/platform/KURL.h b/src/3rdparty/webkit/WebCore/platform/KURL.h index e419d166f..73fadd112 100644 --- a/src/3rdparty/webkit/WebCore/platform/KURL.h +++ b/src/3rdparty/webkit/WebCore/platform/KURL.h @@ -55,20 +55,18 @@ namespace WebCore { class TextEncoding; struct KURLHash; -// FIXME: Our terminology here is a bit inconsistent. We refer to the part -// after the "#" as the "fragment" in some places and the "ref" in others. -// We should fix the terminology to match the URL and URI RFCs as closely -// as possible to resolve this. +enum ParsedURLStringTag { ParsedURLString }; class KURL { public: // Generates a URL which contains a null string. KURL() { invalidate(); } - // The argument is an absolute URL string. The string is assumed to be - // an already encoded (ASCII-only) valid absolute URL. - explicit KURL(const char*); - explicit KURL(const String&); + // The argument is an absolute URL string. The string is assumed to be output of KURL::string() called on a valid + // KURL object, or indiscernible from such. + // It is usually best to avoid repeatedly parsing a string, unless memory saving outweigh the possible slow-downs. + KURL(ParsedURLStringTag, const char*); + KURL(ParsedURLStringTag, const String&); // Resolves the relative URL with the given base URL. If provided, the // TextEncoding is used to encode non-ASCII characers. The base URL can be @@ -120,8 +118,8 @@ public: String path() const; String lastPathComponent() const; String query() const; - String ref() const; - bool hasRef() const; + String fragmentIdentifier() const; + bool hasFragmentIdentifier() const; String baseAsString() const; @@ -155,10 +153,10 @@ public: // URL (with nothing after it). To clear the query, pass a null string. void setQuery(const String&); - void setRef(const String&); - void removeRef(); + void setFragmentIdentifier(const String&); + void removeFragmentIdentifier(); - friend bool equalIgnoringRef(const KURL&, const KURL&); + friend bool equalIgnoringFragmentIdentifier(const KURL&, const KURL&); friend bool protocolHostAndPortAreEqual(const KURL&, const KURL&); @@ -244,7 +242,7 @@ bool operator!=(const KURL&, const KURL&); bool operator!=(const KURL&, const String&); bool operator!=(const String&, const KURL&); -bool equalIgnoringRef(const KURL&, const KURL&); +bool equalIgnoringFragmentIdentifier(const KURL&, const KURL&); bool protocolHostAndPortAreEqual(const KURL&, const KURL&); const KURL& blankURL(); diff --git a/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp b/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp index d8b87e55f..d0aae0cf5 100644 --- a/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp +++ b/src/3rdparty/webkit/WebCore/platform/KURLGoogle.cpp @@ -106,7 +106,7 @@ static inline bool isUnicodeEncoding(const TextEncoding* encoding) static bool lowerCaseEqualsASCII(const char* begin, const char* end, const char* str) { while (begin != end && *str) { - ASSERT(isASCIILower(*str)); + ASSERT(toASCIILower(*str) == *str); if (toASCIILower(*begin++) != *str++) return false; } @@ -331,7 +331,7 @@ const String& KURLGooglePrivate::string() const // Creates with NULL-terminated string input representing an absolute URL. // WebCore generally calls this only with hardcoded strings, so the input is // ASCII. We treat is as UTF-8 just in case. -KURL::KURL(const char *url) +KURL::KURL(ParsedURLStringTag, const char *url) { // FIXME The Mac code checks for beginning with a slash and converting to a // file: URL. We will want to add this as well once we can compile on a @@ -349,7 +349,7 @@ KURL::KURL(const char *url) // to a string and then converted back. In this case, the URL is already // canonical and in proper escaped form so needs no encoding. We treat it was // UTF-8 just in case. -KURL::KURL(const String& url) +KURL::KURL(ParsedURLStringTag, const String& url) { if (!url.isNull()) m_url.init(KURL(), url, 0); @@ -504,7 +504,7 @@ String KURL::user() const return m_url.componentString(m_url.m_parsed.username); } -String KURL::ref() const +String KURL::fragmentIdentifier() const { // Empty but present refs ("foo.com/bar#") should result in the empty // string, which m_url.componentString will produce. Nonexistant refs should be @@ -516,7 +516,7 @@ String KURL::ref() const return m_url.componentString(m_url.m_parsed.ref); } -bool KURL::hasRef() const +bool KURL::hasFragmentIdentifier() const { // Note: KURL.cpp unescapes here. // FIXME determine if KURL.cpp agrees about an empty ref @@ -627,22 +627,22 @@ void KURL::setPass(const String& pass) m_url.replaceComponents(replacements); } -void KURL::setRef(const String& ref) +void KURL::setFragmentIdentifier(const String& s) { // This function is commonly called to clear the ref, which we // normally don't have, so we optimize this case. - if (ref.isNull() && !m_url.m_parsed.ref.is_valid()) + if (s.isNull() && !m_url.m_parsed.ref.is_valid()) return; KURLGooglePrivate::Replacements replacements; - if (ref.isNull()) + if (s.isNull()) replacements.ClearRef(); else - replacements.SetRef(CharactersOrEmpty(ref), url_parse::Component(0, ref.length())); + replacements.SetRef(CharactersOrEmpty(s), url_parse::Component(0, s.length())); m_url.replaceComponents(replacements); } -void KURL::removeRef() +void KURL::removeFragmentIdentifier() { KURLGooglePrivate::Replacements replacements; replacements.ClearRef(); @@ -728,13 +728,8 @@ String decodeURLEscapeSequences(const String& str) // cause security holes. We never call this function for components, and // just return the ASCII versions instead. // -// However, this static function is called directly in some cases. It appears -// that this only happens for javascript: URLs, so this is essentially the -// JavaScript URL decoder. It assumes UTF-8 encoding. -// -// IE doesn't unescape %00, forcing you to use \x00 in JS strings, so we do -// the same. This also eliminates NULL-related problems should a consumer -// incorrectly call this function for non-JavaScript. +// This function is also used to decode javascript: URLs and as a general +// purpose unescaping function. // // FIXME These should be merged to the KURL.cpp implementation. String decodeURLEscapeSequences(const String& str, const TextEncoding& encoding) @@ -757,15 +752,9 @@ String decodeURLEscapeSequences(const String& str, const TextEncoding& encoding) for (int i = 0; i < inputLength; i++) { if (input[i] == '%') { unsigned char ch; - if (url_canon::DecodeEscaped(input, &i, inputLength, &ch)) { - if (!ch) { - // Never unescape NULLs. - unescaped.push_back('%'); - unescaped.push_back('0'); - unescaped.push_back('0'); - } else - unescaped.push_back(ch); - } else { + if (url_canon::DecodeEscaped(input, &i, inputLength, &ch)) + unescaped.push_back(ch); + else { // Invalid escape sequence, copy the percent literal. unescaped.push_back('%'); } @@ -885,7 +874,7 @@ void KURL::invalidate() } // Equal up to reference fragments, if any. -bool equalIgnoringRef(const KURL& a, const KURL& b) +bool equalIgnoringFragmentIdentifier(const KURL& a, const KURL& b) { // Compute the length of each URL without its ref. Note that the reference // begin (if it exists) points to the character *after* the '#', so we need @@ -936,7 +925,7 @@ unsigned KURL::pathAfterLastSlash() const const KURL& blankURL() { - static KURL staticBlankURL("about:blank"); + static KURL staticBlankURL(ParsedURLString, "about:blank"); return staticBlankURL; } @@ -957,6 +946,32 @@ inline bool KURL::protocolIs(const String& string, const char* protocol) return WebCore::protocolIs(string, protocol); } +bool protocolHostAndPortAreEqual(const KURL& a, const KURL& b) +{ + if (a.parsed().scheme.end() != b.parsed().scheme.end()) + return false; + + int hostStartA = a.hostStart(); + int hostStartB = b.hostStart(); + if (a.hostEnd() - hostStartA != b.hostEnd() - hostStartB) + return false; + + // Check the scheme + for (int i = 0; i < a.parsed().scheme.end(); ++i) + if (a.string()[i] != b.string()[i]) + return false; + + // And the host + for (int i = hostStartA; i < static_cast<int>(a.hostEnd()); ++i) + if (a.string()[i] != b.string()[i]) + return false; + + if (a.port() != b.port()) + return false; + + return true; +} + } // namespace WebCore #endif // USE(GOOGLEURL) diff --git a/src/3rdparty/webkit/WebCore/platform/KURLHash.h b/src/3rdparty/webkit/WebCore/platform/KURLHash.h index 4deb0782f..7448a4938 100644 --- a/src/3rdparty/webkit/WebCore/platform/KURLHash.h +++ b/src/3rdparty/webkit/WebCore/platform/KURLHash.h @@ -52,7 +52,7 @@ namespace WTF { template<> struct HashTraits<WebCore::KURL> : GenericHashTraits<WebCore::KURL> { static const bool emptyValueIsZero = true; - static void constructDeletedValue(WebCore::KURL& slot) { new (&slot) WebCore::KURL(WebCore::String(HashTableDeletedValue)); } + static void constructDeletedValue(WebCore::KURL& slot) { new (&slot) WebCore::KURL(WebCore::ParsedURLString, WebCore::String(HashTableDeletedValue)); } static bool isDeletedValue(const WebCore::KURL& slot) { return slot.string().isHashTableDeletedValue(); } }; diff --git a/src/3rdparty/webkit/WebCore/platform/LocalizedStrings.h b/src/3rdparty/webkit/WebCore/platform/LocalizedStrings.h index 7c586d3a1..0fa9f71f2 100644 --- a/src/3rdparty/webkit/WebCore/platform/LocalizedStrings.h +++ b/src/3rdparty/webkit/WebCore/platform/LocalizedStrings.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2003, 2006, 2009 Apple Computer, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -38,6 +38,7 @@ namespace WebCore { String fileButtonChooseFileLabel(); String fileButtonNoFileSelectedLabel(); String copyImageUnknownFileLabel(); +#if ENABLE(CONTEXT_MENUS) String contextMenuItemTagOpenLinkInNewWindow(); String contextMenuItemTagDownloadLinkToDisk(); String contextMenuItemTagCopyLinkToClipboard(); @@ -103,6 +104,7 @@ namespace WebCore { String contextMenuItemTagChangeBack(const String& replacedString); #endif String contextMenuItemTagInspectElement(); +#endif // ENABLE(CONTEXT_MENUS) String searchMenuNoRecentSearchesText(); String searchMenuRecentSearchesText(); @@ -115,6 +117,7 @@ namespace WebCore { String AXHeadingText(); String AXDefinitionListTermText(); String AXDefinitionListDefinitionText(); + String AXARIAContentGroupText(const String& ariaType); String AXButtonActionVerb(); String AXRadioButtonActionVerb(); @@ -135,6 +138,9 @@ namespace WebCore { String mediaElementLoadingStateText(); String mediaElementLiveBroadcastStateText(); + String localizedMediaControlElementString(const String&); + String localizedMediaControlElementHelpText(const String&); + String localizedMediaTimeDescription(float); } #endif diff --git a/src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp b/src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp index 923dd8cda..609a1b023 100644 --- a/src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp +++ b/src/3rdparty/webkit/WebCore/platform/MIMETypeRegistry.cpp @@ -92,7 +92,7 @@ static void initializeSupportedImageMIMETypes() #elif PLATFORM(QT) QList<QByteArray> formats = QImageReader::supportedImageFormats(); - for (size_t i = 0; i < formats.size(); ++i) { + for (size_t i = 0; i < static_cast<size_t>(formats.size()); ++i) { #if ENABLE(SVG) /* * Qt has support for SVG, but we want to use KSVG2 @@ -149,7 +149,7 @@ static void initializeSupportedImageMIMETypesForEncoding() #endif #elif PLATFORM(QT) QList<QByteArray> formats = QImageWriter::supportedImageFormats(); - for (size_t i = 0; i < formats.size(); ++i) { + for (int i = 0; i < formats.size(); ++i) { String mimeType = MIMETypeRegistry::getMIMETypeForExtension(formats.at(i).constData()); supportedImageMIMETypesForEncoding->add(mimeType); } diff --git a/src/3rdparty/webkit/WebCore/platform/Pasteboard.h b/src/3rdparty/webkit/WebCore/platform/Pasteboard.h index 883364ab7..188b962d1 100644 --- a/src/3rdparty/webkit/WebCore/platform/Pasteboard.h +++ b/src/3rdparty/webkit/WebCore/platform/Pasteboard.h @@ -86,6 +86,7 @@ public: static Pasteboard* generalPasteboard(); void writeSelection(Range*, bool canSmartCopyOrDelete, Frame*); + void writePlainText(const String&); void writeURL(const KURL&, const String&, Frame* = 0); void writeImage(Node*, const KURL&, const String& title); #if PLATFORM(MAC) @@ -95,13 +96,14 @@ public: bool canSmartReplace(); PassRefPtr<DocumentFragment> documentFragment(Frame*, PassRefPtr<Range>, bool allowPlainText, bool& chosePlainText); String plainText(Frame* = 0); -#if PLATFORM(QT) +#if PLATFORM(QT) || PLATFORM(CHROMIUM) bool isSelectionMode() const; void setSelectionMode(bool selectionMode); #endif #if PLATFORM(GTK) void setHelper(PasteboardHelper*); + PasteboardHelper* m_helper; #endif private: @@ -117,11 +119,7 @@ private: HWND m_owner; #endif -#if PLATFORM(GTK) - PasteboardHelper* m_helper; -#endif - -#if PLATFORM(QT) +#if PLATFORM(QT) || PLATFORM(CHROMIUM) bool m_selectionMode; #endif diff --git a/src/3rdparty/webkit/WebCore/platform/PlatformKeyboardEvent.h b/src/3rdparty/webkit/WebCore/platform/PlatformKeyboardEvent.h index 4a6bc9e41..4a0673123 100644 --- a/src/3rdparty/webkit/WebCore/platform/PlatformKeyboardEvent.h +++ b/src/3rdparty/webkit/WebCore/platform/PlatformKeyboardEvent.h @@ -59,6 +59,10 @@ QT_END_NAMESPACE class wxKeyEvent; #endif +#if PLATFORM(HAIKU) +class BMessage; +#endif + namespace WebCore { class PlatformKeyboardEvent { @@ -148,6 +152,10 @@ namespace WebCore { PlatformKeyboardEvent(wxKeyEvent&); #endif +#if PLATFORM(HAIKU) + PlatformKeyboardEvent(BMessage*); +#endif + #if PLATFORM(WIN) || PLATFORM(CHROMIUM) bool isSystemKey() const { return m_isSystemKey; } #endif diff --git a/src/3rdparty/webkit/WebCore/platform/PlatformMenuDescription.h b/src/3rdparty/webkit/WebCore/platform/PlatformMenuDescription.h index 65537eb3e..380ded46a 100644 --- a/src/3rdparty/webkit/WebCore/platform/PlatformMenuDescription.h +++ b/src/3rdparty/webkit/WebCore/platform/PlatformMenuDescription.h @@ -40,6 +40,8 @@ typedef struct HMENU__* HMENU; typedef struct _GtkMenu GtkMenu; #elif PLATFORM(WX) class wxMenu; +#elif PLATFORM(HAIKU) +class BMenu; #endif namespace WebCore { @@ -55,6 +57,8 @@ namespace WebCore { typedef GtkMenu* PlatformMenuDescription; #elif PLATFORM(WX) typedef wxMenu* PlatformMenuDescription; +#elif PLATFORM(HAIKU) + typedef BMenu* PlatformMenuDescription; #else typedef void* PlatformMenuDescription; #endif diff --git a/src/3rdparty/webkit/WebCore/platform/PlatformMouseEvent.h b/src/3rdparty/webkit/WebCore/platform/PlatformMouseEvent.h index 2543d406c..99acc63cb 100644 --- a/src/3rdparty/webkit/WebCore/platform/PlatformMouseEvent.h +++ b/src/3rdparty/webkit/WebCore/platform/PlatformMouseEvent.h @@ -36,6 +36,7 @@ typedef struct _GdkEventMotion GdkEventMotion; #if PLATFORM(QT) QT_BEGIN_NAMESPACE class QInputEvent; +class QGraphicsSceneMouseEvent; QT_END_NAMESPACE #endif @@ -50,6 +51,10 @@ typedef long LPARAM; class wxMouseEvent; #endif +#if PLATFORM(HAIKU) +class BMessage; +#endif + namespace WebCore { // These button numbers match the ones used in the DOM API, 0 through 2, except for NoButton which isn't specified. @@ -116,6 +121,7 @@ namespace WebCore { #if PLATFORM(QT) PlatformMouseEvent(QInputEvent*, int clickCount); + PlatformMouseEvent(QGraphicsSceneMouseEvent*, int clickCount); #endif #if PLATFORM(WIN) @@ -128,6 +134,10 @@ namespace WebCore { PlatformMouseEvent(const wxMouseEvent&, const wxPoint& globalPoint, int clickCount); #endif +#if PLATFORM(HAIKU) + PlatformMouseEvent(const BMessage*); +#endif + protected: IntPoint m_position; IntPoint m_globalPosition; diff --git a/src/3rdparty/webkit/WebCore/platform/PlatformWheelEvent.h b/src/3rdparty/webkit/WebCore/platform/PlatformWheelEvent.h index ae8df4ee0..9a4a0cbff 100644 --- a/src/3rdparty/webkit/WebCore/platform/PlatformWheelEvent.h +++ b/src/3rdparty/webkit/WebCore/platform/PlatformWheelEvent.h @@ -35,6 +35,7 @@ typedef struct _GdkEventScroll GdkEventScroll; #if PLATFORM(QT) QT_BEGIN_NAMESPACE class QWheelEvent; +class QGraphicsSceneWheelEvent; QT_END_NAMESPACE #endif @@ -49,6 +50,10 @@ class wxMouseEvent; class wxPoint; #endif +#if PLATFORM(HAIKU) +class BMessage; +#endif + namespace WebCore { class FloatPoint; @@ -88,6 +93,15 @@ namespace WebCore { void accept() { m_isAccepted = true; } void ignore() { m_isAccepted = false; } + void turnVerticalTicksIntoHorizontal() + { + m_deltaX = m_deltaY; + m_deltaY = 0; + + m_wheelTicksX = m_wheelTicksY; + m_wheelTicksY = 0; + } + #if PLATFORM(GTK) PlatformWheelEvent(GdkEventScroll*); #endif @@ -98,6 +112,8 @@ namespace WebCore { #if PLATFORM(QT) PlatformWheelEvent(QWheelEvent*); + PlatformWheelEvent(QGraphicsSceneWheelEvent*); + void applyDelta(int delta, Qt::Orientation); #endif #if PLATFORM(WIN) @@ -109,6 +125,10 @@ namespace WebCore { PlatformWheelEvent(const wxMouseEvent&, const wxPoint&); #endif +#if PLATFORM(HAIKU) + PlatformWheelEvent(BMessage*); +#endif + protected: IntPoint m_position; IntPoint m_globalPosition; diff --git a/src/3rdparty/webkit/WebCore/platform/PopupMenu.h b/src/3rdparty/webkit/WebCore/platform/PopupMenu.h index fc85d6045..2315f02d5 100644 --- a/src/3rdparty/webkit/WebCore/platform/PopupMenu.h +++ b/src/3rdparty/webkit/WebCore/platform/PopupMenu.h @@ -59,6 +59,8 @@ class wxMenu; #include <wx/event.h> #elif PLATFORM(CHROMIUM) #include "PopupMenuPrivate.h" +#elif PLATFORM(HAIKU) +class BMenu; #endif namespace WebCore { @@ -92,6 +94,8 @@ public: #if PLATFORM(WIN) Scrollbar* scrollbar() const { return m_scrollbar.get(); } + static LPCTSTR popupClassName(); + bool up(unsigned lines = 1); bool down(unsigned lines = 1); @@ -153,6 +157,10 @@ private: void calculatePositionAndSize(const IntRect&, FrameView*); void invalidateItem(int index); + static LRESULT CALLBACK PopupMenuWndProc(HWND, UINT, WPARAM, LPARAM); + LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + static void registerClass(); + RefPtr<Scrollbar> m_scrollbar; HWND m_popup; HDC m_DC; @@ -164,6 +172,7 @@ private: int m_wheelDelta; int m_focusedIndex; bool m_scrollbarCapturingMouse; + bool m_showPopup; #elif PLATFORM(GTK) IntPoint m_menuPosition; GtkMenu* m_popup; @@ -177,6 +186,8 @@ private: void OnMenuItemSelected(wxCommandEvent&); #elif PLATFORM(CHROMIUM) PopupMenuPrivate p; +#elif PLATFORM(HAIKU) + BMenu* m_menu; #endif }; diff --git a/src/3rdparty/webkit/WebCore/platform/PopupMenuClient.h b/src/3rdparty/webkit/WebCore/platform/PopupMenuClient.h index 0718b8cd2..2614fe20e 100644 --- a/src/3rdparty/webkit/WebCore/platform/PopupMenuClient.h +++ b/src/3rdparty/webkit/WebCore/platform/PopupMenuClient.h @@ -39,6 +39,7 @@ public: virtual void valueChanged(unsigned listIndex, bool fireEvents = true) = 0; virtual String itemText(unsigned listIndex) const = 0; + virtual String itemToolTip(unsigned listIndex) const = 0; virtual bool itemIsEnabled(unsigned listIndex) const = 0; virtual PopupMenuStyle itemStyle(unsigned listIndex) const = 0; virtual PopupMenuStyle menuStyle() const = 0; @@ -48,7 +49,7 @@ public: virtual int clientPaddingRight() const = 0; virtual int listSize() const = 0; virtual int selectedIndex() const = 0; - virtual void hidePopup() = 0; + virtual void popupDidHide() = 0; virtual bool itemIsSeparator(unsigned listIndex) const = 0; virtual bool itemIsLabel(unsigned listIndex) const = 0; virtual bool itemIsSelected(unsigned listIndex) const = 0; diff --git a/src/3rdparty/webkit/WebCore/platform/SSLKeyGenerator.h b/src/3rdparty/webkit/WebCore/platform/SSLKeyGenerator.h index 398a009e8..f81f0a599 100644 --- a/src/3rdparty/webkit/WebCore/platform/SSLKeyGenerator.h +++ b/src/3rdparty/webkit/WebCore/platform/SSLKeyGenerator.h @@ -33,7 +33,14 @@ namespace WebCore { class KURL; - void getSupportedKeySizes(Vector<String>&); + // Returns strings representing key sizes that may be used + // for the <keygen> tag. The first string is displayed as the default + // key size in the <keygen> menu. + void getSupportedKeySizes(Vector<String>& sizes); + + // This function handles the <keygen> tag in form elements. + // Returns a signed copy of the combined challenge string and public + // key (from a newly generated key pair). String signedPublicKeyAndChallengeString(unsigned keySizeIndex, const String& challengeString, const KURL&); } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp b/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp index b1cff4f05..ee8726a45 100644 --- a/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp +++ b/src/3rdparty/webkit/WebCore/platform/ScrollView.cpp @@ -82,6 +82,7 @@ void ScrollView::setHasHorizontalScrollbar(bool hasBar) if (hasBar && !m_horizontalScrollbar) { m_horizontalScrollbar = createScrollbar(HorizontalScrollbar); addChild(m_horizontalScrollbar.get()); + m_horizontalScrollbar->styleChanged(); } else if (!hasBar && m_horizontalScrollbar) { removeChild(m_horizontalScrollbar.get()); m_horizontalScrollbar = 0; @@ -93,6 +94,7 @@ void ScrollView::setHasVerticalScrollbar(bool hasBar) if (hasBar && !m_verticalScrollbar) { m_verticalScrollbar = createScrollbar(VerticalScrollbar); addChild(m_verticalScrollbar.get()); + m_verticalScrollbar->styleChanged(); } else if (!hasBar && m_verticalScrollbar) { removeChild(m_verticalScrollbar.get()); m_verticalScrollbar = 0; @@ -104,7 +106,6 @@ PassRefPtr<Scrollbar> ScrollView::createScrollbar(ScrollbarOrientation orientati { return Scrollbar::createNativeScrollbar(this, orientation, RegularScrollbar); } -#endif void ScrollView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode) { @@ -117,6 +118,7 @@ void ScrollView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode v else updateScrollbars(scrollOffset()); } +#endif void ScrollView::scrollbarModes(ScrollbarMode& horizontalMode, ScrollbarMode& verticalMode) const { @@ -327,6 +329,15 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) if (m_inUpdateScrollbars || prohibitsScrolling() || platformWidget()) return; + // If we came in here with the view already needing a layout, then go ahead and do that + // first. (This will be the common case, e.g., when the page changes due to window resizing for example). + // This layout will not re-enter updateScrollbars and does not count towards our max layout pass total. + if (!m_scrollbarsSuppressed) { + m_inUpdateScrollbars = true; + visibleContentsResized(); + m_inUpdateScrollbars = false; + } + bool hasHorizontalScrollbar = m_horizontalScrollbar; bool hasVerticalScrollbar = m_verticalScrollbar; @@ -347,13 +358,6 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) if (hasVerticalScrollbar != newHasVerticalScrollbar) setHasVerticalScrollbar(newHasVerticalScrollbar); } else { - // If we came in here with the view already needing a layout, then go ahead and do that - // first. (This will be the common case, e.g., when the page changes due to window resizing for example). - // This layout will not re-enter updateScrollers and does not count towards our max layout pass total. - m_inUpdateScrollbars = true; - visibleContentsResized(); - m_inUpdateScrollbars = false; - bool sendContentResizedNotification = false; IntSize docSize = contentsSize(); @@ -460,8 +464,10 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) m_verticalScrollbar->setSuppressInvalidation(false); } - if (hasHorizontalScrollbar != (m_horizontalScrollbar != 0) || hasVerticalScrollbar != (m_verticalScrollbar != 0)) + if (hasHorizontalScrollbar != (m_horizontalScrollbar != 0) || hasVerticalScrollbar != (m_verticalScrollbar != 0)) { frameRectsChanged(); + updateScrollCorner(); + } // See if our offset has changed in a situation where we might not have scrollbars. // This can happen when editing a body with overflow:hidden and scrolling to reveal selection. @@ -476,7 +482,7 @@ void ScrollView::updateScrollbars(const IntSize& desiredOffset) m_inUpdateScrollbars = false; } -const int panIconSizeLength = 20; +const int panIconSizeLength = 16; void ScrollView::scrollContents(const IntSize& scrollDelta) { @@ -621,23 +627,7 @@ void ScrollView::setScrollbarsSuppressed(bool suppressed, bool repaintOnUnsuppre m_verticalScrollbar->invalidate(); // Invalidate the scroll corner too on unsuppress. - IntRect hCorner; - if (m_horizontalScrollbar && width() - m_horizontalScrollbar->width() > 0) { - hCorner = IntRect(m_horizontalScrollbar->width(), - height() - m_horizontalScrollbar->height(), - width() - m_horizontalScrollbar->width(), - m_horizontalScrollbar->height()); - invalidateRect(hCorner); - } - - if (m_verticalScrollbar && height() - m_verticalScrollbar->height() > 0) { - IntRect vCorner(width() - m_verticalScrollbar->width(), - m_verticalScrollbar->height(), - m_verticalScrollbar->width(), - height() - m_verticalScrollbar->height()); - if (vCorner != hCorner) - invalidateRect(vCorner); - } + invalidateRect(scrollCornerRect()); } } @@ -717,16 +707,64 @@ void ScrollView::frameRectsChanged() void ScrollView::repaintContentRectangle(const IntRect& rect, bool now) { - if (rect.isEmpty()) + IntRect visibleContent = visibleContentRect(); + visibleContent.intersect(rect); + if (visibleContent.isEmpty()) return; if (platformWidget()) { - platformRepaintContentRectangle(rect, now); + platformRepaintContentRectangle(visibleContent, now); return; } if (hostWindow()) - hostWindow()->repaint(contentsToWindow(rect), true, now); + hostWindow()->repaint(contentsToWindow(visibleContent), true, now); +} + +IntRect ScrollView::scrollCornerRect() const +{ + IntRect cornerRect; + + if (m_horizontalScrollbar && width() - m_horizontalScrollbar->width() > 0) { + cornerRect.unite(IntRect(m_horizontalScrollbar->width(), + height() - m_horizontalScrollbar->height(), + width() - m_horizontalScrollbar->width(), + m_horizontalScrollbar->height())); + } + + if (m_verticalScrollbar && height() - m_verticalScrollbar->height() > 0) { + cornerRect.unite(IntRect(width() - m_verticalScrollbar->width(), + m_verticalScrollbar->height(), + m_verticalScrollbar->width(), + height() - m_verticalScrollbar->height())); + } + + return cornerRect; +} + +void ScrollView::updateScrollCorner() +{ +} + +void ScrollView::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect) +{ + ScrollbarTheme::nativeTheme()->paintScrollCorner(this, context, cornerRect); +} + +void ScrollView::paintScrollbars(GraphicsContext* context, const IntRect& rect) +{ + if (m_horizontalScrollbar) + m_horizontalScrollbar->paint(context, rect); + if (m_verticalScrollbar) + m_verticalScrollbar->paint(context, rect); + + paintScrollCorner(context, scrollCornerRect()); +} + +void ScrollView::paintPanScrollIcon(GraphicsContext* context) +{ + DEFINE_STATIC_LOCAL(Image*, panScrollIcon, (Image::loadPlatformResource("panIcon").releaseRef())); + context->drawImage(panScrollIcon, m_panScrollIconPoint); } void ScrollView::paint(GraphicsContext* context, const IntRect& rect) @@ -763,38 +801,15 @@ void ScrollView::paint(GraphicsContext* context, const IntRect& rect) scrollViewDirtyRect.intersect(frameRect()); context->translate(x(), y()); scrollViewDirtyRect.move(-x(), -y()); - if (m_horizontalScrollbar) - m_horizontalScrollbar->paint(context, scrollViewDirtyRect); - if (m_verticalScrollbar) - m_verticalScrollbar->paint(context, scrollViewDirtyRect); - - IntRect hCorner; - if (m_horizontalScrollbar && width() - m_horizontalScrollbar->width() > 0) { - hCorner = IntRect(m_horizontalScrollbar->width(), - height() - m_horizontalScrollbar->height(), - width() - m_horizontalScrollbar->width(), - m_horizontalScrollbar->height()); - if (hCorner.intersects(scrollViewDirtyRect)) - ScrollbarTheme::nativeTheme()->paintScrollCorner(this, context, hCorner); - } - if (m_verticalScrollbar && height() - m_verticalScrollbar->height() > 0) { - IntRect vCorner(width() - m_verticalScrollbar->width(), - m_verticalScrollbar->height(), - m_verticalScrollbar->width(), - height() - m_verticalScrollbar->height()); - if (vCorner != hCorner && vCorner.intersects(scrollViewDirtyRect)) - ScrollbarTheme::nativeTheme()->paintScrollCorner(this, context, vCorner); - } + paintScrollbars(context, scrollViewDirtyRect); context->restore(); } // Paint the panScroll Icon - if (m_drawPanScrollIcon) { - DEFINE_STATIC_LOCAL(RefPtr<Image>, panScrollIcon, (Image::loadPlatformResource("panIcon"))); - context->drawImage(panScrollIcon.get(), m_panScrollIconPoint); - } + if (m_drawPanScrollIcon) + paintPanScrollIcon(context); } bool ScrollView::isPointInScrollbarCorner(const IntPoint& windowPoint) diff --git a/src/3rdparty/webkit/WebCore/platform/ScrollView.h b/src/3rdparty/webkit/WebCore/platform/ScrollView.h index 4678ad09b..1950a54a6 100644 --- a/src/3rdparty/webkit/WebCore/platform/ScrollView.h +++ b/src/3rdparty/webkit/WebCore/platform/ScrollView.h @@ -89,7 +89,7 @@ public: void scrollbarModes(ScrollbarMode& horizontalMode, ScrollbarMode& verticalMode) const; ScrollbarMode horizontalScrollbarMode() const { ScrollbarMode horizontal, vertical; scrollbarModes(horizontal, vertical); return horizontal; } ScrollbarMode verticalScrollbarMode() const { ScrollbarMode horizontal, vertical; scrollbarModes(horizontal, vertical); return vertical; } - virtual void setCanHaveScrollbars(bool flag); + void setCanHaveScrollbars(bool flag); bool canHaveScrollbars() const { return horizontalScrollbarMode() != ScrollbarAlwaysOff || verticalScrollbarMode() != ScrollbarAlwaysOff; } // Overridden by FrameView to create custom CSS scrollbars if applicable. @@ -207,6 +207,7 @@ public: // Widget override. Handles painting of the contents of the view as well as the scrollbars. virtual void paint(GraphicsContext*, const IntRect&); + void paintScrollbars(GraphicsContext*, const IntRect&); // Widget overrides to ensure that our children's visibility status is kept up to date when we get shown and hidden. virtual void show(); @@ -217,6 +218,7 @@ public: static const int noPanScrollRadius = 15; void addPanScrollIcon(const IntPoint&); void removePanScrollIcon(); + void paintPanScrollIcon(GraphicsContext*); virtual bool isPointInScrollbarCorner(const IntPoint&); virtual bool scrollbarCornerPresent() const; @@ -234,11 +236,15 @@ protected: virtual void contentsResized() = 0; virtual void visibleContentsResized() = 0; - + // These methods are used to create/destroy scrollbars. void setHasHorizontalScrollbar(bool); void setHasVerticalScrollbar(bool); + IntRect scrollCornerRect() const; + virtual void updateScrollCorner(); + virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect); + private: RefPtr<Scrollbar> m_horizontalScrollbar; RefPtr<Scrollbar> m_verticalScrollbar; diff --git a/src/3rdparty/webkit/WebCore/platform/Scrollbar.cpp b/src/3rdparty/webkit/WebCore/platform/Scrollbar.cpp index 4574f6333..4eb2c4a13 100644 --- a/src/3rdparty/webkit/WebCore/platform/Scrollbar.cpp +++ b/src/3rdparty/webkit/WebCore/platform/Scrollbar.cpp @@ -392,9 +392,9 @@ void Scrollbar::setFrameRect(const IntRect& rect) // Get our window resizer rect and see if we overlap. Adjust to avoid the overlap // if necessary. IntRect adjustedRect(rect); - if (parent()) { - bool overlapsResizer = false; - ScrollView* view = parent(); + bool overlapsResizer = false; + ScrollView* view = parent(); + if (view && !rect.isEmpty() && !view->windowResizerRect().isEmpty()) { IntRect resizerRect = view->convertFromContainingWindow(view->windowResizerRect()); if (rect.intersects(resizerRect)) { if (orientation() == HorizontalScrollbar) { @@ -411,11 +411,11 @@ void Scrollbar::setFrameRect(const IntRect& rect) } } } - - if (overlapsResizer != m_overlapsResizer) { - m_overlapsResizer = overlapsResizer; + } + if (overlapsResizer != m_overlapsResizer) { + m_overlapsResizer = overlapsResizer; + if (view) view->adjustScrollbarsAvoidingResizerCount(m_overlapsResizer ? 1 : -1); - } } Widget::setFrameRect(adjustedRect); diff --git a/src/3rdparty/webkit/WebCore/platform/StaticConstructors.h b/src/3rdparty/webkit/WebCore/platform/StaticConstructors.h index 26b44de32..f22383b6a 100644 --- a/src/3rdparty/webkit/WebCore/platform/StaticConstructors.h +++ b/src/3rdparty/webkit/WebCore/platform/StaticConstructors.h @@ -56,6 +56,9 @@ #if COMPILER(MSVC7) #define DEFINE_GLOBAL(type, name) \ const type name; +#elif PLATFORM(SYMBIAN) +#define DEFINE_GLOBAL(type, name, arg...) \ + const type name; #else #define DEFINE_GLOBAL(type, name, ...) \ const type name; @@ -67,6 +70,9 @@ #if COMPILER(MSVC7) #define DEFINE_GLOBAL(type, name) \ void * name[(sizeof(type) + sizeof(void *) - 1) / sizeof(void *)]; +#elif PLATFORM(SYMBIAN) +#define DEFINE_GLOBAL(type, name, arg...) \ + void * name[(sizeof(type) + sizeof(void *) - 1) / sizeof(void *)]; #else #define DEFINE_GLOBAL(type, name, ...) \ void * name[(sizeof(type) + sizeof(void *) - 1) / sizeof(void *)]; diff --git a/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h b/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h index 717110246..3fc5b0fd5 100644 --- a/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h +++ b/src/3rdparty/webkit/WebCore/platform/SuddenTermination.h @@ -30,6 +30,9 @@ namespace WebCore { + // Once disabled via one or more more calls to disableSuddenTermination(), fast shutdown + // is not valid until enableSuddenTermination() has been called an equal number of times. + // On Mac, these are thin wrappers around Mac OS X functions of the same name. void disableSuddenTermination(); void enableSuddenTermination(); diff --git a/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h b/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h index b7636750f..e13231379 100644 --- a/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h +++ b/src/3rdparty/webkit/WebCore/platform/ThemeTypes.h @@ -46,12 +46,11 @@ typedef unsigned ControlStates; // Must follow CSSValueKeywords.in order enum ControlPart { NoControlPart, CheckboxPart, RadioPart, PushButtonPart, SquareButtonPart, ButtonPart, - ButtonBevelPart, DefaultButtonPart, ListboxPart, ListItemPart, + ButtonBevelPart, DefaultButtonPart, ListButtonPart, ListboxPart, ListItemPart, MediaFullscreenButtonPart, MediaMuteButtonPart, MediaPlayButtonPart, MediaSeekBackButtonPart, MediaSeekForwardButtonPart, MediaRewindButtonPart, MediaReturnToRealtimeButtonPart, - MediaSliderPart, - MediaSliderThumbPart, MediaControlsBackgroundPart, - MediaCurrentTimePart, MediaTimeRemainingPart, + MediaSliderPart, MediaSliderThumbPart, MediaVolumeSliderContainerPart, MediaVolumeSliderPart, MediaVolumeSliderThumbPart, + MediaControlsBackgroundPart, MediaCurrentTimePart, MediaTimeRemainingPart, MenulistPart, MenulistButtonPart, MenulistTextPart, MenulistTextFieldPart, SliderHorizontalPart, SliderVerticalPart, SliderThumbHorizontalPart, SliderThumbVerticalPart, CaretPart, SearchFieldPart, SearchFieldDecorationPart, diff --git a/src/3rdparty/webkit/WebCore/platform/ThreadTimers.cpp b/src/3rdparty/webkit/WebCore/platform/ThreadTimers.cpp index 71a06b029..3ae820785 100644 --- a/src/3rdparty/webkit/WebCore/platform/ThreadTimers.cpp +++ b/src/3rdparty/webkit/WebCore/platform/ThreadTimers.cpp @@ -34,6 +34,11 @@ namespace WebCore { +// Fire timers for this length of time, and then quit to let the run loop process user input events. +// 100ms is about a perceptable delay in UI, so use a half of that as a threshold. +// This is to prevent UI freeze when there are too many timers or machine performance is low. +static const double maxDurationOfFiringTimers = 0.050; + // Timers are created, started and fired on the same thread, and each thread has its own ThreadTimers // copy to keep the heap and a set of currently firing timers. @@ -79,43 +84,6 @@ void ThreadTimers::updateSharedTimer() m_sharedTimer->setFireTime(m_timerHeap.first()->m_nextFireTime); } - -void ThreadTimers::collectFiringTimers(double fireTime, Vector<TimerBase*>& firingTimers) -{ - while (!m_timerHeap.isEmpty() && m_timerHeap.first()->m_nextFireTime <= fireTime) { - TimerBase* timer = m_timerHeap.first(); - firingTimers.append(timer); - m_timersReadyToFire.add(timer); - timer->m_nextFireTime = 0; - timer->heapDeleteMin(); - } -} - -void ThreadTimers::fireTimers(double fireTime, const Vector<TimerBase*>& firingTimers) -{ - size_t size = firingTimers.size(); - for (size_t i = 0; i != size; ++i) { - TimerBase* timer = firingTimers[i]; - - // If not in the set, this timer has been deleted or re-scheduled in another timer's fired function. - // So either we don't want to fire it at all or we will fire it next time the shared timer goes off. - // It might even have been deleted; that's OK because we won't do anything else with the pointer. - if (!m_timersReadyToFire.contains(timer)) - continue; - - // Setting the next fire time has a side effect of removing the timer from the firing timers set. - double interval = timer->repeatInterval(); - timer->setNextFireTime(interval ? fireTime + interval : 0); - - // Once the timer has been fired, it may be deleted, so do nothing else with it after this point. - timer->fired(); - - // Catch the case where the timer asked timers to fire in a nested event loop. - if (!m_firingTimers) - break; - } -} - void ThreadTimers::sharedTimerFired() { // Redirect to non-static method. @@ -130,17 +98,24 @@ void ThreadTimers::sharedTimerFiredInternal() m_firingTimers = true; double fireTime = currentTime(); - Vector<TimerBase*> firingTimers; + double timeToQuit = fireTime + maxDurationOfFiringTimers; - // m_timersReadyToFire will initially contain the same set as firingTimers, but - // as timers fire some mat become re-scheduled or deleted. They get removed from - // m_timersReadyToFire so we can avoid firing them. - ASSERT(m_timersReadyToFire.isEmpty()); + while (!m_timerHeap.isEmpty() && m_timerHeap.first()->m_nextFireTime <= fireTime) { + TimerBase* timer = m_timerHeap.first(); + timer->m_nextFireTime = 0; + timer->heapDeleteMin(); - collectFiringTimers(fireTime, firingTimers); - fireTimers(fireTime, firingTimers); + double interval = timer->repeatInterval(); + timer->setNextFireTime(interval ? fireTime + interval : 0); + + // Once the timer has been fired, it may be deleted, so do nothing else with it after this point. + timer->fired(); + + // Catch the case where the timer asked timers to fire in a nested event loop, or we are over time limit. + if (!m_firingTimers || timeToQuit < currentTime()) + break; + } - m_timersReadyToFire.clear(); m_firingTimers = false; updateSharedTimer(); @@ -150,7 +125,6 @@ void ThreadTimers::fireTimersInNestedEventLoop() { // Reset the reentrancy guard so the timers can fire again. m_firingTimers = false; - m_timersReadyToFire.clear(); updateSharedTimer(); } diff --git a/src/3rdparty/webkit/WebCore/platform/ThreadTimers.h b/src/3rdparty/webkit/WebCore/platform/ThreadTimers.h index ea0a366f4..01b4c71a2 100644 --- a/src/3rdparty/webkit/WebCore/platform/ThreadTimers.h +++ b/src/3rdparty/webkit/WebCore/platform/ThreadTimers.h @@ -45,7 +45,6 @@ namespace WebCore { void setSharedTimer(SharedTimer*); Vector<TimerBase*>& timerHeap() { return m_timerHeap; } - HashSet<const TimerBase*>& timersReadyToFire() { return m_timersReadyToFire; } void updateSharedTimer(); void fireTimersInNestedEventLoop(); @@ -53,13 +52,10 @@ namespace WebCore { private: static void sharedTimerFired(); - void fireTimers(double fireTime, const Vector<TimerBase*>&); - void collectFiringTimers(double fireTime, Vector<TimerBase*>&); void sharedTimerFiredInternal(); void fireTimersInNestedEventLoopInternal(); Vector<TimerBase*> m_timerHeap; - HashSet<const TimerBase*> m_timersReadyToFire; // Temporarily holds a pointer to a stack object. No ownership. SharedTimer* m_sharedTimer; // External object, can be a run loop on a worker thread. Normally set/reset by worker thread. bool m_firingTimers; // Reentrancy guard. }; diff --git a/src/3rdparty/webkit/WebCore/platform/Timer.cpp b/src/3rdparty/webkit/WebCore/platform/Timer.cpp index bd29fd8b7..539846c8c 100644 --- a/src/3rdparty/webkit/WebCore/platform/Timer.cpp +++ b/src/3rdparty/webkit/WebCore/platform/Timer.cpp @@ -53,11 +53,6 @@ static Vector<TimerBase*>& timerHeap() return threadGlobalData().threadTimers().timerHeap(); } -static HashSet<const TimerBase*>& timersReadyToFire() -{ - return threadGlobalData().threadTimers().timersReadyToFire(); -} - // Class to represent elements in the heap when calling the standard library heap algorithms. // Maintains the m_heapIndex value in the timers themselves, which allows us to do efficient // modification of the heap. @@ -205,7 +200,7 @@ bool TimerBase::isActive() const { ASSERT(m_thread == currentThread()); - return m_nextFireTime || timersReadyToFire().contains(this); + return m_nextFireTime; } double TimerBase::nextFireInterval() const @@ -296,9 +291,6 @@ void TimerBase::setNextFireTime(double newTime) ASSERT(m_thread == currentThread()); // Keep heap valid while changing the next-fire time. - - timersReadyToFire().remove(this); - double oldTime = m_nextFireTime; if (oldTime != newTime) { m_nextFireTime = newTime; diff --git a/src/3rdparty/webkit/WebCore/platform/TreeShared.h b/src/3rdparty/webkit/WebCore/platform/TreeShared.h index 1ac1b3379..02728ff30 100644 --- a/src/3rdparty/webkit/WebCore/platform/TreeShared.h +++ b/src/3rdparty/webkit/WebCore/platform/TreeShared.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -28,17 +28,8 @@ namespace WebCore { template<class T> class TreeShared : public Noncopyable { public: - TreeShared() - : m_refCount(0) - , m_parent(0) - { -#ifndef NDEBUG - m_deletionHasBegun = false; - m_inRemovedLastRefFunction = false; -#endif - } - TreeShared(T* parent) - : m_refCount(0) + TreeShared(int initialRefCount = 1) + : m_refCount(initialRefCount) , m_parent(0) { #ifndef NDEBUG diff --git a/src/3rdparty/webkit/WebCore/platform/Widget.h b/src/3rdparty/webkit/WebCore/platform/Widget.h index 5fd18faf1..e2a7349c5 100644 --- a/src/3rdparty/webkit/WebCore/platform/Widget.h +++ b/src/3rdparty/webkit/WebCore/platform/Widget.h @@ -65,10 +65,22 @@ class wxWindow; typedef wxWindow* PlatformWidget; #endif +#if PLATFORM(HAIKU) +class BView; +typedef BView* PlatformWidget; +#endif + #if PLATFORM(CHROMIUM) #include "PlatformWidget.h" #endif +#if PLATFORM(QT) +class QWebPageClient; +typedef QWebPageClient* PlatformPageClient; +#else +typedef PlatformWidget PlatformPageClient; +#endif + #include "IntPoint.h" #include "IntRect.h" #include "IntSize.h" diff --git a/src/3rdparty/webkit/WebCore/platform/android/ClipboardAndroid.h b/src/3rdparty/webkit/WebCore/platform/android/ClipboardAndroid.h index 7761704af..8c9d9fa94 100644 --- a/src/3rdparty/webkit/WebCore/platform/android/ClipboardAndroid.h +++ b/src/3rdparty/webkit/WebCore/platform/android/ClipboardAndroid.h @@ -33,31 +33,31 @@ namespace WebCore { - class CachedImage; +class CachedImage; - class ClipboardAndroid : public Clipboard, public CachedResourceClient { - public: - ClipboardAndroid(ClipboardAccessPolicy policy, bool isForDragging); - ~ClipboardAndroid(); - - void clearData(const String&); - void clearAllData(); - String getData(const String&, bool& success) const; - bool setData(const String&, const String&); - - // extensions beyond IE's API - HashSet<String> types() const; +class ClipboardAndroid : public Clipboard, public CachedResourceClient { +public: + ClipboardAndroid(ClipboardAccessPolicy policy, bool isForDragging); + ~ClipboardAndroid(); + + void clearData(const String&); + void clearAllData(); + String getData(const String&, bool& success) const; + bool setData(const String&, const String&); + + // extensions beyond IE's API + HashSet<String> types() const; + + void setDragImage(CachedImage*, const IntPoint&); + void setDragImageElement(Node*, const IntPoint&); - void setDragImage(CachedImage*, const IntPoint&); - void setDragImageElement(Node*, const IntPoint&); - - virtual DragImageRef createDragImage(IntPoint&) const; - virtual void declareAndWriteDragImage(Element*, const KURL&, const String&, Frame*); - virtual void writeURL(const KURL&, const String&, Frame*); - virtual void writeRange(Range*, Frame*); + virtual DragImageRef createDragImage(IntPoint&) const; + virtual void declareAndWriteDragImage(Element*, const KURL&, const String&, Frame*); + virtual void writeURL(const KURL&, const String&, Frame*); + virtual void writeRange(Range*, Frame*); - virtual bool hasData(); - }; + virtual bool hasData(); +}; } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/android/CursorAndroid.cpp b/src/3rdparty/webkit/WebCore/platform/android/CursorAndroid.cpp index 5c6e473d6..beef3b295 100644 --- a/src/3rdparty/webkit/WebCore/platform/android/CursorAndroid.cpp +++ b/src/3rdparty/webkit/WebCore/platform/android/CursorAndroid.cpp @@ -23,6 +23,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + #define LOG_TAG "WebCore" #include "config.h" @@ -282,12 +283,14 @@ const Cursor& westPanningCursor() return c; } -const Cursor& grabCursor() { +const Cursor& grabCursor() +{ notImplemented(); return c; } -const Cursor& grabbingCursor() { +const Cursor& grabbingCursor() +{ notImplemented(); return c; } diff --git a/src/3rdparty/webkit/WebCore/platform/android/FileChooserAndroid.cpp b/src/3rdparty/webkit/WebCore/platform/android/FileChooserAndroid.cpp index ec1b75820..caedc7aa6 100644 --- a/src/3rdparty/webkit/WebCore/platform/android/FileChooserAndroid.cpp +++ b/src/3rdparty/webkit/WebCore/platform/android/FileChooserAndroid.cpp @@ -36,10 +36,9 @@ String FileChooser::basenameForWidth(const Font& font, int width) const return String(); // FIXME: This could be a lot faster, but assuming the data will not // often be much longer than the provided width, this may be fast enough. - String output = m_filenames[0].copy(); - while (font.width(TextRun(output.impl())) > width && output.length() > 4) { + String output = m_filenames[0].threadsafeCopy(); + while (font.width(TextRun(output.impl())) > width && output.length() > 4) output = output.replace(output.length() - 4, 4, String("...")); - } return output; } diff --git a/src/3rdparty/webkit/WebCore/platform/android/FileSystemAndroid.cpp b/src/3rdparty/webkit/WebCore/platform/android/FileSystemAndroid.cpp index f2665a2b8..46c12970e 100644 --- a/src/3rdparty/webkit/WebCore/platform/android/FileSystemAndroid.cpp +++ b/src/3rdparty/webkit/WebCore/platform/android/FileSystemAndroid.cpp @@ -30,12 +30,12 @@ #include "CString.h" #include "StringBuilder.h" -#include <fnmatch.h> -#include <dlfcn.h> +#include "cutils/log.h" #include <dirent.h> +#include <dlfcn.h> #include <errno.h> +#include <fnmatch.h> #include <sys/stat.h> -#include "cutils/log.h" namespace WebCore { @@ -72,7 +72,7 @@ CString openTemporaryFile(const char* prefix, PlatformFileHandle& handle) bool unloadModule(PlatformModule module) { - return dlclose(module) == 0; + return !dlclose(module); } void closeFile(PlatformFileHandle& handle) @@ -90,7 +90,7 @@ int writeToFile(PlatformFileHandle handle, const char* data, int length) int bytesWritten = write(handle, data, (size_t)(length - totalBytesWritten)); if (bytesWritten < 0 && errno != EINTR) return -1; - else if (bytesWritten > 0) + if (bytesWritten > 0) totalBytesWritten += bytesWritten; } diff --git a/src/3rdparty/webkit/WebCore/platform/android/KeyEventAndroid.cpp b/src/3rdparty/webkit/WebCore/platform/android/KeyEventAndroid.cpp index ab848bdc2..d3c48f5d5 100644 --- a/src/3rdparty/webkit/WebCore/platform/android/KeyEventAndroid.cpp +++ b/src/3rdparty/webkit/WebCore/platform/android/KeyEventAndroid.cpp @@ -41,128 +41,128 @@ namespace WebCore { static int windowsKeyCodeForKeyEvent(unsigned int keyCode) { // Does not provide all key codes, and does not handle all keys. - switch(keyCode) { - case kKeyCodeDel: - return VK_BACK; - case kKeyCodeTab: - return VK_TAB; - case kKeyCodeClear: - return VK_CLEAR; - case kKeyCodeDpadCenter: - case kKeyCodeNewline: - return VK_RETURN; - case kKeyCodeShiftLeft: - case kKeyCodeShiftRight: - return VK_SHIFT; - // back will serve as escape, although we probably do not have access to it - case kKeyCodeBack: - return VK_ESCAPE; - case kKeyCodeSpace: - return VK_SPACE; - case kKeyCodeHome: - return VK_HOME; - case kKeyCodeDpadLeft: - return VK_LEFT; - case kKeyCodeDpadUp: - return VK_UP; - case kKeyCodeDpadRight: - return VK_RIGHT; - case kKeyCodeDpadDown: - return VK_DOWN; - case kKeyCode0: - return VK_0; - case kKeyCode1: - return VK_1; - case kKeyCode2: - return VK_2; - case kKeyCode3: - return VK_3; - case kKeyCode4: - return VK_4; - case kKeyCode5: - return VK_5; - case kKeyCode6: - return VK_6; - case kKeyCode7: - return VK_7; - case kKeyCode8: - return VK_8; - case kKeyCode9: - return VK_9; - case kKeyCodeA: - return VK_A; - case kKeyCodeB: - return VK_B; - case kKeyCodeC: - return VK_C; - case kKeyCodeD: - return VK_D; - case kKeyCodeE: - return VK_E; - case kKeyCodeF: - return VK_F; - case kKeyCodeG: - return VK_G; - case kKeyCodeH: - return VK_H; - case kKeyCodeI: - return VK_I; - case kKeyCodeJ: - return VK_J; - case kKeyCodeK: - return VK_K; - case kKeyCodeL: - return VK_L; - case kKeyCodeM: - return VK_M; - case kKeyCodeN: - return VK_N; - case kKeyCodeO: - return VK_O; - case kKeyCodeP: - return VK_P; - case kKeyCodeQ: - return VK_Q; - case kKeyCodeR: - return VK_R; - case kKeyCodeS: - return VK_S; - case kKeyCodeT: - return VK_T; - case kKeyCodeU: - return VK_U; - case kKeyCodeV: - return VK_V; - case kKeyCodeW: - return VK_W; - case kKeyCodeX: - return VK_X; - case kKeyCodeY: - return VK_Y; - case kKeyCodeZ: - return VK_Z; - // colon - case kKeyCodeSemicolon: - return VK_OEM_1; - case kKeyCodeComma: - return VK_OEM_COMMA; - case kKeyCodeMinus: - return VK_OEM_MINUS; - case kKeyCodeEquals: - return VK_OEM_PLUS; - case kKeyCodePeriod: - return VK_OEM_PERIOD; - case kKeyCodeSlash: - return VK_OEM_2; - // maybe not the right choice - case kKeyCodeLeftBracket: - return VK_OEM_4; - case kKeyCodeBackslash: - return VK_OEM_5; - case kKeyCodeRightBracket: - return VK_OEM_6; - default: - return 0; + switch (keyCode) { + case kKeyCodeDel: + return VK_BACK; + case kKeyCodeTab: + return VK_TAB; + case kKeyCodeClear: + return VK_CLEAR; + case kKeyCodeDpadCenter: + case kKeyCodeNewline: + return VK_RETURN; + case kKeyCodeShiftLeft: + case kKeyCodeShiftRight: + return VK_SHIFT; + // back will serve as escape, although we probably do not have access to it + case kKeyCodeBack: + return VK_ESCAPE; + case kKeyCodeSpace: + return VK_SPACE; + case kKeyCodeHome: + return VK_HOME; + case kKeyCodeDpadLeft: + return VK_LEFT; + case kKeyCodeDpadUp: + return VK_UP; + case kKeyCodeDpadRight: + return VK_RIGHT; + case kKeyCodeDpadDown: + return VK_DOWN; + case kKeyCode0: + return VK_0; + case kKeyCode1: + return VK_1; + case kKeyCode2: + return VK_2; + case kKeyCode3: + return VK_3; + case kKeyCode4: + return VK_4; + case kKeyCode5: + return VK_5; + case kKeyCode6: + return VK_6; + case kKeyCode7: + return VK_7; + case kKeyCode8: + return VK_8; + case kKeyCode9: + return VK_9; + case kKeyCodeA: + return VK_A; + case kKeyCodeB: + return VK_B; + case kKeyCodeC: + return VK_C; + case kKeyCodeD: + return VK_D; + case kKeyCodeE: + return VK_E; + case kKeyCodeF: + return VK_F; + case kKeyCodeG: + return VK_G; + case kKeyCodeH: + return VK_H; + case kKeyCodeI: + return VK_I; + case kKeyCodeJ: + return VK_J; + case kKeyCodeK: + return VK_K; + case kKeyCodeL: + return VK_L; + case kKeyCodeM: + return VK_M; + case kKeyCodeN: + return VK_N; + case kKeyCodeO: + return VK_O; + case kKeyCodeP: + return VK_P; + case kKeyCodeQ: + return VK_Q; + case kKeyCodeR: + return VK_R; + case kKeyCodeS: + return VK_S; + case kKeyCodeT: + return VK_T; + case kKeyCodeU: + return VK_U; + case kKeyCodeV: + return VK_V; + case kKeyCodeW: + return VK_W; + case kKeyCodeX: + return VK_X; + case kKeyCodeY: + return VK_Y; + case kKeyCodeZ: + return VK_Z; + // colon + case kKeyCodeSemicolon: + return VK_OEM_1; + case kKeyCodeComma: + return VK_OEM_COMMA; + case kKeyCodeMinus: + return VK_OEM_MINUS; + case kKeyCodeEquals: + return VK_OEM_PLUS; + case kKeyCodePeriod: + return VK_OEM_PERIOD; + case kKeyCodeSlash: + return VK_OEM_2; + // maybe not the right choice + case kKeyCodeLeftBracket: + return VK_OEM_4; + case kKeyCodeBackslash: + return VK_OEM_5; + case kKeyCodeRightBracket: + return VK_OEM_6; + default: + return 0; } } @@ -171,28 +171,28 @@ static String keyIdentifierForAndroidKeyCode(int keyCode) // Does not return all of the same key identifiers, and // does not handle all the keys. switch (keyCode) { - case kKeyCodeClear: - return "Clear"; - case kKeyCodeNewline: - case kKeyCodeDpadCenter: - return "Enter"; - case kKeyCodeHome: - return "Home"; - case kKeyCodeDpadDown: - return "Down"; - case kKeyCodeDpadLeft: - return "Left"; - case kKeyCodeDpadRight: - return "Right"; - case kKeyCodeDpadUp: - return "Up"; - // Standard says that DEL becomes U+00007F. - case kKeyCodeDel: - return "U+00007F"; - default: - char upper[16]; - sprintf(upper, "U+%06X", windowsKeyCodeForKeyEvent(keyCode)); - return String(upper); + case kKeyCodeClear: + return "Clear"; + case kKeyCodeNewline: + case kKeyCodeDpadCenter: + return "Enter"; + case kKeyCodeHome: + return "Home"; + case kKeyCodeDpadDown: + return "Down"; + case kKeyCodeDpadLeft: + return "Left"; + case kKeyCodeDpadRight: + return "Right"; + case kKeyCodeDpadUp: + return "Up"; + // Standard says that DEL becomes U+00007F. + case kKeyCodeDel: + return "U+00007F"; + default: + char upper[16]; + sprintf(upper, "U+%06X", windowsKeyCodeForKeyEvent(keyCode)); + return String(upper); } } diff --git a/src/3rdparty/webkit/WebCore/platform/android/ScreenAndroid.cpp b/src/3rdparty/webkit/WebCore/platform/android/ScreenAndroid.cpp index 2439c1f6d..dcd2d100b 100644 --- a/src/3rdparty/webkit/WebCore/platform/android/ScreenAndroid.cpp +++ b/src/3rdparty/webkit/WebCore/platform/android/ScreenAndroid.cpp @@ -31,14 +31,12 @@ #include "FloatRect.h" #include "Widget.h" - +#include "ui/DisplayInfo.h" +#include "ui/PixelFormat.h" +#include "ui/SurfaceComposerClient.h" #undef LOG // FIXME: Still have to do this to get the log to show up #include "utils/Log.h" -#include "ui/SurfaceComposerClient.h" -#include "ui/PixelFormat.h" -#include "ui/DisplayInfo.h" - namespace WebCore { int screenDepth(Widget* page) @@ -70,18 +68,18 @@ int Screen::orientation() const // to the values described here // (http://developer.apple.com/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/chapter_8_section_6.html) switch (info.orientation) { - case android::ISurfaceComposer::eOrientationDefault: - return 0; - case android::ISurfaceComposer::eOrientation90: - return 90; - case android::ISurfaceComposer::eOrientation180: - return 180; - case android::ISurfaceComposer::eOrientation270: - return -90; - default: - LOGE("Bad orientation returned from getDisplayIndo %d", - info.orientation); - return 0; + case android::ISurfaceComposer::eOrientationDefault: + return 0; + case android::ISurfaceComposer::eOrientation90: + return 90; + case android::ISurfaceComposer::eOrientation180: + return 180; + case android::ISurfaceComposer::eOrientation270: + return -90; + default: + LOGE("Bad orientation returned from getDisplayIndo %d", + info.orientation); + return 0; } } #endif diff --git a/src/3rdparty/webkit/WebCore/platform/android/TemporaryLinkStubs.cpp b/src/3rdparty/webkit/WebCore/platform/android/TemporaryLinkStubs.cpp index b68a74cd1..b82edaf50 100644 --- a/src/3rdparty/webkit/WebCore/platform/android/TemporaryLinkStubs.cpp +++ b/src/3rdparty/webkit/WebCore/platform/android/TemporaryLinkStubs.cpp @@ -28,17 +28,15 @@ #define ANDROID_COMPILE_HACK -#include <stdio.h> -#include <stdlib.h> #include "AXObjectCache.h" +#include "CString.h" #include "CachedPage.h" #include "CachedResource.h" -#include "CookieJar.h" +#include "Clipboard.h" #include "Console.h" #include "ContextMenu.h" #include "ContextMenuItem.h" -#include "Clipboard.h" -#include "CString.h" +#include "CookieJar.h" #include "Cursor.h" #include "Database.h" #include "DocumentFragment.h" @@ -49,8 +47,8 @@ #include "FileList.h" #include "Font.h" #include "Frame.h" -#include "FrameLoader.h" #include "FrameLoadRequest.h" +#include "FrameLoader.h" #include "FrameView.h" #include "GraphicsContext.h" #include "HTMLFrameOwnerElement.h" @@ -60,21 +58,11 @@ #include "IconDatabase.h" #include "IconLoader.h" #include "IntPoint.h" - -#if USE(JSC) -#include "JavaScriptCallFrame.h" -#include "JavaScriptDebugServer.h" -#include "API/JSClassRef.h" -#include "JavaScriptProfile.h" -#include "jni_utility.h" -#endif - #include "KURL.h" #include "Language.h" -#include "loader.h" #include "LocalizedStrings.h" -#include "MainResourceLoader.h" #include "MIMETypeRegistry.h" +#include "MainResourceLoader.h" #include "Node.h" #include "NotImplemented.h" #include "PageCache.h" @@ -89,6 +77,17 @@ #include "ScrollbarTheme.h" #include "SmartReplace.h" #include "Widget.h" +#include "loader.h" +#include <stdio.h> +#include <stdlib.h> + +#if USE(JSC) +#include "API/JSClassRef.h" +#include "JavaScriptCallFrame.h" +#include "JavaScriptDebugServer.h" +#include "JavaScriptProfile.h" +#include "jni_utility.h" +#endif using namespace WebCore; @@ -175,6 +174,11 @@ void Pasteboard::writeSelection(Range*, bool, Frame*) notImplemented(); } +void Pasteboard::writePlainText(const String&) +{ + notImplemented(); +} + void Pasteboard::writeURL(const KURL&, const String&, Frame*) { notImplemented(); diff --git a/src/3rdparty/webkit/WebCore/platform/animation/Animation.h b/src/3rdparty/webkit/WebCore/platform/animation/Animation.h index 9e1e8e1c2..306a1b9fb 100644 --- a/src/3rdparty/webkit/WebCore/platform/animation/Animation.h +++ b/src/3rdparty/webkit/WebCore/platform/animation/Animation.h @@ -35,12 +35,6 @@ namespace WebCore { const int cAnimateNone = 0; const int cAnimateAll = -2; -// These were in RenderStyle, but have been moved here as -// animation-play-state is in the process of being removed. - -const unsigned AnimPlayStatePlaying = 0; -const unsigned AnimPlayStatePaused = 1; - class Animation : public RefCounted<Animation> { public: ~Animation(); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h b/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h index 8b770a173..7e8f2b075 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/BitmapImage.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2008-2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -44,6 +45,10 @@ class NSImage; typedef struct HBITMAP__ *HBITMAP; #endif +#if PLATFORM(HAIKU) +class BBitmap; +#endif + namespace WebCore { struct FrameData; } @@ -135,6 +140,9 @@ public: virtual CGImageRef getCGImageRef(); #endif +#if PLATFORM(WIN) || (PLATFORM(QT) && PLATFORM(WIN_OS)) + static PassRefPtr<BitmapImage> create(HBITMAP); +#endif #if PLATFORM(WIN) virtual bool getHBITMAP(HBITMAP); virtual bool getHBITMAPOfSize(HBITMAP, LPSIZE); @@ -160,10 +168,16 @@ protected: virtual void drawFrameMatchingSourceSize(GraphicsContext*, const FloatRect& dstRect, const IntSize& srcSize, CompositeOperator); #endif virtual void draw(GraphicsContext*, const FloatRect& dstRect, const FloatRect& srcRect, CompositeOperator); -#if PLATFORM(WX) + +#if PLATFORM(WX) || (PLATFORM(WINCE) && !PLATFORM(QT)) virtual void drawPattern(GraphicsContext*, const FloatRect& srcRect, const TransformationMatrix& patternTransform, const FloatPoint& phase, CompositeOperator, const FloatRect& destRect); -#endif +#endif + +#if PLATFORM(HAIKU) + virtual BBitmap* getBBitmap() const; +#endif + size_t currentFrame() const { return m_currentFrame; } size_t frameCount(); NativeImagePtr frameAtIndex(size_t); @@ -220,7 +234,11 @@ protected: { if (!m_checkedForSolidColor && frameCount() > 0) { checkForSolidColor(); + // WINCE PORT: checkForSolidColor() doesn't set m_checkedForSolidColor until + // it gets enough information to make final decision. +#if !PLATFORM(WINCE) ASSERT(m_checkedForSolidColor); +#endif } return m_isSolidColor && m_currentFrame == 0; } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/Color.h b/src/3rdparty/webkit/WebCore/platform/graphics/Color.h index 7ac432f40..4fa151380 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/Color.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/Color.h @@ -47,6 +47,10 @@ typedef struct _GdkColor GdkColor; class wxColour; #endif +#if PLATFORM(HAIKU) +struct rgb_color; +#endif + namespace WebCore { class String; @@ -121,6 +125,11 @@ public: Color(CGColorRef); #endif +#if PLATFORM(HAIKU) + Color(const rgb_color&); + operator rgb_color() const; +#endif + static bool parseHexColor(const String& name, RGBA32& rgb); static const RGBA32 black = 0xFF000000; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint.h b/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint.h index 157c1e7cb..45a1e832d 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint.h @@ -36,7 +36,7 @@ typedef struct CGPoint CGPoint; #endif -#if PLATFORM(MAC) +#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES typedef struct CGPoint NSPoint; #else @@ -51,6 +51,10 @@ class QPointF; QT_END_NAMESPACE #endif +#if PLATFORM(HAIKU) +class BPoint; +#endif + #if PLATFORM(SKIA) struct SkPoint; #endif @@ -80,7 +84,8 @@ public: operator CGPoint() const; #endif -#if PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) +#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ + || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) FloatPoint(const NSPoint&); operator NSPoint() const; #endif @@ -90,6 +95,11 @@ public: operator QPointF() const; #endif +#if PLATFORM(HAIKU) + FloatPoint(const BPoint&); + operator BPoint() const; +#endif + #if PLATFORM(SKIA) operator SkPoint() const; FloatPoint(const SkPoint&); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint3D.h b/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint3D.h index 2e71ddd73..73c3a37c9 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint3D.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FloatPoint3D.h @@ -49,6 +49,16 @@ private: float m_z; }; +inline bool operator==(const FloatPoint3D& a, const FloatPoint3D& b) +{ + return a.x() == b.x() && a.y() == b.y() && a.z() == b.z(); +} + +inline bool operator!=(const FloatPoint3D& a, const FloatPoint3D& b) +{ + return a.x() != b.x() || a.y() != b.y() || a.z() != b.z(); +} + } // namespace WebCore #endif // FloatPoint3D_h diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FloatRect.h b/src/3rdparty/webkit/WebCore/platform/graphics/FloatRect.h index 0723eb783..073f13569 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/FloatRect.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FloatRect.h @@ -33,7 +33,7 @@ typedef struct CGRect CGRect; #endif -#if PLATFORM(MAC) +#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES typedef struct CGRect NSRect; #else @@ -51,6 +51,10 @@ QT_END_NAMESPACE class wxRect2DDouble; #endif +#if PLATFORM(HAIKU) +class BRect; +#endif + #if PLATFORM(SKIA) struct SkRect; #endif @@ -123,7 +127,8 @@ public: operator CGRect() const; #endif -#if PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) +#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ + || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) FloatRect(const NSRect&); operator NSRect() const; #endif @@ -138,6 +143,11 @@ public: operator wxRect2DDouble() const; #endif +#if PLATFORM(HAIKU) + FloatRect(const BRect&); + operator BRect() const; +#endif + #if PLATFORM(SKIA) FloatRect(const SkRect&); operator SkRect() const; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FloatSize.h b/src/3rdparty/webkit/WebCore/platform/graphics/FloatSize.h index 6e792b69f..5a84fd1a1 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/FloatSize.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FloatSize.h @@ -34,7 +34,7 @@ typedef struct CGSize CGSize; #endif -#if PLATFORM(MAC) +#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES typedef struct CGSize NSSize; #else @@ -79,7 +79,8 @@ public: operator CGSize() const; #endif -#if PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) +#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ + || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) explicit FloatSize(const NSSize &); // don't do this implicitly since it's lossy operator NSSize() const; #endif diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FontCache.h b/src/3rdparty/webkit/WebCore/platform/graphics/FontCache.h index 3c0f2d916..b88305f8d 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/FontCache.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FontCache.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2006, 2008 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2007-2008 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -63,7 +64,15 @@ public: // Also implemented by the platform. void platformInit(); -#if PLATFORM(WIN) +#if PLATFORM(WINCE) && !PLATFORM(QT) +#if defined(IMLANG_FONT_LINK) && (IMLANG_FONT_LINK == 2) + IMLangFontLink2* getFontLinkInterface(); +#else + IMLangFontLink* getFontLinkInterface(); +#endif + static void comInitialize(); + static void comUninitialize(); +#elif PLATFORM(WIN) IMLangFontLink2* getFontLinkInterface(); #endif diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h b/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h index c893b8a11..fc63db9e7 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FontDescription.h @@ -27,7 +27,9 @@ #include "FontFamily.h" #include "FontRenderingMode.h" +#include "FontSmoothingMode.h" #include "FontTraitsMask.h" +#include "TextRenderingMode.h" namespace WebCore { @@ -61,6 +63,8 @@ public: , m_usePrinterFont(false) , m_renderingMode(NormalRenderingMode) , m_keywordSize(0) + , m_fontSmoothing(AutoSmoothing) + , m_textRendering(AutoTextRendering) { } @@ -80,8 +84,12 @@ public: FontWeight bolderWeight() const; GenericFamilyType genericFamily() const { return static_cast<GenericFamilyType>(m_genericFamily); } bool usePrinterFont() const { return m_usePrinterFont; } + // only use fixed default size when there is only one font family, and that family is "monospace" + bool useFixedDefaultSize() const { return genericFamily() == MonospaceFamily && !family().next() && family().family() == "-webkit-monospace"; } FontRenderingMode renderingMode() const { return static_cast<FontRenderingMode>(m_renderingMode); } unsigned keywordSize() const { return m_keywordSize; } + FontSmoothingMode fontSmoothing() const { return static_cast<FontSmoothingMode>(m_fontSmoothing); } + TextRenderingMode textRenderingMode() const { return static_cast<TextRenderingMode>(m_textRendering); } FontTraitsMask traitsMask() const; @@ -96,6 +104,8 @@ public: void setUsePrinterFont(bool p) { m_usePrinterFont = p; } void setRenderingMode(FontRenderingMode mode) { m_renderingMode = mode; } void setKeywordSize(unsigned s) { m_keywordSize = s; } + void setFontSmoothing(FontSmoothingMode smoothing) { m_fontSmoothing = smoothing; } + void setTextRenderingMode(TextRenderingMode rendering) { m_textRendering = rendering; } private: FontFamily m_familyList; // The list of font families to be used. @@ -117,6 +127,9 @@ private: unsigned m_keywordSize : 4; // We cache whether or not a font is currently represented by a CSS keyword (e.g., medium). If so, // then we can accurately translate across different generic families to adjust for different preference settings // (e.g., 13px monospace vs. 16px everything else). Sizes are 1-8 (like the HTML size values for <font>). + + unsigned m_fontSmoothing : 2; // FontSmoothingMode + unsigned m_textRendering : 2; // TextRenderingMode }; inline bool FontDescription::operator==(const FontDescription& other) const @@ -131,7 +144,9 @@ inline bool FontDescription::operator==(const FontDescription& other) const && m_genericFamily == other.m_genericFamily && m_usePrinterFont == other.m_usePrinterFont && m_renderingMode == other.m_renderingMode - && m_keywordSize == other.m_keywordSize; + && m_keywordSize == other.m_keywordSize + && m_fontSmoothing == other.m_fontSmoothing + && m_textRendering == other.m_textRendering; } } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp index 74b7ec18b..5246593c7 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FontFastPath.cpp @@ -1,6 +1,7 @@ /** * Copyright (C) 2003, 2006 Apple Computer, Inc. * Copyright (C) 2008 Holger Hans Peter Freyther + * Copyright (C) 2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -155,16 +156,33 @@ GlyphData Font::glyphDataForCharacter(UChar32 c, bool mirror, bool forceSmallCap GlyphPage* fallbackPage = GlyphPageTreeNode::getRootChild(characterFontData, pageNumber)->page(); GlyphData data = fallbackPage && fallbackPage->fontDataForCharacter(c) ? fallbackPage->glyphDataForCharacter(c) : characterFontData->missingGlyphData(); // Cache it so we don't have to do system fallback again next time. - if (!useSmallCapsFont) + if (!useSmallCapsFont) { +#if PLATFORM(WINCE) + // missingGlyphData returns a null character, which is not suitable for GDI to display. + // Also, sometimes we cannot map a font for the character on WINCE, but GDI can still + // display the character, probably because the font package is not installed correctly. + // So we just always set the glyph to be same as the character, and let GDI solve it. + page->setGlyphDataForCharacter(c, c, characterFontData); + return page->glyphDataForCharacter(c); +#else page->setGlyphDataForCharacter(c, data.glyph, data.fontData); +#endif + } return data; } // Even system fallback can fail; use the missing glyph in that case. // FIXME: It would be nicer to use the missing glyph from the last resort font instead. GlyphData data = primaryFont()->missingGlyphData(); - if (!useSmallCapsFont) + if (!useSmallCapsFont) { +#if PLATFORM(WINCE) + // See comment about WINCE GDI handling near setGlyphDataForCharacter above. + page->setGlyphDataForCharacter(c, c, data.fontData); + return page->glyphDataForCharacter(c); +#else page->setGlyphDataForCharacter(c, data.glyph, data.fontData); +#endif + } return data; } @@ -233,6 +251,10 @@ bool Font::canUseGlyphCache(const TextRun& run) const return false; } + TextRenderingMode textMode = m_fontDescription.textRenderingMode(); + if (textMode == OptimizeLegibility || textMode == GeometricPrecision) + return false; + return true; } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/FontSmoothingMode.h b/src/3rdparty/webkit/WebCore/platform/graphics/FontSmoothingMode.h new file mode 100644 index 000000000..7c23394f1 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/graphics/FontSmoothingMode.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 FontSmoothingMode_h +#define FontSmoothingMode_h + +namespace WebCore { + + enum FontSmoothingMode { AutoSmoothing, NoSmoothing, Antialiased, SubpixelAntialiased }; + +} // namespace WebCore + +#endif // FontSmoothingMode_h diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GeneratedImage.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/GeneratedImage.cpp index c40a40ae1..bac9da018 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GeneratedImage.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GeneratedImage.cpp @@ -51,7 +51,7 @@ void GeneratedImage::drawPattern(GraphicsContext* context, const FloatRect& srcR const FloatPoint& phase, CompositeOperator compositeOp, const FloatRect& destRect) { // Create a BitmapImage and call drawPattern on it. - OwnPtr<ImageBuffer> imageBuffer = ImageBuffer::create(m_size, false); + OwnPtr<ImageBuffer> imageBuffer = ImageBuffer::create(m_size); ASSERT(imageBuffer.get()); // Fill with the gradient. diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GlyphBuffer.h b/src/3rdparty/webkit/WebCore/platform/graphics/GlyphBuffer.h index dcda419bd..04491a7ce 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GlyphBuffer.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GlyphBuffer.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2006, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2007-2008 Torch Mobile Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -49,6 +50,8 @@ class SimpleFontData; #if PLATFORM(CAIRO) // FIXME: Why does Cairo use such a huge struct instead of just an offset into an array? typedef cairo_glyph_t GlyphBufferGlyph; +#elif PLATFORM(WINCE) +typedef wchar_t GlyphBufferGlyph; #else typedef Glyph GlyphBufferGlyph; #endif @@ -57,6 +60,10 @@ typedef Glyph GlyphBufferGlyph; // can be passed directly to CGContextShowGlyphsWithAdvances in FontMac.mm #if PLATFORM(CG) typedef CGSize GlyphBufferAdvance; +#elif PLATFORM(WINCE) +// There is no cross-platform code that uses the height of GlyphBufferAdvance, +// so we can save memory space on embedded devices by storing only the width +typedef float GlyphBufferAdvance; #else typedef FloatSize GlyphBufferAdvance; #endif @@ -117,6 +124,8 @@ public: { #if PLATFORM(CG) return m_advances[index].width; +#elif PLATFORM(WINCE) + return m_advances[index]; #else return m_advances[index].width(); #endif @@ -147,6 +156,8 @@ public: #if PLATFORM(CG) CGSize advance = { width, 0 }; m_advances.append(advance); +#elif PLATFORM(WINCE) + m_advances.append(width); #else m_advances.append(FloatSize(width, 0)); #endif @@ -161,6 +172,7 @@ public: #endif } +#if !PLATFORM(WINCE) void add(Glyph glyph, const SimpleFontData* font, GlyphBufferAdvance advance) { m_fontData.append(font); @@ -174,6 +186,7 @@ public: m_advances.append(advance); } +#endif private: Vector<const SimpleFontData*, 2048> m_fontData; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GlyphPageTreeNode.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/GlyphPageTreeNode.cpp index 6419e0c4e..9f53f0b57 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GlyphPageTreeNode.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GlyphPageTreeNode.cpp @@ -202,8 +202,10 @@ void GlyphPageTreeNode::initializePage(const FontData* fontData, unsigned pageNu GlyphPage* pageToFill = m_page.get(); for (unsigned i = 0; i < numRanges; i++) { const FontDataRange& range = segmentedFontData->rangeAt(i); - int from = max(0, range.from() - static_cast<int>(start)); - int to = 1 + min(range.to() - static_cast<int>(start), static_cast<int>(GlyphPage::size) - 1); + // all this casting is to ensure all the parameters to min and max have the same type, + // to avoid ambiguous template parameter errors on Windows + int from = max(0, static_cast<int>(range.from()) - static_cast<int>(start)); + int to = 1 + min(static_cast<int>(range.to()) - static_cast<int>(start), static_cast<int>(GlyphPage::size) - 1); if (from < static_cast<int>(GlyphPage::size) && to > 0) { if (haveGlyphs && !scratchPage) { scratchPage = GlyphPage::create(this); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/Gradient.h b/src/3rdparty/webkit/WebCore/platform/graphics/Gradient.h index a74b1ef56..0e39e7330 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/Gradient.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/Gradient.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. * Copyright (C) 2007 Alp Toker <alp@atoker.com> + * Copyright (C) 2008 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -73,8 +74,17 @@ namespace WebCore { void getColor(float value, float* r, float* g, float* b, float* a) const; +#if PLATFORM(WINCE) && !PLATFORM(QT) + const FloatPoint& p0() const { return m_p0; } + const FloatPoint& p1() const { return m_p1; } + float r0() const { return m_r0; } + float r1() const { return m_r1; } + bool isRadial() const { return m_radial; } + struct ColorStop; + const Vector<ColorStop>& getStops() const; +#else PlatformGradient platformGradient(); - +#endif struct ColorStop { float stop; float red; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.cpp index 3e36f7316..ccdce089b 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.cpp @@ -27,9 +27,9 @@ #include "GraphicsContext.h" #include "BidiResolver.h" +#include "Font.h" #include "Generator.h" #include "GraphicsContextPrivate.h" -#include "Font.h" using namespace std; @@ -89,7 +89,7 @@ void GraphicsContext::save() return; m_common->stack.append(m_common->state); - + savePlatformState(); } @@ -104,7 +104,7 @@ void GraphicsContext::restore() } m_common->state = m_common->stack.last(); m_common->stack.removeLast(); - + restorePlatformState(); } @@ -305,7 +305,7 @@ bool GraphicsContext::paintingDisabled() const } void GraphicsContext::drawImage(Image* image, const IntPoint& p, CompositeOperator op) -{ +{ drawImage(image, p, IntRect(0, 0, -1, -1), op); } @@ -324,13 +324,15 @@ void GraphicsContext::drawImage(Image* image, const IntRect& dest, const IntRect drawImage(image, FloatRect(dest), srcRect, op, useLowQualityScale); } +#if !PLATFORM(WINCE) || PLATFORM(QT) void GraphicsContext::drawText(const Font& font, const TextRun& run, const IntPoint& point, int from, int to) { if (paintingDisabled()) return; - + font.drawText(this, run, point, from, to); } +#endif void GraphicsContext::drawBidiText(const Font& font, const TextRun& run, const FloatPoint& point) { @@ -381,7 +383,7 @@ void GraphicsContext::initFocusRing(int width, int offset) if (paintingDisabled()) return; clearFocusRing(); - + m_common->m_focusRingWidth = width; m_common->m_focusRingOffset = offset; } @@ -394,12 +396,12 @@ void GraphicsContext::clearFocusRing() IntRect GraphicsContext::focusRingBoundingRect() { IntRect result = IntRect(0, 0, 0, 0); - + const Vector<IntRect>& rects = focusRingRects(); unsigned rectCount = rects.size(); for (unsigned i = 0; i < rectCount; i++) result.unite(rects[i]); - + return result; } @@ -434,7 +436,7 @@ void GraphicsContext::drawImage(Image* image, const FloatRect& dest, const Float float tsh = src.height(); float tw = dest.width(); float th = dest.height(); - + if (tsw == -1) tsw = image->width(); if (tsh == -1) @@ -538,10 +540,39 @@ void GraphicsContext::setPlatformTextDrawingMode(int mode) } #endif -#if !PLATFORM(QT) && !PLATFORM(CAIRO) && !PLATFORM(SKIA) +#if !PLATFORM(QT) && !PLATFORM(CAIRO) && !PLATFORM(SKIA) && !PLATFORM(HAIKU) void GraphicsContext::setPlatformStrokeStyle(const StrokeStyle&) { } #endif +void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2, float strokeWidth, const StrokeStyle& penStyle) +{ + // For odd widths, we add in 0.5 to the appropriate x/y so that the float arithmetic + // works out. For example, with a border width of 3, WebKit will pass us (y1+y2)/2, e.g., + // (50+53)/2 = 103/2 = 51 when we want 51.5. It is always true that an even width gave + // us a perfect position, but an odd width gave us a position that is off by exactly 0.5. + if (penStyle == DottedStroke || penStyle == DashedStroke) { + if (p1.x() == p2.x()) { + p1.setY(p1.y() + strokeWidth); + p2.setY(p2.y() - strokeWidth); + } else { + p1.setX(p1.x() + strokeWidth); + p2.setX(p2.x() - strokeWidth); + } + } + + if (static_cast<int>(strokeWidth) % 2) { //odd + if (p1.x() == p2.x()) { + // We're a vertical line. Adjust our x. + p1.setX(p1.x() + 0.5f); + p2.setX(p2.x() + 0.5f); + } else { + // We're a horizontal line. Adjust our y. + p1.setY(p1.y() + 0.5f); + p2.setY(p2.y() + 0.5f); + } + } +} + } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h index 0237abf78..c6bb20c00 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2008-2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -48,8 +49,8 @@ typedef QPainter PlatformGraphicsContext; class wxGCDC; class wxWindowDC; -// wxGraphicsContext allows us to support Path, etc. -// but on some platforms, e.g. Linux, it requires fairly +// wxGraphicsContext allows us to support Path, etc. +// but on some platforms, e.g. Linux, it requires fairly // new software. #if USE(WXGC) // On OS X, wxGCDC is just a typedef for wxDC, so use wxDC explicitly to make @@ -65,6 +66,12 @@ class wxWindowDC; #endif #elif PLATFORM(SKIA) typedef class PlatformContextSkia PlatformGraphicsContext; +#elif PLATFORM(HAIKU) +class BView; +typedef BView PlatformGraphicsContext; +struct pattern; +#elif PLATFORM(WINCE) +typedef struct HDC__ PlatformGraphicsContext; #else typedef void PlatformGraphicsContext; #endif @@ -88,6 +95,12 @@ typedef unsigned char UInt8; namespace WebCore { +#if PLATFORM(WINCE) && !PLATFORM(QT) + class SharedBitmap; + class SimpleFontData; + class GlyphBuffer; +#endif + const int cMisspellingLineThickness = 3; const int cMisspellingLinePatternWidth = 4; const int cMisspellingLinePatternGapWidth = 1; @@ -109,7 +122,7 @@ namespace WebCore { const int cTextFill = 1; const int cTextStroke = 2; const int cTextClip = 4; - + enum StrokeStyle { NoStroke, SolidStroke, @@ -117,12 +130,12 @@ namespace WebCore { DashedStroke }; -// FIXME: This is a place-holder until we decide to add -// real color space support to WebCore. At that time, ColorSpace will be a -// class and instances will be held off of Colors. There will be -// special singleton Gradient and Pattern color spaces to mark when -// a fill or stroke is using a gradient or pattern instead of a solid color. -// https://bugs.webkit.org/show_bug.cgi?id=20558 + // FIXME: This is a place-holder until we decide to add + // real color space support to WebCore. At that time, ColorSpace will be a + // class and instances will be held off of Colors. There will be + // special singleton Gradient and Pattern color spaces to mark when + // a fill or stroke is using a gradient or pattern instead of a solid color. + // https://bugs.webkit.org/show_bug.cgi?id=20558 enum ColorSpace { SolidColorSpace, PatternColorSpace, @@ -141,9 +154,11 @@ namespace WebCore { public: GraphicsContext(PlatformGraphicsContext*); ~GraphicsContext(); - + +#if !PLATFORM(WINCE) || PLATFORM(QT) PlatformGraphicsContext* platformContext() const; - +#endif + float strokeThickness() const; void setStrokeThickness(float); StrokeStyle strokeStyle() const; @@ -219,7 +234,7 @@ namespace WebCore { CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); void drawTiledImage(Image*, const IntRect& destRect, const IntPoint& srcPoint, const IntSize& tileSize, CompositeOperator = CompositeSourceOver); - void drawTiledImage(Image*, const IntRect& destRect, const IntRect& srcRect, + void drawTiledImage(Image*, const IntRect& destRect, const IntRect& srcRect, Image::TileRule hRule = Image::StretchTile, Image::TileRule vRule = Image::StretchTile, CompositeOperator = CompositeSourceOver); @@ -243,13 +258,13 @@ namespace WebCore { void drawHighlightForText(const Font&, const TextRun&, const IntPoint&, int h, const Color& backgroundColor, int from = 0, int to = -1); FloatRect roundToDevicePixels(const FloatRect&); - + void drawLineForText(const IntPoint&, int width, bool printing); void drawLineForMisspellingOrBadGrammar(const IntPoint&, int width, bool grammar); - + bool paintingDisabled() const; void setPaintingDisabled(bool); - + bool updatingControlTints() const; void setUpdatingControlTints(bool); @@ -282,19 +297,40 @@ namespace WebCore { void addPath(const Path&); void clip(const Path&); + + // This clip function is used only by <canvas> code. It allows + // implementations to handle clipping on the canvas differently since + // the disipline is different. + void canvasClip(const Path&); void clipOut(const Path&); void scale(const FloatSize&); void rotate(float angleInRadians); void translate(float x, float y); IntPoint origin(); - + void setURLForRect(const KURL&, const IntRect&); void concatCTM(const TransformationMatrix&); TransformationMatrix getCTM() const; -#if PLATFORM(WIN) +#if PLATFORM(WINCE) && !PLATFORM(QT) + void setBitmap(PassRefPtr<SharedBitmap>); + const TransformationMatrix& affineTransform() const; + TransformationMatrix& affineTransform(); + void resetAffineTransform(); + void fillRect(const FloatRect&, const Gradient*); + void drawText(const SimpleFontData* fontData, const GlyphBuffer& glyphBuffer, int from, int numGlyphs, const FloatPoint& point); + void drawFrameControl(const IntRect& rect, unsigned type, unsigned state); + void drawFocusRect(const IntRect& rect); + void paintTextField(const IntRect& rect, unsigned state); + void drawBitmap(SharedBitmap*, const IntRect& dstRect, const IntRect& srcRect, CompositeOperator compositeOp); + void drawBitmapPattern(SharedBitmap*, const FloatRect& tileRectIn, const TransformationMatrix& patternTransform, const FloatPoint& phase, CompositeOperator op, const FloatRect& destRect, const IntSize& origSourceSize); + void drawIcon(HICON icon, const IntRect& dstRect, UINT flags); + HDC getWindowsContext(const IntRect&, bool supportAlphaBlend = false, bool mayCreateBitmap = true); // The passed in rect is used to create a bitmap for compositing inside transparency layers. + void releaseWindowsContext(HDC, const IntRect&, bool supportAlphaBlend = false, bool mayCreateBitmap = true); // The passed in HDC should be the one handed back by getWindowsContext. + void drawRoundCorner(bool newClip, RECT clipRect, RECT rectWin, HDC dc, int width, int height); +#elif PLATFORM(WIN) GraphicsContext(HDC, bool hasAlpha = false); // FIXME: To be removed. bool inTransparencyLayer() const; HDC getWindowsContext(const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); // The passed in rect is used to create a bitmap for compositing inside transparency layers. @@ -354,6 +390,10 @@ namespace WebCore { GdkEventExpose* gdkExposeEvent() const; #endif +#if PLATFORM(HAIKU) + pattern getHaikuStrokeStyle(); +#endif + private: void savePlatformState(); void restorePlatformState(); @@ -376,6 +416,8 @@ namespace WebCore { void setPlatformShadow(const IntSize&, int blur, const Color&); void clearPlatformShadow(); + static void adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2, float strokeWidth, const StrokeStyle&); + int focusRingWidth() const; int focusRingOffset() const; const Vector<IntRect>& focusRingRects() const; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h new file mode 100644 index 000000000..07ec04d5c --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsContext3D.h @@ -0,0 +1,346 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 GraphicsContext3D_h +#define GraphicsContext3D_h + +#include "PlatformString.h" + +#include <wtf/Noncopyable.h> +#include <wtf/PassOwnPtr.h> + +#if PLATFORM(MAC) +#include <OpenGL/OpenGL.h> + +typedef void* PlatformGraphicsContext3D; +const PlatformGraphicsContext3D NullPlatformGraphicsContext3D = 0; +typedef GLuint Platform3DObject; +const Platform3DObject NullPlatform3DObject = 0; +#else +typedef void* PlatformGraphicsContext3D; +const PlatformGraphicsContext3D NullPlatformGraphicsContext3D = 0; +typedef int Platform3DObject; +const Platform3DObject NullPlatform3DObject = 0; +#endif + +namespace WebCore { + class CanvasActiveInfo; + class CanvasArray; + class CanvasBuffer; + class CanvasUnsignedByteArray; + class CanvasFloatArray; + class CanvasFramebuffer; + class CanvasIntArray; + class CanvasProgram; + class CanvasRenderbuffer; + class CanvasRenderingContext3D; + class CanvasShader; + class CanvasTexture; + class HTMLCanvasElement; + class HTMLImageElement; + class HTMLVideoElement; + class ImageData; + class WebKitCSSMatrix; + + struct ActiveInfo { + String name; + unsigned type; + int size; + }; + + // FIXME: ideally this would be used on all platforms. +#if PLATFORM(CHROMIUM) + class GraphicsContext3DInternal; +#endif + + class GraphicsContext3D : public Noncopyable { + public: + enum ShaderType { FRAGMENT_SHADER, VERTEX_SHADER }; + + static PassOwnPtr<GraphicsContext3D> create(); + virtual ~GraphicsContext3D(); + +#if PLATFORM(MAC) + PlatformGraphicsContext3D platformGraphicsContext3D() const { return m_contextObj; } + Platform3DObject platformTexture() const { return m_texture; } +#elif PLATFORM(CHROMIUM) + PlatformGraphicsContext3D platformGraphicsContext3D() const; + Platform3DObject platformTexture() const; +#else + PlatformGraphicsContext3D platformGraphicsContext3D() const { return NullPlatformGraphicsContext3D; } + Platform3DObject platformTexture() const { return NullPlatform3DObject; } +#endif + void checkError() const; + void makeContextCurrent(); + + // Helper to return the size in bytes of OpenGL data types + // like GL_FLOAT, GL_INT, etc. + int sizeInBytes(int type); + + void activeTexture(unsigned long texture); + void attachShader(CanvasProgram* program, CanvasShader* shader); + void bindAttribLocation(CanvasProgram*, unsigned long index, const String& name); + void bindBuffer(unsigned long target, CanvasBuffer*); + void bindFramebuffer(unsigned long target, CanvasFramebuffer*); + void bindRenderbuffer(unsigned long target, CanvasRenderbuffer*); + void bindTexture(unsigned long target, CanvasTexture* texture); + void blendColor(double red, double green, double blue, double alpha); + void blendEquation(unsigned long mode); + void blendEquationSeparate(unsigned long modeRGB, unsigned long modeAlpha); + void blendFunc(unsigned long sfactor, unsigned long dfactor); + void blendFuncSeparate(unsigned long srcRGB, unsigned long dstRGB, unsigned long srcAlpha, unsigned long dstAlpha); + + void bufferData(unsigned long target, int size, unsigned long usage); + void bufferData(unsigned long target, CanvasArray* data, unsigned long usage); + void bufferSubData(unsigned long target, long offset, CanvasArray* data); + + unsigned long checkFramebufferStatus(unsigned long target); + void clear(unsigned long mask); + void clearColor(double red, double green, double blue, double alpha); + void clearDepth(double depth); + void clearStencil(long s); + void colorMask(bool red, bool green, bool blue, bool alpha); + void compileShader(CanvasShader*); + + //void compressedTexImage2D(unsigned long target, long level, unsigned long internalformat, unsigned long width, unsigned long height, long border, unsigned long imageSize, const void* data); + //void compressedTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, unsigned long width, unsigned long height, unsigned long format, unsigned long imageSize, const void* data); + + void copyTexImage2D(unsigned long target, long level, unsigned long internalformat, long x, long y, unsigned long width, unsigned long height, long border); + void copyTexSubImage2D(unsigned long target, long level, long xoffset, long yoffset, long x, long y, unsigned long width, unsigned long height); + void cullFace(unsigned long mode); + void depthFunc(unsigned long func); + void depthMask(bool flag); + void depthRange(double zNear, double zFar); + void detachShader(CanvasProgram*, CanvasShader*); + void disable(unsigned long cap); + void disableVertexAttribArray(unsigned long index); + void drawArrays(unsigned long mode, long first, long count); + void drawElements(unsigned long mode, unsigned long count, unsigned long type, long offset); + + void enable(unsigned long cap); + void enableVertexAttribArray(unsigned long index); + void finish(); + void flush(); + void framebufferRenderbuffer(unsigned long target, unsigned long attachment, unsigned long renderbuffertarget, CanvasRenderbuffer*); + void framebufferTexture2D(unsigned long target, unsigned long attachment, unsigned long textarget, CanvasTexture*, long level); + void frontFace(unsigned long mode); + void generateMipmap(unsigned long target); + + bool getActiveAttrib(CanvasProgram* program, unsigned long index, ActiveInfo&); + bool getActiveUniform(CanvasProgram* program, unsigned long index, ActiveInfo&); + + int getAttribLocation(CanvasProgram*, const String& name); + + bool getBoolean(unsigned long pname); + PassRefPtr<CanvasUnsignedByteArray> getBooleanv(unsigned long pname); + int getBufferParameteri(unsigned long target, unsigned long pname); + PassRefPtr<CanvasIntArray> getBufferParameteriv(unsigned long target, unsigned long pname); + + unsigned long getError(); + + float getFloat(unsigned long pname); + PassRefPtr<CanvasFloatArray> getFloatv(unsigned long pname); + int getFramebufferAttachmentParameteri(unsigned long target, unsigned long attachment, unsigned long pname); + PassRefPtr<CanvasIntArray> getFramebufferAttachmentParameteriv(unsigned long target, unsigned long attachment, unsigned long pname); + int getInteger(unsigned long pname); + PassRefPtr<CanvasIntArray> getIntegerv(unsigned long pname); + int getProgrami(CanvasProgram*, unsigned long pname); + PassRefPtr<CanvasIntArray> getProgramiv(CanvasProgram*, unsigned long pname); + String getProgramInfoLog(CanvasProgram*); + int getRenderbufferParameteri(unsigned long target, unsigned long pname); + PassRefPtr<CanvasIntArray> getRenderbufferParameteriv(unsigned long target, unsigned long pname); + int getShaderi(CanvasShader*, unsigned long pname); + PassRefPtr<CanvasIntArray> getShaderiv(CanvasShader*, unsigned long pname); + + String getShaderInfoLog(CanvasShader*); + + // TBD + // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); + + String getShaderSource(CanvasShader*); + String getString(unsigned long name); + + float getTexParameterf(unsigned long target, unsigned long pname); + PassRefPtr<CanvasFloatArray> getTexParameterfv(unsigned long target, unsigned long pname); + int getTexParameteri(unsigned long target, unsigned long pname); + PassRefPtr<CanvasIntArray> getTexParameteriv(unsigned long target, unsigned long pname); + + float getUniformf(CanvasProgram* program, long location); + PassRefPtr<CanvasFloatArray> getUniformfv(CanvasProgram* program, long location); + int getUniformi(CanvasProgram* program, long location); + PassRefPtr<CanvasIntArray> getUniformiv(CanvasProgram* program, long location); + + long getUniformLocation(CanvasProgram*, const String& name); + + float getVertexAttribf(unsigned long index, unsigned long pname); + PassRefPtr<CanvasFloatArray> getVertexAttribfv(unsigned long index, unsigned long pname); + int getVertexAttribi(unsigned long index, unsigned long pname); + PassRefPtr<CanvasIntArray> getVertexAttribiv(unsigned long index, unsigned long pname); + + long getVertexAttribOffset(unsigned long index, unsigned long pname); + + void hint(unsigned long target, unsigned long mode); + bool isBuffer(CanvasBuffer*); + bool isEnabled(unsigned long cap); + bool isFramebuffer(CanvasFramebuffer*); + bool isProgram(CanvasProgram*); + bool isRenderbuffer(CanvasRenderbuffer*); + bool isShader(CanvasShader*); + bool isTexture(CanvasTexture*); + void lineWidth(double); + void linkProgram(CanvasProgram*); + void pixelStorei(unsigned long pname, long param); + void polygonOffset(double factor, double units); + + PassRefPtr<CanvasArray> readPixels(long x, long y, unsigned long width, unsigned long height, unsigned long format, unsigned long type); + + void releaseShaderCompiler(); + void renderbufferStorage(unsigned long target, unsigned long internalformat, unsigned long width, unsigned long height); + void sampleCoverage(double value, bool invert); + void scissor(long x, long y, unsigned long width, unsigned long height); + void shaderSource(CanvasShader*, const String& string); + void stencilFunc(unsigned long func, long ref, unsigned long mask); + void stencilFuncSeparate(unsigned long face, unsigned long func, long ref, unsigned long mask); + void stencilMask(unsigned long mask); + void stencilMaskSeparate(unsigned long face, unsigned long mask); + void stencilOp(unsigned long fail, unsigned long zfail, unsigned long zpass); + void stencilOpSeparate(unsigned long face, unsigned long fail, unsigned long zfail, unsigned long zpass); + + // These next several functions return an error code (0 if no errors) rather than using an ExceptionCode. + // Currently they return -1 on any error. + int texImage2D(unsigned target, unsigned level, unsigned internalformat, + unsigned width, unsigned height, unsigned border, + unsigned format, unsigned type, CanvasArray* pixels); + int texImage2D(unsigned target, unsigned level, unsigned internalformat, + unsigned width, unsigned height, unsigned border, + unsigned format, unsigned type, ImageData* pixels); + int texImage2D(unsigned target, unsigned level, HTMLImageElement* image, + bool flipY, bool premultiplyAlpha); + int texImage2D(unsigned target, unsigned level, HTMLCanvasElement* canvas, + bool flipY, bool premultiplyAlpha); + int texImage2D(unsigned target, unsigned level, HTMLVideoElement* video, + bool flipY, bool premultiplyAlpha); + + void texParameterf(unsigned target, unsigned pname, float param); + void texParameteri(unsigned target, unsigned pname, int param); + + int texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned width, unsigned height, + unsigned format, unsigned type, CanvasArray* pixels); + int texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned width, unsigned height, + unsigned format, unsigned type, ImageData* pixels); + int texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned width, unsigned height, HTMLImageElement* image, + bool flipY, bool premultiplyAlpha); + int texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned width, unsigned height, HTMLCanvasElement* canvas, + bool flipY, bool premultiplyAlpha); + int texSubImage2D(unsigned target, unsigned level, unsigned xoffset, unsigned yoffset, + unsigned width, unsigned height, HTMLVideoElement* video, + bool flipY, bool premultiplyAlpha); + + void uniform1f(long location, float x); + void uniform1fv(long location, float* v, int size); + void uniform1i(long location, int x); + void uniform1iv(long location, int* v, int size); + void uniform2f(long location, float x, float y); + void uniform2fv(long location, float* v, int size); + void uniform2i(long location, int x, int y); + void uniform2iv(long location, int* v, int size); + void uniform3f(long location, float x, float y, float z); + void uniform3fv(long location, float* v, int size); + void uniform3i(long location, int x, int y, int z); + void uniform3iv(long location, int* v, int size); + void uniform4f(long location, float x, float y, float z, float w); + void uniform4fv(long location, float* v, int size); + void uniform4i(long location, int x, int y, int z, int w); + void uniform4iv(long location, int* v, int size); + void uniformMatrix2fv(long location, bool transpose, float* value, int size); + void uniformMatrix3fv(long location, bool transpose, float* value, int size); + void uniformMatrix4fv(long location, bool transpose, float* value, int size); + + void useProgram(CanvasProgram*); + void validateProgram(CanvasProgram*); + + void vertexAttrib1f(unsigned long indx, float x); + void vertexAttrib1fv(unsigned long indx, float* values); + void vertexAttrib2f(unsigned long indx, float x, float y); + void vertexAttrib2fv(unsigned long indx, float* values); + void vertexAttrib3f(unsigned long indx, float x, float y, float z); + void vertexAttrib3fv(unsigned long indx, float* values); + void vertexAttrib4f(unsigned long indx, float x, float y, float z, float w); + void vertexAttrib4fv(unsigned long indx, float* values); + void vertexAttribPointer(unsigned long indx, int size, int type, bool normalized, + unsigned long stride, unsigned long offset); + + void viewport(long x, long y, unsigned long width, unsigned long height); + + void reshape(int width, int height); + + // Helpers for notification about paint events + void beginPaint(CanvasRenderingContext3D* context); + void endPaint(); + + // Support for buffer creation and deletion + unsigned createBuffer(); + unsigned createFramebuffer(); + unsigned createProgram(); + unsigned createRenderbuffer(); + unsigned createShader(ShaderType); + unsigned createTexture(); + + void deleteBuffer(unsigned); + void deleteFramebuffer(unsigned); + void deleteProgram(unsigned); + void deleteRenderbuffer(unsigned); + void deleteShader(unsigned); + void deleteTexture(unsigned); + + private: + GraphicsContext3D(); + + int m_currentWidth, m_currentHeight; + +#if PLATFORM(MAC) + Vector<Vector<float> > m_vertexArray; + + CGLContextObj m_contextObj; + GLuint m_texture; + GLuint m_fbo; + GLuint m_depthBuffer; +#endif + + // FIXME: ideally this would be used on all platforms. +#if PLATFORM(CHROMIUM) + friend class GraphicsContext3DInternal; + OwnPtr<GraphicsContext3DInternal> m_internal; +#endif + }; + +} // namespace WebCore + +#endif // GraphicsContext3D_h + diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp index b1825481e..c8582bb82 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.cpp @@ -35,156 +35,31 @@ namespace WebCore { -void GraphicsLayer::FloatValue::set(float key, float value, const TimingFunction* timingFunction) -{ - m_key = key; - m_value = value; - if (timingFunction != m_timingFunction) { - if (timingFunction) - m_timingFunction.set(new TimingFunction(*timingFunction)); - else - m_timingFunction.clear(); - } -} - -void GraphicsLayer::TransformValue::set(float key, const TransformOperations* value, const TimingFunction* timingFunction) -{ - m_key = key; - if (value != m_value) { - if (value) - m_value.set(new TransformOperations(*value)); - else - m_value.clear(); - } - if (timingFunction != m_timingFunction) { - if (timingFunction) - m_timingFunction.set(new TimingFunction(*timingFunction)); - else - m_timingFunction.clear(); - } -} - -void GraphicsLayer::FloatValueList::insert(float key, float value, const TimingFunction* timingFunction) +void KeyframeValueList::insert(const AnimationValue* value) { for (size_t i = 0; i < m_values.size(); ++i) { - FloatValue& curFloatValue = m_values[i]; - if (curFloatValue.key() == key) { - curFloatValue.set(key, value, timingFunction); - return; - } - if (curFloatValue.key() > key) { - // insert before - m_values.insert(i, FloatValue(key, value, timingFunction)); - return; - } - } - - // append - m_values.append(FloatValue(key, value, timingFunction)); -} - -void GraphicsLayer::TransformValueList::insert(float key, const TransformOperations* value, const TimingFunction* timingFunction) -{ - for (size_t i = 0; i < m_values.size(); ++i) { - TransformValue& curTransValue = m_values[i]; - if (curTransValue.key() == key) { - curTransValue.set(key, value, timingFunction); + const AnimationValue* curValue = m_values[i]; + if (curValue->keyTime() == value->keyTime()) { + ASSERT_NOT_REACHED(); + // insert after + m_values.insert(i + 1, value); return; } - if (curTransValue.key() > key) { + if (curValue->keyTime() > value->keyTime()) { // insert before - m_values.insert(i, TransformValue(key, value, timingFunction)); - return; - } - } - - // append - m_values.append(TransformValue(key, value, timingFunction)); -} - -// An "invalid" list is one whose functions don't match, and therefore has to be animated as a Matrix -// The hasBigRotation flag will always return false if isValid is false. Otherwise hasBigRotation is -// true if the rotation between any two keyframes is >= 180 degrees. -void GraphicsLayer::TransformValueList::makeFunctionList(FunctionList& list, bool& isValid, bool& hasBigRotation) const -{ - list.clear(); - isValid = false; - hasBigRotation = false; - - if (m_values.size() < 2) - return; - - // empty transforms match anything, so find the first non-empty entry as the reference - size_t firstIndex = 0; - for ( ; firstIndex < m_values.size(); ++firstIndex) { - if (m_values[firstIndex].value()->operations().size() > 0) - break; - } - - if (firstIndex >= m_values.size()) - return; - - const TransformOperations* firstVal = m_values[firstIndex].value(); - - // see if the keyframes are valid - for (size_t i = firstIndex + 1; i < m_values.size(); ++i) { - const TransformOperations* val = m_values[i].value(); - - // a null transform matches anything - if (val->operations().isEmpty()) - continue; - - if (firstVal->operations().size() != val->operations().size()) + m_values.insert(i, value); return; - - for (size_t j = 0; j < firstVal->operations().size(); ++j) { - if (!firstVal->operations().at(j)->isSameType(*val->operations().at(j))) - return; } } - - // keyframes are valid, fill in the list - isValid = true; - double lastRotAngle = 0.0; - double maxRotAngle = -1.0; - - list.resize(firstVal->operations().size()); - for (size_t j = 0; j < firstVal->operations().size(); ++j) { - TransformOperation::OperationType type = firstVal->operations().at(j)->getOperationType(); - list[j] = type; - - // if this is a rotation entry, we need to see if any angle differences are >= 180 deg - if (type == TransformOperation::ROTATE_X || - type == TransformOperation::ROTATE_Y || - type == TransformOperation::ROTATE_Z || - type == TransformOperation::ROTATE_3D) { - lastRotAngle = static_cast<RotateTransformOperation*>(firstVal->operations().at(j).get())->angle(); - - if (maxRotAngle < 0) - maxRotAngle = fabs(lastRotAngle); - - for (size_t i = firstIndex + 1; i < m_values.size(); ++i) { - const TransformOperations* val = m_values[i].value(); - double rotAngle = val->operations().isEmpty() ? 0 : (static_cast<RotateTransformOperation*>(val->operations().at(j).get())->angle()); - double diffAngle = fabs(rotAngle - lastRotAngle); - if (diffAngle > maxRotAngle) - maxRotAngle = diffAngle; - lastRotAngle = rotAngle; - } - } - } - - hasBigRotation = maxRotAngle >= 180.0; + m_values.append(value); } GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client) : m_client(client) , m_anchorPoint(0.5f, 0.5f, 0) , m_opacity(1) -#ifndef NDEBUG , m_zPosition(0) -#endif , m_backgroundColorSet(false) , m_contentsOpaque(false) , m_preserves3D(false) @@ -192,23 +67,31 @@ GraphicsLayer::GraphicsLayer(GraphicsLayerClient* client) , m_usingTiledLayer(false) , m_masksToBounds(false) , m_drawsContent(false) - , m_paintingPhase(GraphicsLayerPaintAllMask) + , m_paintingPhase(GraphicsLayerPaintAll) + , m_geometryOrientation(CompositingCoordinatesTopDown) , m_contentsOrientation(CompositingCoordinatesTopDown) , m_parent(0) -#ifndef NDEBUG + , m_maskLayer(0) , m_repaintCount(0) -#endif { } GraphicsLayer::~GraphicsLayer() { - removeAllAnimations(); - removeAllChildren(); removeFromParent(); } +bool GraphicsLayer::hasAncestor(GraphicsLayer* ancestor) const +{ + for (GraphicsLayer* curr = parent(); curr; curr = curr->parent()) { + if (curr == ancestor) + return true; + } + + return false; +} + void GraphicsLayer::addChild(GraphicsLayer* childLayer) { ASSERT(childLayer != this); @@ -316,9 +199,9 @@ void GraphicsLayer::removeFromParent() } } -void GraphicsLayer::setBackgroundColor(const Color& inColor, const Animation*, double /*beginTime*/) +void GraphicsLayer::setBackgroundColor(const Color& color) { - m_backgroundColor = inColor; + m_backgroundColor = color; m_backgroundColorSet = true; } @@ -328,96 +211,13 @@ void GraphicsLayer::clearBackgroundColor() m_backgroundColorSet = false; } -bool GraphicsLayer::setOpacity(float opacity, const Animation*, double) -{ - m_opacity = opacity; - return false; // not animating -} - void GraphicsLayer::paintGraphicsLayerContents(GraphicsContext& context, const IntRect& clip) { - m_client->paintContents(this, context, m_paintingPhase, clip); -} - -String GraphicsLayer::propertyIdToString(AnimatedPropertyID property) -{ - switch (property) { - case AnimatedPropertyWebkitTransform: - return "transform"; - case AnimatedPropertyOpacity: - return "opacity"; - case AnimatedPropertyBackgroundColor: - return "backgroundColor"; - case AnimatedPropertyInvalid: - ASSERT_NOT_REACHED(); - } - ASSERT_NOT_REACHED(); - return ""; -} - -int GraphicsLayer::findAnimationEntry(AnimatedPropertyID property, short index) const -{ - for (size_t i = 0; i < m_animations.size(); ++i) { - if (m_animations[i].matches(property, index)) - return static_cast<int>(i); - } - return -1; -} - -void GraphicsLayer::addAnimationEntry(AnimatedPropertyID property, short index, bool isTransition, const Animation* transition) -{ - int i = findAnimationEntry(property, index); - - if (i >= 0) - m_animations[i].reset(transition, isTransition); - else - m_animations.append(AnimationEntry(transition, property, index, isTransition)); -} - -void GraphicsLayer::removeAllAnimations() -{ - size_t size = m_animations.size(); - for (size_t i = 0; i < size; ++i) - removeAnimation(0, true); -} - -void GraphicsLayer::removeAllAnimationsForProperty(AnimatedPropertyID property) -{ - for (short j = 0; ; ++j) { - int i = findAnimationEntry(property, j); - if (i < 0) - break; - removeAnimation(i, false); - } -} - -void GraphicsLayer::removeFinishedAnimations(const String& name, int /*index*/, bool reset) -{ - size_t size = m_animations.size(); - for (size_t i = 0; i < size; ) { - AnimationEntry& anim = m_animations[i]; - if (!anim.isTransition() && anim.animation()->name() == name) { - removeAnimation(i, reset); - --size; - } else - ++i; - } -} - -void GraphicsLayer::removeFinishedTransitions(AnimatedPropertyID property) -{ - size_t size = m_animations.size(); - for (size_t i = 0; i < size; ) { - AnimationEntry& anim = m_animations[i]; - if (anim.isTransition() && property == anim.property()) { - removeAnimation(i, false); - --size; - } else - ++i; - } + if (m_client) + m_client->paintContents(this, context, m_paintingPhase, clip); } -void GraphicsLayer::suspendAnimations() +void GraphicsLayer::suspendAnimations(double) { } @@ -425,7 +225,6 @@ void GraphicsLayer::resumeAnimations() { } -#ifndef NDEBUG void GraphicsLayer::updateDebugIndicators() { if (GraphicsLayer::showDebugBorders()) { @@ -447,7 +246,6 @@ void GraphicsLayer::setZPosition(float position) { m_zPosition = position; } -#endif float GraphicsLayer::accumulatedOpacity() const { @@ -474,6 +272,91 @@ void GraphicsLayer::distributeOpacity(float accumulatedOpacity) } } +// An "invalid" list is one whose functions don't match, and therefore has to be animated as a Matrix +// The hasBigRotation flag will always return false if isValid is false. Otherwise hasBigRotation is +// true if the rotation between any two keyframes is >= 180 degrees. + +static inline const TransformOperations* operationsAt(const KeyframeValueList& valueList, size_t index) +{ + return static_cast<const TransformAnimationValue*>(valueList.at(index))->value(); +} + +void GraphicsLayer::fetchTransformOperationList(const KeyframeValueList& valueList, TransformOperationList& list, bool& isValid, bool& hasBigRotation) +{ + ASSERT(valueList.property() == AnimatedPropertyWebkitTransform); + + list.clear(); + isValid = false; + hasBigRotation = false; + + if (valueList.size() < 2) + return; + + // Empty transforms match anything, so find the first non-empty entry as the reference. + size_t firstIndex = 0; + for ( ; firstIndex < valueList.size(); ++firstIndex) { + if (operationsAt(valueList, firstIndex)->operations().size() > 0) + break; + } + + if (firstIndex >= valueList.size()) + return; + + const TransformOperations* firstVal = operationsAt(valueList, firstIndex); + + // See if the keyframes are valid. + for (size_t i = firstIndex + 1; i < valueList.size(); ++i) { + const TransformOperations* val = operationsAt(valueList, i); + + // a null transform matches anything + if (val->operations().isEmpty()) + continue; + + if (firstVal->operations().size() != val->operations().size()) + return; + + for (size_t j = 0; j < firstVal->operations().size(); ++j) { + if (!firstVal->operations().at(j)->isSameType(*val->operations().at(j))) + return; + } + } + + // Keyframes are valid, fill in the list. + isValid = true; + + double lastRotAngle = 0.0; + double maxRotAngle = -1.0; + + list.resize(firstVal->operations().size()); + for (size_t j = 0; j < firstVal->operations().size(); ++j) { + TransformOperation::OperationType type = firstVal->operations().at(j)->getOperationType(); + list[j] = type; + + // if this is a rotation entry, we need to see if any angle differences are >= 180 deg + if (type == TransformOperation::ROTATE_X || + type == TransformOperation::ROTATE_Y || + type == TransformOperation::ROTATE_Z || + type == TransformOperation::ROTATE_3D) { + lastRotAngle = static_cast<RotateTransformOperation*>(firstVal->operations().at(j).get())->angle(); + + if (maxRotAngle < 0) + maxRotAngle = fabs(lastRotAngle); + + for (size_t i = firstIndex + 1; i < valueList.size(); ++i) { + const TransformOperations* val = operationsAt(valueList, i); + double rotAngle = val->operations().isEmpty() ? 0 : (static_cast<RotateTransformOperation*>(val->operations().at(j).get())->angle()); + double diffAngle = fabs(rotAngle - lastRotAngle); + if (diffAngle > maxRotAngle) + maxRotAngle = diffAngle; + lastRotAngle = rotAngle; + } + } + } + + hasBigRotation = maxRotAngle >= 180.0; +} + + static void writeIndent(TextStream& ts, int indent) { for (int i = 0; i != indent; ++i) diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h index 3cc11286b..85eace092 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayer.h @@ -33,16 +33,21 @@ #include "FloatPoint.h" #include "FloatPoint3D.h" #include "FloatSize.h" +#if ENABLE(3D_CANVAS) +#include "GraphicsContext3D.h" +#endif #include "GraphicsLayerClient.h" +#include "IntRect.h" #include "TransformationMatrix.h" #include "TransformOperations.h" #include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> #if PLATFORM(MAC) #ifdef __OBJC__ @class WebLayer; @class CALayer; -typedef WebLayer PlatformLayer; +typedef CALayer PlatformLayer; typedef CALayer* NativeLayer; #else typedef void* PlatformLayer; @@ -61,119 +66,97 @@ class Image; class TextStream; class TimingFunction; -// GraphicsLayer is an abstraction for a rendering surface with backing store, -// which may have associated transformation and animations. +// Base class for animation values (also used for transitions). Here to +// represent values for properties being animated via the GraphicsLayer, +// without pulling in style-related data from outside of the platform directory. +class AnimationValue : public Noncopyable { +public: + AnimationValue(float keyTime, const TimingFunction* timingFunction = 0) + : m_keyTime(keyTime) + , m_timingFunction(0) + { + if (timingFunction) + m_timingFunction.set(new TimingFunction(*timingFunction)); + } + + virtual ~AnimationValue() { } -class GraphicsLayer { + float keyTime() const { return m_keyTime; } + const TimingFunction* timingFunction() const { return m_timingFunction.get(); } + +private: + float m_keyTime; + OwnPtr<TimingFunction> m_timingFunction; +}; + +// Used to store one float value of an animation. +class FloatAnimationValue : public AnimationValue { +public: + FloatAnimationValue(float keyTime, float value, const TimingFunction* timingFunction = 0) + : AnimationValue(keyTime, timingFunction) + , m_value(value) + { + } + + float value() const { return m_value; } + +private: + float m_value; +}; + +// Used to store one transform value in a keyframe list. +class TransformAnimationValue : public AnimationValue { public: - // Used to store one float value of a keyframe animation. - class FloatValue { - public: - FloatValue(float key, float value, const TimingFunction* timingFunction = 0) - : m_key(key), m_value(value), m_timingFunction(0) - { - if (timingFunction) - m_timingFunction.set(new TimingFunction(*timingFunction)); - } - - FloatValue(const FloatValue& other) - : m_key(other.key()), m_value(other.value()), m_timingFunction(0) - { - if (other.timingFunction()) - m_timingFunction.set(new TimingFunction(*other.timingFunction())); - } - - const FloatValue& operator=(const FloatValue& other) - { - if (&other != this) - set(other.key(), other.value(), other.timingFunction()); - return *this; - } - - void set(float key, float value, const TimingFunction*); - - float key() const { return m_key; } - float value() const { return m_value; } - const TimingFunction* timingFunction() const { return m_timingFunction.get(); } - - private: - float m_key; - float m_value; - OwnPtr<TimingFunction> m_timingFunction; - }; + TransformAnimationValue(float keyTime, const TransformOperations* value = 0, const TimingFunction* timingFunction = 0) + : AnimationValue(keyTime, timingFunction) + { + if (value) + m_value.set(new TransformOperations(*value)); + } + + const TransformOperations* value() const { return m_value.get(); } + +private: + OwnPtr<TransformOperations> m_value; +}; + +// Used to store a series of values in a keyframe list. Values will all be of the same type, +// which can be inferred from the property. +class KeyframeValueList : public Noncopyable { +public: + + KeyframeValueList(AnimatedPropertyID property) + : m_property(property) + { + } + + ~KeyframeValueList() + { + deleteAllValues(m_values); + } + AnimatedPropertyID property() const { return m_property; } + + size_t size() const { return m_values.size(); } + const AnimationValue* at(size_t i) const { return m_values.at(i); } - class FloatValueList { - public: - void insert(float key, float value, const TimingFunction* timingFunction); - - size_t size() const { return m_values.size(); } - const FloatValue& at(size_t i) const { return m_values.at(i); } - const Vector<FloatValue>& values() const { return m_values; } - - private: - Vector<FloatValue> m_values; - }; - - // Used to store one transform in a keyframe list. - class TransformValue { - public: - TransformValue(float key = NAN, const TransformOperations* value = 0, const TimingFunction* timingFunction = 0) - : m_key(key) - { - if (value) - m_value.set(new TransformOperations(*value)); - if (timingFunction) - m_timingFunction.set(new TimingFunction(*timingFunction)); - } - - TransformValue(const TransformValue& other) - : m_key(other.key()) - { - if (other.value()) - m_value.set(new TransformOperations(*other.value())); - if (other.timingFunction()) - m_timingFunction.set(new TimingFunction(*other.timingFunction())); - } - - const TransformValue& operator=(const TransformValue& other) - { - if (&other != this) - set(other.key(), other.value(), other.timingFunction()); - return *this; - } - - void set(float key, const TransformOperations* value, const TimingFunction* timingFunction); - - float key() const { return m_key; } - const TransformOperations* value() const { return m_value.get(); } - const TimingFunction* timingFunction() const { return m_timingFunction.get(); } - - private: - float m_key; - OwnPtr<TransformOperations> m_value; - OwnPtr<TimingFunction> m_timingFunction; - }; + // Insert, sorted by keyTime. Takes ownership of the pointer. + void insert(const AnimationValue*); - // Used to store a series of transforms in a keyframe list. - class TransformValueList { - public: - typedef Vector<TransformOperation::OperationType> FunctionList; - - size_t size() const { return m_values.size(); } - const TransformValue& at(size_t i) const { return m_values.at(i); } - const Vector<TransformValue>& values() const { return m_values; } - - void insert(float key, const TransformOperations* value, const TimingFunction* timingFunction); - - // return a list of the required functions. List is empty if keyframes are not valid - // If return value is true, functions contain rotations of >= 180 degrees - void makeFunctionList(FunctionList& list, bool& isValid, bool& hasBigRotation) const; - private: - Vector<TransformValue> m_values; - }; - - static GraphicsLayer* createGraphicsLayer(GraphicsLayerClient*); +protected: + Vector<const AnimationValue*> m_values; + AnimatedPropertyID m_property; +}; + + + +// GraphicsLayer is an abstraction for a rendering surface with backing store, +// which may have associated transformation and animations. + +class GraphicsLayer { +public: + + static PassOwnPtr<GraphicsLayer> create(GraphicsLayerClient*); virtual ~GraphicsLayer(); @@ -189,6 +172,9 @@ public: GraphicsLayer* parent() const { return m_parent; }; void setParent(GraphicsLayer* layer) { m_parent = layer; } // Internal use only. + // Returns true if the layer has the given layer as an ancestor (excluding self). + bool hasAncestor(GraphicsLayer*) const; + const Vector<GraphicsLayer*>& children() const { return m_children; } // Add child layers. If the child is already parented, it will be removed from its old parent. @@ -201,6 +187,9 @@ public: void removeAllChildren(); virtual void removeFromParent(); + GraphicsLayer* maskLayer() const { return m_maskLayer; } + virtual void setMaskLayer(GraphicsLayer* layer) { m_maskLayer = layer; } + // Offset is origin of the renderer minus origin of the graphics layer (so either zero or negative). IntSize offsetFromRenderer() const { return m_offsetFromRenderer; } void setOffsetFromRenderer(const IntSize& offset) { m_offsetFromRenderer = offset; } @@ -235,7 +224,7 @@ public: // The color used to paint the layer backgrounds const Color& backgroundColor() const { return m_backgroundColor; } - virtual void setBackgroundColor(const Color&, const Animation* = 0, double beginTime = 0); + virtual void setBackgroundColor(const Color&); virtual void clearBackgroundColor(); bool backgroundColorSet() const { return m_backgroundColorSet; } @@ -247,35 +236,39 @@ public: virtual void setBackfaceVisibility(bool b) { m_backfaceVisibility = b; } float opacity() const { return m_opacity; } - // return true if we started an animation - virtual bool setOpacity(float o, const Animation* = 0, double beginTime = 0); + virtual void setOpacity(float opacity) { m_opacity = opacity; } // Some GraphicsLayers paint only the foreground or the background content - GraphicsLayerPaintingPhase drawingPhase() const { return m_paintingPhase; } - void setDrawingPhase(GraphicsLayerPaintingPhase phase) { m_paintingPhase = phase; } + GraphicsLayerPaintingPhase paintingPhase() const { return m_paintingPhase; } + void setPaintingPhase(GraphicsLayerPaintingPhase phase) { m_paintingPhase = phase; } virtual void setNeedsDisplay() = 0; // mark the given rect (in layer coords) as needing dispay. Never goes deep. virtual void setNeedsDisplayInRect(const FloatRect&) = 0; - virtual bool animateTransform(const TransformValueList&, const IntSize&, const Animation*, double beginTime, bool isTransition) = 0; - virtual bool animateFloat(AnimatedPropertyID, const FloatValueList&, const Animation*, double beginTime) = 0; + // Set that the position/size of the contents (image or video). + IntRect contentsRect() const { return m_contentsRect; } + virtual void setContentsRect(const IntRect& r) { m_contentsRect = r; } - void removeFinishedAnimations(const String& name, int index, bool reset); - void removeFinishedTransitions(AnimatedPropertyID); - void removeAllAnimations(); - - virtual void suspendAnimations(); + // Return true if the animation is handled by the compositing system. If this returns + // false, the animation will be run by AnimationController. + virtual bool addAnimation(const KeyframeValueList&, const IntSize& /*boxSize*/, const Animation*, const String& /*keyframesName*/, double /*beginTime*/) { return false; } + virtual void removeAnimationsForProperty(AnimatedPropertyID) { } + virtual void removeAnimationsForKeyframes(const String& /* keyframesName */) { } + virtual void pauseAnimation(const String& /* keyframesName */) { } + + virtual void suspendAnimations(double time); virtual void resumeAnimations(); // Layer contents virtual void setContentsToImage(Image*) { } virtual void setContentsToVideo(PlatformLayer*) { } virtual void setContentsBackgroundColor(const Color&) { } - virtual void clearContents() { } - virtual void updateContentsRect() { } - +#if ENABLE(3D_CANVAS) + virtual void setContentsToGraphicsContext3D(const GraphicsContext3D*) { } + virtual void setGraphicsContext3DNeedsDisplay() { } +#endif // Callback from the underlying graphics system to draw layer contents. void paintGraphicsLayerContents(GraphicsContext&, const IntRect& clip); @@ -283,10 +276,8 @@ public: void dumpLayer(TextStream&, int indent = 0) const; -#ifndef NDEBUG int repaintCount() const { return m_repaintCount; } int incrementRepaintCount() { return ++m_repaintCount; } -#endif // Report whether the underlying compositing system uses a top-down // or a bottom-up coordinate system. @@ -294,14 +285,13 @@ public: static CompositingCoordinatesOrientation compositingCoordinatesOrientation(); // Set the geometry orientation (top-down, or bottom-up) for this layer, which also controls sublayer geometry. - virtual void setGeometryOrientation(CompositingCoordinatesOrientation) { } - virtual CompositingCoordinatesOrientation geometryOrientation() const { return CompositingCoordinatesTopDown; } + virtual void setGeometryOrientation(CompositingCoordinatesOrientation orientation) { m_geometryOrientation = orientation; } + CompositingCoordinatesOrientation geometryOrientation() const { return m_geometryOrientation; } // Flippedness of the contents of this layer. Does not affect sublayer geometry. virtual void setContentsOrientation(CompositingCoordinatesOrientation orientation) { m_contentsOrientation = orientation; } - virtual CompositingCoordinatesOrientation contentsOrientation() const { return m_contentsOrientation; } + CompositingCoordinatesOrientation contentsOrientation() const { return m_contentsOrientation; } -#ifndef NDEBUG static bool showDebugBorders(); static bool showRepaintCounter(); @@ -312,27 +302,27 @@ public: // z-position is the z-equivalent of position(). It's only used for debugging purposes. virtual float zPosition() const { return m_zPosition; } virtual void setZPosition(float); -#endif - static String propertyIdToString(AnimatedPropertyID); - virtual void distributeOpacity(float); virtual float accumulatedOpacity() const; + // Some compositing systems may do internal batching to synchronize compositing updates + // with updates drawn into the window. This is a signal to flush any internal batched state. + virtual void syncCompositingState() { } + protected: + + typedef Vector<TransformOperation::OperationType> TransformOperationList; + // Given a list of TransformAnimationValues, return an array of transform operations. + // On return, if hasBigRotation is true, functions contain rotations of >= 180 degrees + static void fetchTransformOperationList(const KeyframeValueList&, TransformOperationList&, bool& isValid, bool& hasBigRotation); + virtual void setOpacityInternal(float) { } GraphicsLayer(GraphicsLayerClient*); void dumpProperties(TextStream&, int indent) const; - // returns -1 if not found - int findAnimationEntry(AnimatedPropertyID, short index) const; - void addAnimationEntry(AnimatedPropertyID, short index, bool isTransition, const Animation*); - - virtual void removeAnimation(int /*index*/, bool /*reset*/) {} - void removeAllAnimationsForProperty(AnimatedPropertyID); - GraphicsLayerClient* m_client; String m_name; @@ -348,9 +338,7 @@ protected: Color m_backgroundColor; float m_opacity; -#ifndef NDEBUG float m_zPosition; -#endif bool m_backgroundColorSet : 1; bool m_contentsOpaque : 1; @@ -361,57 +349,17 @@ protected: bool m_drawsContent : 1; GraphicsLayerPaintingPhase m_paintingPhase; - CompositingCoordinatesOrientation m_contentsOrientation; + CompositingCoordinatesOrientation m_geometryOrientation; // affects geometry of layer positions + CompositingCoordinatesOrientation m_contentsOrientation; // affects orientation of layer contents Vector<GraphicsLayer*> m_children; GraphicsLayer* m_parent; - - // AnimationEntry represents an animation of a property on this layer. - // For transform only, there may be more than one, in which case 'index' - // is an index into the list of transforms. - class AnimationEntry { - public: - AnimationEntry(const Animation* animation, AnimatedPropertyID property, short index, bool isTransition) - : m_animation(const_cast<Animation*>(animation)) - , m_property(property) - , m_index(index) - , m_isCurrent(true) - , m_isTransition(isTransition) - { - } - - const Animation* animation() const { return m_animation.get(); } - AnimatedPropertyID property() const { return m_property; } - int index() const { return m_index; } - bool isCurrent() const { return m_isCurrent; } - void setIsCurrent(bool b = true) { m_isCurrent = b; } - bool isTransition() const { return m_isTransition; } - - bool matches(AnimatedPropertyID property, short index) const - { - return m_property == property && m_index == index; - } - - void reset(const Animation* animation, bool isTransition) - { - m_animation = const_cast<Animation*>(animation); - m_isTransition = isTransition; - m_isCurrent = true; - } - - private: - RefPtr<Animation> m_animation; - AnimatedPropertyID m_property : 14; - short m_index : 16; - bool m_isCurrent : 1; - bool m_isTransition : 1; - }; - - Vector<AnimationEntry> m_animations; // running animations/transitions - -#ifndef NDEBUG + + GraphicsLayer* m_maskLayer; // Reference to mask layer. We don't own this. + + IntRect m_contentsRect; + int m_repaintCount; -#endif }; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayerClient.h b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayerClient.h index 46382f2cf..5facc94c4 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayerClient.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/GraphicsLayerClient.h @@ -37,9 +37,10 @@ class IntRect; class FloatPoint; enum GraphicsLayerPaintingPhase { - GraphicsLayerPaintBackgroundMask = (1 << 0), - GraphicsLayerPaintForegroundMask = (1 << 1), - GraphicsLayerPaintAllMask = (GraphicsLayerPaintBackgroundMask | GraphicsLayerPaintForegroundMask) + GraphicsLayerPaintBackground = (1 << 0), + GraphicsLayerPaintForeground = (1 << 1), + GraphicsLayerPaintMask = (1 << 2), + GraphicsLayerPaintAll = (GraphicsLayerPaintBackground | GraphicsLayerPaintForeground | GraphicsLayerPaintMask) }; enum AnimatedPropertyID { @@ -53,13 +54,14 @@ class GraphicsLayerClient { public: virtual ~GraphicsLayerClient() {} - // Callbacks for when hardware-accelerated transitions and animation started + // Callback for when hardware-accelerated animation started. virtual void notifyAnimationStarted(const GraphicsLayer*, double time) = 0; + + // Notification that a layer property changed that requires a subsequent call to syncCompositingState() + // to appear on the screen. + virtual void notifySyncRequired(const GraphicsLayer*) = 0; virtual void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect& inClip) = 0; - - // Return a rect for the "contents" of the graphics layer, i.e. video or image content, in GraphicsLayer coordinates. - virtual IntRect contentsBox(const GraphicsLayer*) = 0; }; } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.cpp new file mode 100644 index 000000000..55305d1b4 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "ImageBuffer.h" + +#if !PLATFORM(CG) + +#include <math.h> + +namespace WebCore { + +void ImageBuffer::transformColorSpace(ImageColorSpace srcColorSpace, ImageColorSpace dstColorSpace) +{ + if (srcColorSpace == dstColorSpace) + return; + + // only sRGB <-> linearRGB are supported at the moment + if ((srcColorSpace != LinearRGB && srcColorSpace != DeviceRGB) || + (dstColorSpace != LinearRGB && dstColorSpace != DeviceRGB)) + return; + + Vector<int> lookUpTable; + if (dstColorSpace == LinearRGB) { + if (m_linearRgbLUT.isEmpty()) { + for (unsigned i = 0; i < 256; i++) { + float color = i / 255.0f; + color = (color <= 0.04045f ? color / 12.92f : pow((color + 0.055f) / 1.055f, 2.4f)); + color = std::max(0.0f, color); + color = std::min(1.0f, color); + m_linearRgbLUT.append(static_cast<int>(color * 255)); + } + } + platformTransformColorSpace(m_linearRgbLUT); + } else if (dstColorSpace == DeviceRGB) { + if (m_deviceRgbLUT.isEmpty()) { + for (unsigned i = 0; i < 256; i++) { + float color = i / 255.0f; + color = pow(1.055f * color, 1.0f / 2.4f) - 0.055f; + color = std::max(0.0f, color); + color = std::min(1.0f, color); + m_deviceRgbLUT.append(static_cast<int>(color * 255)); + } + } + platformTransformColorSpace(m_deviceRgbLUT); + } +} + +} + +#endif // PLATFORM(CG) diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.h b/src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.h index 841a8914d..94320584d 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/ImageBuffer.h @@ -43,13 +43,25 @@ namespace WebCore { class IntRect; class String; + enum ImageColorSpace { + Unknown, + DeviceRGB, // like sRGB + GrayScale, + LinearRGB + }; + + enum Multiply { + Premultiplied, + Unmultiplied + }; + class ImageBuffer : public Noncopyable { public: // Will return a null pointer on allocation failure. - static PassOwnPtr<ImageBuffer> create(const IntSize& size, bool grayScale) + static PassOwnPtr<ImageBuffer> create(const IntSize& size, ImageColorSpace colorSpace = DeviceRGB) { bool success = false; - OwnPtr<ImageBuffer> buf(new ImageBuffer(size, grayScale, success)); + OwnPtr<ImageBuffer> buf(new ImageBuffer(size, colorSpace, success)); if (success) return buf.release(); return 0; @@ -64,12 +76,17 @@ namespace WebCore { void clearImage() { m_image.clear(); } - PassRefPtr<ImageData> getImageData(const IntRect& rect) const; - void putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint); + PassRefPtr<ImageData> getUnmultipliedImageData(const IntRect&) const; + PassRefPtr<ImageData> getPremultipliedImageData(const IntRect&) const; + + void putUnmultipliedImageData(ImageData*, const IntRect& sourceRect, const IntPoint& destPoint); + void putPremultipliedImageData(ImageData*, const IntRect& sourceRect, const IntPoint& destPoint); String toDataURL(const String& mimeType) const; #if !PLATFORM(CG) TransformationMatrix baseTransform() const { return TransformationMatrix(); } + void transformColorSpace(ImageColorSpace srcColorSpace, ImageColorSpace dstColorSpace); + void platformTransformColorSpace(const Vector<int>&); #else TransformationMatrix baseTransform() const { return TransformationMatrix(1, 0, 0, -1, 0, m_size.height()); } #endif @@ -80,9 +97,14 @@ namespace WebCore { OwnPtr<GraphicsContext> m_context; mutable RefPtr<Image> m_image; +#if !PLATFORM(CG) + Vector<int> m_linearRgbLUT; + Vector<int> m_deviceRgbLUT; +#endif + // This constructor will place its success into the given out-variable // so that create() knows when it should return failure. - ImageBuffer(const IntSize&, bool grayScale, bool& success); + ImageBuffer(const IntSize&, ImageColorSpace colorSpace, bool& success); }; } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageSourceQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.cpp index 1ffc1eb37..bf7ae21bb 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageSourceQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.cpp @@ -1,8 +1,8 @@ /* - * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * All rights reserved. + * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2007 Alp Toker <alp.toker@collabora.co.uk> + * Copyright (C) 2008, Google Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,12 +28,18 @@ #include "config.h" #include "ImageSource.h" + +#if PLATFORM(QT) #include "ImageDecoderQt.h" -#include "SharedBuffer.h" +#else +#include "ImageDecoder.h" +#endif -#include <QBuffer> -#include <QImage> -#include <QImageReader> +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) +#ifndef IMAGE_DECODER_DOWN_SAMPLING_MAX_NUMBER_OF_PIXELS +#define IMAGE_DECODER_DOWN_SAMPLING_MAX_NUMBER_OF_PIXELS (1024 * 1024) +#endif +#endif namespace WebCore { @@ -47,6 +53,20 @@ ImageSource::~ImageSource() clear(true); } +void ImageSource::clear(bool destroyAll, size_t clearBeforeFrame, SharedBuffer* data, bool allDataReceived) +{ + if (!destroyAll) { + if (m_decoder) + m_decoder->clearFrameBufferCache(clearBeforeFrame); + return; + } + + delete m_decoder; + m_decoder = 0; + if (data) + setData(data, allDataReceived); +} + bool ImageSource::initialized() const { return m_decoder; @@ -58,58 +78,46 @@ void ImageSource::setData(SharedBuffer* data, bool allDataReceived) // This method will examine the data and instantiate an instance of the appropriate decoder plugin. // If insufficient bytes are available to determine the image type, no decoder plugin will be // made. - if (!m_decoder) - m_decoder = ImageDecoderQt::create(*data); - - if (!m_decoder) - return; + if (!m_decoder) { + m_decoder = static_cast<NativeImageSourcePtr>(ImageDecoder::create(*data)); +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) + if (m_decoder) + m_decoder->setMaxNumPixels(IMAGE_DECODER_DOWN_SAMPLING_MAX_NUMBER_OF_PIXELS); +#endif + } - m_decoder->setData(data->buffer(), allDataReceived); + if (m_decoder) + m_decoder->setData(data, allDataReceived); } String ImageSource::filenameExtension() const { - if (!m_decoder) - return String(); - - return m_decoder->filenameExtension(); + return m_decoder ? m_decoder->filenameExtension() : String(); } bool ImageSource::isSizeAvailable() { - if (!m_decoder) - return false; - - return m_decoder->isSizeAvailable(); + return m_decoder && m_decoder->isSizeAvailable(); } IntSize ImageSource::size() const { - if (!m_decoder) - return IntSize(); - - return m_decoder->size(); + return m_decoder ? m_decoder->size() : IntSize(); } -IntSize ImageSource::frameSizeAtIndex(size_t) const +IntSize ImageSource::frameSizeAtIndex(size_t index) const { - return size(); + return m_decoder ? m_decoder->frameSizeAtIndex(index) : IntSize(); } int ImageSource::repetitionCount() { - if (!m_decoder) - return cAnimationNone; - - return m_decoder->repetitionCount(); + return m_decoder ? m_decoder->repetitionCount() : cAnimationNone; } size_t ImageSource::frameCount() const { - if (!m_decoder) - return 0; - - return m_decoder->frameCount(); + return m_decoder ? m_decoder->frameCount() : 0; } NativeImagePtr ImageSource::createFrameAtIndex(size_t index) @@ -117,7 +125,18 @@ NativeImagePtr ImageSource::createFrameAtIndex(size_t index) if (!m_decoder) return 0; - return m_decoder->imageAtIndex(index); + RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index); + if (!buffer || buffer->status() == RGBA32Buffer::FrameEmpty) + return 0; + + // Zero-height images can cause problems for some ports. If we have an + // empty image dimension, just bail. + if (size().isEmpty()) + return 0; + + // Return the buffer contents as a native image. For some ports, the data + // is already in a native container, and this just increments its refcount. + return buffer->asNewNativeImage(); } float ImageSource::frameDurationAtIndex(size_t index) @@ -125,46 +144,38 @@ float ImageSource::frameDurationAtIndex(size_t index) if (!m_decoder) return 0; + RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index); + if (!buffer || buffer->status() == RGBA32Buffer::FrameEmpty) + return 0; + // Many annoying ads specify a 0 duration to make an image flash as quickly // as possible. We follow WinIE's behavior and use a duration of 100 ms // for any frames that specify a duration of <= 50 ms. See // <http://bugs.webkit.org/show_bug.cgi?id=14413> or Radar 4051389 for // more. - const float duration = m_decoder->duration(index) / 1000.0f; + const float duration = buffer->duration() / 1000.0f; return (duration < 0.051f) ? 0.100f : duration; } bool ImageSource::frameHasAlphaAtIndex(size_t index) { - if (!m_decoder || !m_decoder->supportsAlpha()) - return false; - - const QPixmap* source = m_decoder->imageAtIndex(index); - if (!source) - return false; - - return source->hasAlphaChannel(); + // When a frame has not finished decoding, always mark it as having alpha. + // Ports that check the result of this function to determine their + // compositing op need this in order to not draw the undecoded portion as + // black. + // TODO: Perhaps we should ensure that each individual decoder returns true + // in this case. + return !frameIsCompleteAtIndex(index) + || m_decoder->frameBufferAtIndex(index)->hasAlpha(); } bool ImageSource::frameIsCompleteAtIndex(size_t index) { - return (m_decoder && m_decoder->imageAtIndex(index)); -} - -void ImageSource::clear(bool destroyAll, size_t clearBeforeFrame, SharedBuffer* data, bool allDataReceived) -{ - if (!destroyAll) { - if (m_decoder) - m_decoder->clearFrameBufferCache(clearBeforeFrame); - return; - } + if (!m_decoder) + return false; - delete m_decoder; - m_decoder = 0; - if (data) - setData(data, allDataReceived); + RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index); + return buffer && buffer->status() == RGBA32Buffer::FrameComplete; } } - -// vim: ts=4 sw=4 et diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h index acb64de84..3559abe95 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/ImageSource.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2007-2008 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -46,6 +47,10 @@ struct _cairo_surface; typedef struct _cairo_surface cairo_surface_t; #elif PLATFORM(SKIA) class NativeImageSkia; +#elif PLATFORM(HAIKU) +class BBitmap; +#elif PLATFORM(WINCE) +#include "SharedBitmap.h" #endif namespace WebCore { @@ -54,30 +59,31 @@ class IntSize; class SharedBuffer; class String; -#if PLATFORM(WX) -class ImageDecoder; -typedef ImageDecoder* NativeImageSourcePtr; -typedef const Vector<char>* NativeBytePtr; -#if USE(WXGC) -typedef wxGraphicsBitmap* NativeImagePtr; -#else -typedef wxBitmap* NativeImagePtr; -#endif -#elif PLATFORM(CG) +#if PLATFORM(CG) typedef CGImageSourceRef NativeImageSourcePtr; typedef CGImageRef NativeImagePtr; #elif PLATFORM(QT) class ImageDecoderQt; typedef ImageDecoderQt* NativeImageSourcePtr; typedef QPixmap* NativeImagePtr; -#elif PLATFORM(CAIRO) +#else class ImageDecoder; typedef ImageDecoder* NativeImageSourcePtr; +#if PLATFORM(WX) +#if USE(WXGC) +typedef wxGraphicsBitmap* NativeImagePtr; +#else +typedef wxBitmap* NativeImagePtr; +#endif +#elif PLATFORM(CAIRO) typedef cairo_surface_t* NativeImagePtr; #elif PLATFORM(SKIA) -class ImageDecoder; -typedef ImageDecoder* NativeImageSourcePtr; typedef NativeImageSkia* NativeImagePtr; +#elif PLATFORM(HAIKU) +typedef BBitmap* NativeImagePtr; +#elif PLATFORM(WINCE) +typedef RefPtr<SharedBitmap> NativeImagePtr; +#endif #endif const int cAnimationLoopOnce = -1; @@ -135,9 +141,7 @@ public: bool frameHasAlphaAtIndex(size_t); // Whether or not the frame actually used any alpha. bool frameIsCompleteAtIndex(size_t); // Whether or not the frame is completely decoded. - // FIXME: This is protected only to allow ImageSourceSkia to set ICO decoder - // with a preferred size. See ImageSourceSkia.h for discussion. -protected: +private: NativeImageSourcePtr m_decoder; }; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/IntPoint.h b/src/3rdparty/webkit/WebCore/platform/graphics/IntPoint.h index 21af67b0a..ab5f3ec56 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/IntPoint.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/IntPoint.h @@ -55,6 +55,8 @@ class QPoint; QT_END_NAMESPACE #elif PLATFORM(GTK) typedef struct _GdkPoint GdkPoint; +#elif PLATFORM(HAIKU) +class BPoint; #endif #if PLATFORM(WX) @@ -121,6 +123,9 @@ public: #elif PLATFORM(GTK) IntPoint(const GdkPoint&); operator GdkPoint() const; +#elif PLATFORM(HAIKU) + explicit IntPoint(const BPoint&); + operator BPoint() const; #endif #if PLATFORM(WX) diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/IntRect.h b/src/3rdparty/webkit/WebCore/platform/graphics/IntRect.h index 6c02d213f..97b21bc80 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/IntRect.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/IntRect.h @@ -33,7 +33,7 @@ typedef struct CGRect CGRect; #endif -#if PLATFORM(MAC) +#if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) #ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES typedef struct CGRect NSRect; #else @@ -49,6 +49,8 @@ class QRect; QT_END_NAMESPACE #elif PLATFORM(GTK) typedef struct _GdkRectangle GdkRectangle; +#elif PLATFORM(HAIKU) +class BRect; #endif #if PLATFORM(WX) @@ -144,6 +146,9 @@ public: #elif PLATFORM(GTK) IntRect(const GdkRectangle&); operator GdkRectangle() const; +#elif PLATFORM(HAIKU) + explicit IntRect(const BRect&); + operator BRect() const; #endif #if PLATFORM(CG) @@ -156,7 +161,8 @@ public: operator SkIRect() const; #endif -#if PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) +#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ + || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) operator NSRect() const; #endif @@ -193,7 +199,8 @@ inline bool operator!=(const IntRect& a, const IntRect& b) IntRect enclosingIntRect(const CGRect&); #endif -#if PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) +#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ + || (PLATFORM(CHROMIUM) && PLATFORM(DARWIN)) IntRect enclosingIntRect(const NSRect&); #endif diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/IntSize.h b/src/3rdparty/webkit/WebCore/platform/graphics/IntSize.h index dc7a85dce..b242784f1 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/IntSize.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/IntSize.h @@ -47,6 +47,12 @@ typedef struct tagSIZE SIZE; QT_BEGIN_NAMESPACE class QSize; QT_END_NAMESPACE +#elif PLATFORM(HAIKU) +class BSize; +#endif + +#if PLATFORM(WX) +class wxSize; #endif namespace WebCore { @@ -113,6 +119,15 @@ public: operator QSize() const; #endif +#if PLATFORM(HAIKU) + explicit IntSize(const BSize&); + operator BSize() const; +#endif + +#if PLATFORM(WX) + IntSize(const wxSize&); + operator wxSize() const; +#endif private: int m_width, m_height; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp index d4fab5235..3b32b654b 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.cpp @@ -35,9 +35,12 @@ #include "FrameView.h" #include "Frame.h" #include "Document.h" +#include "TimeRanges.h" #if PLATFORM(MAC) #include "MediaPlayerPrivateQTKit.h" +#elif PLATFORM(WINCE) && !PLATFORM(QT) +#include "MediaPlayerPrivateWince.h" #elif PLATFORM(WIN) #include "MediaPlayerPrivateQuickTimeWin.h" #elif PLATFORM(GTK) @@ -59,14 +62,16 @@ public: virtual void load(const String&) { } virtual void cancelLoad() { } + virtual void prepareToPlay() { } virtual void play() { } virtual void pause() { } - virtual bool supportsFullscreen() const { return false; } + virtual PlatformMedia platformMedia() const { return NoPlatformMedia; } virtual IntSize naturalSize() const { return IntSize(0, 0); } virtual bool hasVideo() const { return false; } + virtual bool hasAudio() const { return false; } virtual void setVisible(bool) { } @@ -88,7 +93,7 @@ public: virtual MediaPlayer::ReadyState readyState() const { return MediaPlayer::HaveNothing; } virtual float maxTimeSeekable() const { return 0; } - virtual float maxTimeBuffered() const { return 0; } + virtual PassRefPtr<TimeRanges> buffered() const { return TimeRanges::create(); } virtual int dataRate() const { return 0; } @@ -100,8 +105,10 @@ public: virtual void paint(GraphicsContext*, const IntRect&) { } + virtual bool canLoadPoster() const { return false; } + virtual void setPoster(const String&) { } + #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) - virtual void setPoster(const String& /*url*/) { } virtual void deliverNotification(MediaPlayerProxyNotificationType) { } virtual void setMediaPlayerProxy(WebMediaPlayerProxy*) { } #endif @@ -249,18 +256,26 @@ void MediaPlayer::load(const String& url, const ContentType& contentType) m_private.set(createNullMediaPlayer(this)); } -#if ENABLE(PLUGIN_PROXY_FOR_VIDEO) +bool MediaPlayer::canLoadPoster() const +{ + return m_private->canLoadPoster(); +} + void MediaPlayer::setPoster(const String& url) { m_private->setPoster(url); } -#endif void MediaPlayer::cancelLoad() { m_private->cancelLoad(); } +void MediaPlayer::prepareToPlay() +{ + m_private->prepareToPlay(); +} + void MediaPlayer::play() { m_private->play(); @@ -316,11 +331,16 @@ IntSize MediaPlayer::naturalSize() return m_private->naturalSize(); } -bool MediaPlayer::hasVideo() +bool MediaPlayer::hasVideo() const { return m_private->hasVideo(); } +bool MediaPlayer::hasAudio() const +{ + return m_private->hasAudio(); +} + bool MediaPlayer::inMediaDocument() { Frame* frame = m_frameView ? m_frameView->frame() : 0; @@ -329,6 +349,11 @@ bool MediaPlayer::inMediaDocument() return document && document->isMediaDocument(); } +PlatformMedia MediaPlayer::platformMedia() const +{ + return m_private->platformMedia(); +} + MediaPlayer::NetworkState MediaPlayer::networkState() { return m_private->networkState(); @@ -382,9 +407,9 @@ void MediaPlayer::setEndTime(float time) m_private->setEndTime(time); } -float MediaPlayer::maxTimeBuffered() +PassRefPtr<TimeRanges> MediaPlayer::buffered() { - return m_private->maxTimeBuffered(); + return m_private->buffered(); } float MediaPlayer::maxTimeSeekable() diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h index 7f5f2a04b..4cc6476db 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 Apple Inc. All rights reserved. + * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -38,8 +38,24 @@ #include <wtf/OwnPtr.h> #include <wtf/Noncopyable.h> +#ifdef __OBJC__ +@class QTMovie; +#else +class QTMovie; +#endif + namespace WebCore { +// Structure that will hold every native +// types supported by the current media player. +// We have to do that has multiple media players +// backend can live at runtime. +typedef struct PlatformMedia { + QTMovie* qtMovie; +} PlatformMedia; + +static const PlatformMedia NoPlatformMedia = { 0 }; + class ContentType; class FrameView; class GraphicsContext; @@ -48,6 +64,7 @@ class IntSize; class MediaPlayer; class MediaPlayerPrivateInterface; class String; +class TimeRanges; #if USE(ACCELERATED_COMPOSITING) class GraphicsLayer; @@ -109,8 +126,11 @@ public: bool supportsFullscreen() const; bool supportsSave() const; + PlatformMedia platformMedia() const; + IntSize naturalSize(); - bool hasVideo(); + bool hasVideo() const; + bool hasAudio() const; void setFrameView(FrameView* frameView) { m_frameView = frameView; } FrameView* frameView() { return m_frameView; } @@ -125,6 +145,7 @@ public: bool visible() const; void setVisible(bool); + void prepareToPlay(); void play(); void pause(); @@ -145,7 +166,7 @@ public: bool preservesPitch() const; void setPreservesPitch(bool); - float maxTimeBuffered(); + PassRefPtr<TimeRanges> buffered(); float maxTimeSeekable(); unsigned bytesLoaded(); @@ -184,8 +205,10 @@ public: MediaPlayerClient* mediaPlayerClient() const { return m_mediaPlayerClient; } + bool canLoadPoster() const; + void setPoster(const String&); + #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) - void setPoster(const String& url); void deliverNotification(MediaPlayerProxyNotificationType notification); void setMediaPlayerProxy(WebMediaPlayerProxy* proxy); #endif diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h index 6d1359b35..f5687b311 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/MediaPlayerPrivate.h @@ -43,6 +43,9 @@ public: virtual void load(const String& url) = 0; virtual void cancelLoad() = 0; + virtual void prepareToPlay() { } + virtual PlatformMedia platformMedia() const { return NoPlatformMedia; } + virtual void play() = 0; virtual void pause() = 0; @@ -52,6 +55,7 @@ public: virtual IntSize naturalSize() const = 0; virtual bool hasVideo() const = 0; + virtual bool hasAudio() const = 0; virtual void setVisible(bool) = 0; @@ -76,7 +80,7 @@ public: virtual MediaPlayer::ReadyState readyState() const = 0; virtual float maxTimeSeekable() const = 0; - virtual float maxTimeBuffered() const = 0; + virtual PassRefPtr<TimeRanges> buffered() const = 0; virtual int dataRate() const = 0; @@ -92,8 +96,10 @@ public: virtual void setAutobuffer(bool) { }; + virtual bool canLoadPoster() const { return false; } + virtual void setPoster(const String&) { } + #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) - virtual void setPoster(const String& url) = 0; virtual void deliverNotification(MediaPlayerProxyNotificationType) = 0; virtual void setMediaPlayerProxy(WebMediaPlayerProxy*) = 0; #endif diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/Path.h b/src/3rdparty/webkit/WebCore/platform/graphics/Path.h index 04717246d..26927a1f0 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/Path.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/Path.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2003, 2006, 2009 Apple Inc. All rights reserved. * 2006 Rob Buis <buis@kde.org> + * Copyright (C) 2007-2008 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -48,6 +49,13 @@ typedef WebCore::CairoPath PlatformPath; #elif PLATFORM(SKIA) class SkPath; typedef SkPath PlatformPath; +#elif PLATFORM(HAIKU) +class BRegion; +typedef BRegion PlatformPath; +#elif PLATFORM(WINCE) +namespace WebCore { + class PlatformPath; +} #else typedef void PlatformPath; #endif diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/Pattern.h b/src/3rdparty/webkit/WebCore/platform/graphics/Pattern.h index d4aa3b9ae..aa0a35702 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/Pattern.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/Pattern.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2006, 2007, 2008 Apple Computer, Inc. All rights reserved. * Copyright (C) 2008 Eric Seidel <eric@webkit.org> + * Copyright (C) 2007-2008 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -52,6 +53,11 @@ typedef wxGraphicsBrush* PlatformPatternPtr; class wxBrush; typedef wxBrush* PlatformPatternPtr; #endif // USE(WXGC) +#elif PLATFORM(HAIKU) +#include <interface/GraphicsDefs.h> +typedef pattern* PlatformPatternPtr; +#elif PLATFORM(WINCE) +typedef void* PlatformPatternPtr; #endif namespace WebCore { diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.cpp index c879228a7..2ec8abb8e 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.cpp @@ -48,7 +48,9 @@ using namespace std; namespace WebCore { SimpleFontData::SimpleFontData(const FontPlatformData& f, bool customFont, bool loading, SVGFontData* svgFontData) - : m_unitsPerEm(defaultUnitsPerEm) + : m_maxCharWidth(-1) + , m_avgCharWidth(-1) + , m_unitsPerEm(defaultUnitsPerEm) , m_platformData(f) , m_treatAsFixedPitch(false) #if ENABLE(SVG_FONTS) diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h b/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h index cb472b073..387a5c77e 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/SimpleFontData.h @@ -2,6 +2,7 @@ * This file is part of the internal font implementation. * * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2007-2008 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -27,13 +28,14 @@ #include "FontPlatformData.h" #include "GlyphPageTreeNode.h" #include "GlyphWidthMap.h" +#include "TextRenderingMode.h" #include <wtf/OwnPtr.h> #if USE(ATSUI) typedef struct OpaqueATSUStyle* ATSUStyle; #endif -#if PLATFORM(WIN) +#if PLATFORM(WIN) && !PLATFORM(WINCE) #include <usp10.h> #endif @@ -45,6 +47,10 @@ typedef struct OpaqueATSUStyle* ATSUStyle; #include <QFont> #endif +#if PLATFORM(HAIKU) +#include <Font.h> +#endif + namespace WebCore { class FontDescription; @@ -115,7 +121,7 @@ public: #if USE(CORE_TEXT) CTFontRef getCTFont() const; - CFDictionaryRef getCFStringAttributes() const; + CFDictionaryRef getCFStringAttributes(TextRenderingMode) const; #endif #if USE(ATSUI) @@ -134,17 +140,14 @@ public: #if PLATFORM(WIN) bool isSystemFont() const { return m_isSystemFont; } +#if !PLATFORM(WINCE) // disable unused members to save space SCRIPT_FONTPROPERTIES* scriptFontProperties() const; SCRIPT_CACHE* scriptCache() const { return &m_scriptCache; } - +#endif static void setShouldApplyMacAscentHack(bool); static bool shouldApplyMacAscentHack(); #endif -#if PLATFORM(CAIRO) - void setFont(cairo_t*) const; -#endif - #if PLATFORM(WX) wxFont* getWxFont() const { return m_platformData.font(); } #endif @@ -159,7 +162,7 @@ private: void commonInit(); -#if PLATFORM(WIN) +#if PLATFORM(WIN) && !PLATFORM(WINCE) void initGDIFont(); void platformCommonDestroy(); float widthForGDIGlyph(Glyph glyph) const; @@ -224,9 +227,11 @@ private: #if PLATFORM(WIN) bool m_isSystemFont; +#if !PLATFORM(WINCE) // disable unused members to save space mutable SCRIPT_CACHE m_scriptCache; mutable SCRIPT_FONTPROPERTIES* m_scriptFontProperties; #endif +#endif }; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/TextRenderingMode.h b/src/3rdparty/webkit/WebCore/platform/graphics/TextRenderingMode.h new file mode 100644 index 000000000..4f817a4a4 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/graphics/TextRenderingMode.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 TextRenderingMode_h +#define TextRenderingMode_h + +namespace WebCore { + + enum TextRenderingMode { AutoTextRendering, OptimizeSpeed, OptimizeLegibility, GeometricPrecision }; + +} // namespace WebCore + +#endif // TextRenderingMode_h diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.cpp index 86b702f4e..2364cc473 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.cpp @@ -2,6 +2,7 @@ Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2004, 2005 Rob Buis <buis@kde.org> 2005 Eric Seidel <eric@webkit.org> + 2009 Dirk Schulze <krit@webkit.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -24,7 +25,13 @@ #if ENABLE(FILTERS) #include "FEBlend.h" +#include "CanvasPixelArray.h" #include "Filter.h" +#include "FloatPoint.h" +#include "GraphicsContext.h" +#include "ImageData.h" + +typedef unsigned char (*BlendType)(unsigned char colorA, unsigned char colorB, unsigned char alphaA, unsigned char alphaB); namespace WebCore { @@ -61,8 +68,77 @@ void FEBlend::setBlendMode(BlendModeType mode) m_mode = mode; } -void FEBlend::apply(Filter*) +static unsigned char unknown(unsigned char, unsigned char, unsigned char, unsigned char) +{ + return 0; +} + +static unsigned char normal(unsigned char colorA, unsigned char colorB, unsigned char alphaA, unsigned char) +{ + return (((255 - alphaA) * colorB + colorA * 255) / 255); +} + +static unsigned char multiply(unsigned char colorA, unsigned char colorB, unsigned char alphaA, unsigned char alphaB) +{ + return (((255 - alphaA) * colorB + (255 - alphaB + colorB) * colorA) / 255); +} + +static unsigned char screen(unsigned char colorA, unsigned char colorB, unsigned char, unsigned char) +{ + return (((colorB + colorA) * 255 - colorA * colorB) / 255); +} + +static unsigned char darken(unsigned char colorA, unsigned char colorB, unsigned char alphaA, unsigned char alphaB) +{ + return ((std::min((255 - alphaA) * colorB + colorA * 255, (255 - alphaB) * colorA + colorB * 255)) / 255); +} + +static unsigned char lighten(unsigned char colorA, unsigned char colorB, unsigned char alphaA, unsigned char alphaB) { + return ((std::max((255 - alphaA) * colorB + colorA * 255, (255 - alphaB) * colorA + colorB * 255)) / 255); +} + +void FEBlend::apply(Filter* filter) +{ + m_in->apply(filter); + m_in2->apply(filter); + if (!m_in->resultImage() || !m_in2->resultImage()) + return; + + if (m_mode == FEBLEND_MODE_UNKNOWN) + return; + + if (!getEffectContext()) + return; + + IntRect effectADrawingRect = calculateDrawingIntRect(m_in->subRegion()); + RefPtr<CanvasPixelArray> srcPixelArrayA(m_in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data()); + + IntRect effectBDrawingRect = calculateDrawingIntRect(m_in2->subRegion()); + RefPtr<CanvasPixelArray> srcPixelArrayB(m_in2->resultImage()->getPremultipliedImageData(effectBDrawingRect)->data()); + + IntRect imageRect(IntPoint(), resultImage()->size()); + RefPtr<ImageData> imageData = ImageData::create(imageRect.width(), imageRect.height()); + + // Keep synchronized with BlendModeType + static const BlendType callEffect[] = {unknown, normal, multiply, screen, darken, lighten}; + + ASSERT(srcPixelArrayA->length() == srcPixelArrayB->length()); + for (unsigned pixelOffset = 0; pixelOffset < srcPixelArrayA->length(); pixelOffset += 4) { + unsigned char alphaA = srcPixelArrayA->get(pixelOffset + 3); + unsigned char alphaB = srcPixelArrayB->get(pixelOffset + 3); + for (unsigned channel = 0; channel < 3; ++channel) { + unsigned char colorA = srcPixelArrayA->get(pixelOffset + channel); + unsigned char colorB = srcPixelArrayB->get(pixelOffset + channel); + + unsigned char result = (*callEffect[m_mode])(colorA, colorB, alphaA, alphaB); + imageData->data()->set(pixelOffset + channel, result); + } + unsigned char alphaR = 255 - ((255 - alphaA) * (255 - alphaB)) / 255; + imageData->data()->set(pixelOffset + 3, alphaR); + } + + resultImage()->putPremultipliedImageData(imageData.get(), imageRect, IntPoint()); } void FEBlend::dump() diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.h b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.h index b09cd7227..31c625f31 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEBlend.h @@ -41,7 +41,7 @@ namespace WebCore { class FEBlend : public FilterEffect { public: static PassRefPtr<FEBlend> create(FilterEffect*, FilterEffect*, BlendModeType); - + FilterEffect* in2() const; void setIn2(FilterEffect*); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEColorMatrix.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEColorMatrix.cpp index 8704e645f..a2ed9bd08 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEColorMatrix.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEColorMatrix.cpp @@ -2,6 +2,7 @@ Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2004, 2005 Rob Buis <buis@kde.org> 2005 Eric Seidel <eric@webkit.org> + 2009 Dirk Schulze <krit@webkit.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -24,7 +25,12 @@ #if ENABLE(FILTERS) #include "FEColorMatrix.h" +#include "CanvasPixelArray.h" #include "Filter.h" +#include "GraphicsContext.h" +#include "ImageData.h" +#include <math.h> +#include <wtf/MathExtras.h> namespace WebCore { @@ -61,8 +67,127 @@ void FEColorMatrix::setValues(const Vector<float> &values) m_values = values; } -void FEColorMatrix::apply(Filter*) +inline void matrix(double& red, double& green, double& blue, double& alpha, const Vector<float>& values) { + double r = values[0] * red + values[1] * green + values[2] * blue + values[3] * alpha; + double g = values[5] * red + values[6] * green + values[7] * blue + values[8] * alpha; + double b = values[10] * red + values[11] * green + values[12] * blue + values[13] * alpha; + double a = values[15] * red + values[16] * green + values[17] * blue + values[18] * alpha; + + red = r; + green = g; + blue = b; + alpha = a; +} + +inline void saturate(double& red, double& green, double& blue, const float& s) +{ + double r = (0.213 + 0.787 * s) * red + (0.715 - 0.715 * s) * green + (0.072 - 0.072 * s) * blue; + double g = (0.213 - 0.213 * s) * red + (0.715 + 0.285 * s) * green + (0.072 - 0.072 * s) * blue; + double b = (0.213 - 0.213 * s) * red + (0.715 - 0.715 * s) * green + (0.072 + 0.928 * s) * blue; + + red = r; + green = g; + blue = b; +} + +inline void huerotate(double& red, double& green, double& blue, const float& hue) +{ + double cosHue = cos(hue * piDouble / 180); + double sinHue = sin(hue * piDouble / 180); + double r = red * (0.213 + cosHue * 0.787 - sinHue * 0.213) + + green * (0.715 - cosHue * 0.715 - sinHue * 0.715) + + blue * (0.072 - cosHue * 0.072 + sinHue * 0.928); + double g = red * (0.213 - cosHue * 0.213 + sinHue * 0.143) + + green * (0.715 + cosHue * 0.285 + sinHue * 0.140) + + blue * (0.072 - cosHue * 0.072 - sinHue * 0.283); + double b = red * (0.213 - cosHue * 0.213 - sinHue * 0.787) + + green * (0.715 - cosHue * 0.715 + sinHue * 0.715) + + blue * (0.072 + cosHue * 0.928 + sinHue * 0.072); + + red = r; + green = g; + blue = b; +} + +inline void luminance(double& red, double& green, double& blue, double& alpha) +{ + alpha = 0.2125 * red + 0.7154 * green + 0.0721 * blue; + red = 0.; + green = 0.; + blue = 0.; +} + +template<ColorMatrixType filterType> +void effectType(const PassRefPtr<CanvasPixelArray>& srcPixelArray, PassRefPtr<ImageData>& imageData, const Vector<float>& values) +{ + for (unsigned pixelOffset = 0; pixelOffset < srcPixelArray->length(); pixelOffset++) { + unsigned pixelByteOffset = pixelOffset * 4; + + unsigned char r = 0, g = 0, b = 0, a = 0; + srcPixelArray->get(pixelByteOffset, r); + srcPixelArray->get(pixelByteOffset + 1, g); + srcPixelArray->get(pixelByteOffset + 2, b); + srcPixelArray->get(pixelByteOffset + 3, a); + + double red = r, green = g, blue = b, alpha = a; + + switch (filterType) { + case FECOLORMATRIX_TYPE_MATRIX: + matrix(red, green, blue, alpha, values); + break; + case FECOLORMATRIX_TYPE_SATURATE: + saturate(red, green, blue, values[0]); + break; + case FECOLORMATRIX_TYPE_HUEROTATE: + huerotate(red, green, blue, values[0]); + break; + case FECOLORMATRIX_TYPE_LUMINANCETOALPHA: + luminance(red, green, blue, alpha); + break; + } + + imageData->data()->set(pixelByteOffset, red); + imageData->data()->set(pixelByteOffset + 1, green); + imageData->data()->set(pixelByteOffset + 2, blue); + imageData->data()->set(pixelByteOffset + 3, alpha); + } +} + +void FEColorMatrix::apply(Filter* filter) +{ + m_in->apply(filter); + if (!m_in->resultImage()) + return; + + GraphicsContext* filterContext = getEffectContext(); + if (!filterContext) + return; + + filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion())); + + IntRect imageRect(IntPoint(), resultImage()->size()); + PassRefPtr<ImageData> imageData(resultImage()->getUnmultipliedImageData(imageRect)); + PassRefPtr<CanvasPixelArray> srcPixelArray(imageData->data()); + + switch (m_type) { + case FECOLORMATRIX_TYPE_UNKNOWN: + break; + case FECOLORMATRIX_TYPE_MATRIX: + effectType<FECOLORMATRIX_TYPE_MATRIX>(srcPixelArray, imageData, m_values); + break; + case FECOLORMATRIX_TYPE_SATURATE: + effectType<FECOLORMATRIX_TYPE_SATURATE>(srcPixelArray, imageData, m_values); + break; + case FECOLORMATRIX_TYPE_HUEROTATE: + effectType<FECOLORMATRIX_TYPE_HUEROTATE>(srcPixelArray, imageData, m_values); + break; + case FECOLORMATRIX_TYPE_LUMINANCETOALPHA: + effectType<FECOLORMATRIX_TYPE_LUMINANCETOALPHA>(srcPixelArray, imageData, m_values); + break; + } + + resultImage()->putUnmultipliedImageData(imageData.get(), imageRect, IntPoint()); } void FEColorMatrix::dump() diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComponentTransfer.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComponentTransfer.cpp index 54ac1232e..0d76d8d6a 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComponentTransfer.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComponentTransfer.cpp @@ -2,6 +2,7 @@ Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2004, 2005 Rob Buis <buis@kde.org> 2005 Eric Seidel <eric@webkit.org> + 2009 Dirk Schulze <krit@webkit.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -24,10 +25,16 @@ #if ENABLE(FILTERS) #include "FEComponentTransfer.h" +#include "CanvasPixelArray.h" #include "Filter.h" +#include "GraphicsContext.h" +#include "ImageData.h" +#include <math.h> namespace WebCore { +typedef void (*TransferType)(unsigned char*, const ComponentTransferFunction&); + FEComponentTransfer::FEComponentTransfer(FilterEffect* in, const ComponentTransferFunction& redFunc, const ComponentTransferFunction& greenFunc, const ComponentTransferFunction& blueFunc, const ComponentTransferFunction& alphaFunc) : FilterEffect() @@ -85,8 +92,91 @@ void FEComponentTransfer::setAlphaFunction(const ComponentTransferFunction& func m_alphaFunc = func; } -void FEComponentTransfer::apply(Filter*) +static void identity(unsigned char*, const ComponentTransferFunction&) +{ +} + +static void table(unsigned char* values, const ComponentTransferFunction& transferFunction) +{ + const Vector<float>& tableValues = transferFunction.tableValues; + unsigned n = tableValues.size(); + if (n < 1) + return; + for (unsigned i = 0; i < 256; ++i) { + double c = i / 255.0; + unsigned k = static_cast<unsigned>(c * (n - 1)); + double v1 = tableValues[k]; + double v2 = tableValues[std::min((k + 1), (n - 1))]; + double val = 255.0 * (v1 + (c * (n - 1) - k) * (v2 - v1)); + val = std::max(0.0, std::min(255.0, val)); + values[i] = static_cast<unsigned char>(val); + } +} + +static void discrete(unsigned char* values, const ComponentTransferFunction& transferFunction) +{ + const Vector<float>& tableValues = transferFunction.tableValues; + unsigned n = tableValues.size(); + if (n < 1) + return; + for (unsigned i = 0; i < 256; ++i) { + unsigned k = static_cast<unsigned>((i * n) / 255.0); + k = std::min(k, n - 1); + double val = 255 * tableValues[k]; + val = std::max(0.0, std::min(255.0, val)); + values[i] = static_cast<unsigned char>(val); + } +} + +static void linear(unsigned char* values, const ComponentTransferFunction& transferFunction) +{ + for (unsigned i = 0; i < 256; ++i) { + double val = transferFunction.slope * i + 255 * transferFunction.intercept; + val = std::max(0.0, std::min(255.0, val)); + values[i] = static_cast<unsigned char>(val); + } +} + +static void gamma(unsigned char* values, const ComponentTransferFunction& transferFunction) +{ + for (unsigned i = 0; i < 256; ++i) { + double val = 255.0 * (transferFunction.amplitude * pow((i / 255.0), transferFunction.exponent) + transferFunction.offset); + val = std::max(0.0, std::min(255.0, val)); + values[i] = static_cast<unsigned char>(val); + } +} + +void FEComponentTransfer::apply(Filter* filter) { + m_in->apply(filter); + if (!m_in->resultImage()) + return; + + if (!getEffectContext()) + return; + + unsigned char rValues[256], gValues[256], bValues[256], aValues[256]; + for (unsigned i = 0; i < 256; ++i) + rValues[i] = gValues[i] = bValues[i] = aValues[i] = i; + unsigned char* tables[] = { rValues, gValues, bValues, aValues }; + ComponentTransferFunction transferFunction[] = {m_redFunc, m_greenFunc, m_blueFunc, m_alphaFunc}; + TransferType callEffect[] = {identity, identity, table, discrete, linear, gamma}; + + for (unsigned channel = 0; channel < 4; channel++) + (*callEffect[transferFunction[channel].type])(tables[channel], transferFunction[channel]); + + IntRect drawingRect = calculateDrawingIntRect(m_in->subRegion()); + RefPtr<ImageData> imageData(m_in->resultImage()->getUnmultipliedImageData(drawingRect)); + CanvasPixelArray* srcPixelArray(imageData->data()); + + for (unsigned pixelOffset = 0; pixelOffset < srcPixelArray->length(); pixelOffset += 4) { + for (unsigned channel = 0; channel < 4; ++channel) { + unsigned char c = srcPixelArray->get(pixelOffset + channel); + imageData->data()->set(pixelOffset + channel, tables[channel][c]); + } + } + + resultImage()->putUnmultipliedImageData(imageData.get(), IntRect(IntPoint(), resultImage()->size()), IntPoint()); } void FEComponentTransfer::dump() diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp index 070635877..1b4116530 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEComposite.cpp @@ -2,6 +2,7 @@ Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> 2004, 2005 Rob Buis <buis@kde.org> 2005 Eric Seidel <eric@webkit.org> + 2009 Dirk Schulze <krit@webkit.org> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -24,7 +25,10 @@ #if ENABLE(FILTERS) #include "FEComposite.h" +#include "CanvasPixelArray.h" #include "Filter.h" +#include "GraphicsContext.h" +#include "ImageData.h" namespace WebCore { @@ -97,8 +101,74 @@ void FEComposite::setK4(float k4) m_k4 = k4; } -void FEComposite::apply(Filter*) +inline void arithmetic(const RefPtr<CanvasPixelArray>& srcPixelArrayA, CanvasPixelArray*& srcPixelArrayB, + float k1, float k2, float k3, float k4) { + float scaledK1 = k1 / 255.f; + float scaledK4 = k4 * 255.f; + for (unsigned pixelOffset = 0; pixelOffset < srcPixelArrayA->length(); pixelOffset += 4) { + for (unsigned channel = 0; channel < 4; ++channel) { + unsigned char i1 = srcPixelArrayA->get(pixelOffset + channel); + unsigned char i2 = srcPixelArrayB->get(pixelOffset + channel); + + unsigned char result = scaledK1 * i1 * i2 + k2 * i1 + k3 * i2 + scaledK4; + if (channel == 3 && i1 == 0 && i2 == 0) + result = 0; + srcPixelArrayB->set(pixelOffset + channel, result); + } + } +} + +void FEComposite::apply(Filter* filter) +{ + m_in->apply(filter); + m_in2->apply(filter); + if (!m_in->resultImage() || !m_in2->resultImage()) + return; + + GraphicsContext* filterContext = getEffectContext(); + if (!filterContext) + return; + + FloatRect srcRect = FloatRect(0.f, 0.f, -1.f, -1.f); + switch (m_type) { + case FECOMPOSITE_OPERATOR_OVER: + filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion())); + filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion())); + break; + case FECOMPOSITE_OPERATOR_IN: + filterContext->save(); + filterContext->clipToImageBuffer(calculateDrawingRect(m_in2->subRegion()), m_in2->resultImage()); + filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion())); + filterContext->restore(); + break; + case FECOMPOSITE_OPERATOR_OUT: + filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion())); + filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion()), srcRect, CompositeDestinationOut); + break; + case FECOMPOSITE_OPERATOR_ATOP: + filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion())); + filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()), srcRect, CompositeSourceAtop); + break; + case FECOMPOSITE_OPERATOR_XOR: + filterContext->drawImage(m_in2->resultImage()->image(), calculateDrawingRect(m_in2->subRegion())); + filterContext->drawImage(m_in->resultImage()->image(), calculateDrawingRect(m_in->subRegion()), srcRect, CompositeXOR); + break; + case FECOMPOSITE_OPERATOR_ARITHMETIC: { + IntRect effectADrawingRect = calculateDrawingIntRect(m_in->subRegion()); + RefPtr<CanvasPixelArray> srcPixelArrayA(m_in->resultImage()->getPremultipliedImageData(effectADrawingRect)->data()); + + IntRect effectBDrawingRect = calculateDrawingIntRect(m_in2->subRegion()); + RefPtr<ImageData> imageData(m_in2->resultImage()->getPremultipliedImageData(effectBDrawingRect)); + CanvasPixelArray* srcPixelArrayB(imageData->data()); + + arithmetic(srcPixelArrayA, srcPixelArrayB, m_k1, m_k2, m_k3, m_k4); + resultImage()->putPremultipliedImageData(imageData.get(), IntRect(IntPoint(), resultImage()->size()), IntPoint()); + } + break; + default: + break; + } } void FEComposite::dump() diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.cpp new file mode 100644 index 000000000..f480f10fc --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.cpp @@ -0,0 +1,140 @@ +/* + Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> + 2004, 2005 Rob Buis <buis@kde.org> + 2005 Eric Seidel <eric@webkit.org> + 2009 Dirk Schulze <krit@webkit.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + aint with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "config.h" + +#if ENABLE(FILTERS) +#include "FEGaussianBlur.h" + +#include "CanvasPixelArray.h" +#include "Filter.h" +#include "GraphicsContext.h" +#include "ImageData.h" +#include <math.h> +#include <wtf/MathExtras.h> + +namespace WebCore { + +FEGaussianBlur::FEGaussianBlur(FilterEffect* in, const float& x, const float& y) + : FilterEffect() + , m_in(in) + , m_x(x) + , m_y(y) +{ +} + +PassRefPtr<FEGaussianBlur> FEGaussianBlur::create(FilterEffect* in, const float& x, const float& y) +{ + return adoptRef(new FEGaussianBlur(in, x, y)); +} + +float FEGaussianBlur::stdDeviationX() const +{ + return m_x; +} + +void FEGaussianBlur::setStdDeviationX(float x) +{ + m_x = x; +} + +float FEGaussianBlur::stdDeviationY() const +{ + return m_y; +} + +void FEGaussianBlur::setStdDeviationY(float y) +{ + m_y = y; +} + +static void boxBlur(CanvasPixelArray*& srcPixelArray, CanvasPixelArray*& dstPixelArray, + unsigned dx, int stride, int strideLine, int effectWidth, int effectHeight, bool alphaImage) +{ + int dxLeft = dx / 2; + int dxRight = dx - dxLeft; + + for (int y = 0; y < effectHeight; ++y) { + int line = y * strideLine; + for (int channel = 3; channel >= 0; --channel) { + int sum = 0; + // Fill the kernel + int maxKernelSize = std::min(dxRight, effectWidth); + for (int i = 0; i < maxKernelSize; ++i) + sum += srcPixelArray->get(line + i * stride + channel); + + // Blurring + for (int x = 0; x < effectWidth; ++x) { + int pixelByteOffset = line + x * stride + channel; + dstPixelArray->set(pixelByteOffset, static_cast<unsigned char>(sum / dx)); + if (x >= dxLeft) + sum -= srcPixelArray->get(pixelByteOffset - dxLeft * stride); + if (x + dxRight < effectWidth) + sum += srcPixelArray->get(pixelByteOffset + dxRight * stride); + } + if (alphaImage) // Source image is black, it just has different alpha values + break; + } + } +} + +void FEGaussianBlur::apply(Filter* filter) +{ + m_in->apply(filter); + if (!m_in->resultImage()) + return; + + if (!getEffectContext()) + return; + + setIsAlphaImage(m_in->isAlphaImage()); + + if (m_x == 0 || m_y == 0) + return; + + unsigned sdx = static_cast<unsigned>(floor(m_x * 3 * sqrt(2 * piDouble) / 4.f + 0.5f)); + unsigned sdy = static_cast<unsigned>(floor(m_y * 3 * sqrt(2 * piDouble) / 4.f + 0.5f)); + + IntRect effectDrawingRect = calculateDrawingIntRect(m_in->subRegion()); + RefPtr<ImageData> srcImageData(m_in->resultImage()->getPremultipliedImageData(effectDrawingRect)); + CanvasPixelArray* srcPixelArray(srcImageData->data()); + + IntRect imageRect(IntPoint(), resultImage()->size()); + RefPtr<ImageData> tmpImageData = ImageData::create(imageRect.width(), imageRect.height()); + CanvasPixelArray* tmpPixelArray(tmpImageData->data()); + + int stride = 4 * imageRect.width(); + for (int i = 0; i < 3; ++i) { + boxBlur(srcPixelArray, tmpPixelArray, sdx, 4, stride, imageRect.width(), imageRect.height(), isAlphaImage()); + boxBlur(tmpPixelArray, srcPixelArray, sdy, stride, 4, imageRect.height(), imageRect.width(), isAlphaImage()); + } + + resultImage()->putPremultipliedImageData(srcImageData.get(), imageRect, IntPoint()); +} + +void FEGaussianBlur::dump() +{ +} + +} // namespace WebCore + +#endif // ENABLE(FILTERS) diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.h b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.h new file mode 100644 index 000000000..ecdb9e3b3 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FEGaussianBlur.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> + 2004, 2005 Rob Buis <buis@kde.org> + 2005 Eric Seidel <eric@webkit.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + aint with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef FEGaussianBlur_h +#define FEGaussianBlur_h + +#if ENABLE(FILTERS) +#include "FilterEffect.h" +#include "Filter.h" + +namespace WebCore { + + class FEGaussianBlur : public FilterEffect { + public: + static PassRefPtr<FEGaussianBlur> create(FilterEffect*, const float&, const float&); + + float stdDeviationX() const; + void setStdDeviationX(float); + + float stdDeviationY() const; + void setStdDeviationY(float); + + virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return calculateUnionOfChildEffectSubregions(filter, m_in.get()); } + void apply(Filter*); + void dump(); + + private: + FEGaussianBlur(FilterEffect*, const float&, const float&); + + RefPtr<FilterEffect> m_in; + float m_x; + float m_y; + }; + +} // namespace WebCore + +#endif // ENABLE(FILTERS) + +#endif // FEGaussianBlur_h diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp index 43ebf33b3..68900b51b 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.cpp @@ -25,14 +25,11 @@ namespace WebCore { FilterEffect::FilterEffect() - : m_xBBoxMode(false) - , m_yBBoxMode(false) - , m_widthBBoxMode(false) - , m_heightBBoxMode(false) - , m_hasX(false) + : m_hasX(false) , m_hasY(false) , m_hasWidth(false) , m_hasHeight(false) + , m_alphaImage(false) { } @@ -59,6 +56,13 @@ FloatRect FilterEffect::calculateEffectRect(Filter* filter) return subRegion(); } +IntRect FilterEffect::calculateDrawingIntRect(const FloatRect& effectRect) +{ + IntPoint location = roundedIntPoint(FloatPoint(subRegion().x() - effectRect.x(), + subRegion().y() - effectRect.y())); + return IntRect(location, resultImage()->size()); +} + FloatRect FilterEffect::calculateDrawingRect(const FloatRect& srcRect) { FloatPoint startPoint = FloatPoint(srcRect.x() - subRegion().x(), srcRect.y() - subRegion().y()); @@ -69,7 +73,7 @@ FloatRect FilterEffect::calculateDrawingRect(const FloatRect& srcRect) GraphicsContext* FilterEffect::getEffectContext() { IntRect bufferRect = enclosingIntRect(subRegion()); - m_effectBuffer = ImageBuffer::create(bufferRect.size(), false); + m_effectBuffer = ImageBuffer::create(bufferRect.size(), LinearRGB); return m_effectBuffer->context(); } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h index 8dc623393..b30e513b6 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/FilterEffect.h @@ -38,18 +38,6 @@ namespace WebCore { public: virtual ~FilterEffect(); - bool xBoundingBoxMode() const { return m_xBBoxMode; } - void setXBoundingBoxMode(bool bboxMode) { m_xBBoxMode = bboxMode; } - - bool yBoundingBoxMode() const { return m_yBBoxMode; } - void setYBoundingBoxMode(bool bboxMode) { m_yBBoxMode = bboxMode; } - - bool widthBoundingBoxMode() const { return m_widthBBoxMode; } - void setWidthBoundingBoxMode(bool bboxMode) { m_widthBBoxMode = bboxMode; } - - bool heightBoundingBoxMode() const { return m_heightBBoxMode; } - void setHeightBoundingBoxMode(bool bboxMode) { m_heightBBoxMode = bboxMode; } - void setUnionOfChildEffectSubregions(const FloatRect& uniteRect) { m_unionOfChildEffectSubregions = uniteRect; } FloatRect unionOfChildEffectSubregions() const { return m_unionOfChildEffectSubregions; } @@ -77,6 +65,11 @@ namespace WebCore { GraphicsContext* getEffectContext(); FloatRect calculateDrawingRect(const FloatRect&); + IntRect calculateDrawingIntRect(const FloatRect&); + + // black image with different alpha values + bool isAlphaImage() { return m_alphaImage; } + void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; } virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return filter->filterRegion(); } virtual FloatRect calculateEffectRect(Filter*); @@ -101,6 +94,8 @@ namespace WebCore { bool m_hasWidth : 1; bool m_hasHeight : 1; + bool m_alphaImage; + FloatRect m_subRegion; FloatRect m_unionOfChildEffectSubregions; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp index 646a57b51..1b6309b60 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.cpp @@ -22,6 +22,7 @@ #if ENABLE(FILTERS) #include "SourceAlpha.h" +#include "Color.h" #include "GraphicsContext.h" #include "PlatformString.h" #include "Filter.h" @@ -41,8 +42,30 @@ const AtomicString& SourceAlpha::effectName() return s_effectName; } -void SourceAlpha::apply(Filter*) +FloatRect SourceAlpha::calculateEffectRect(Filter* filter) { + FloatRect clippedSourceRect = filter->sourceImageRect(); + if (filter->sourceImageRect().x() < filter->filterRegion().x()) + clippedSourceRect.setX(filter->filterRegion().x()); + if (filter->sourceImageRect().y() < filter->filterRegion().y()) + clippedSourceRect.setY(filter->filterRegion().y()); + setSubRegion(clippedSourceRect); + return filter->filterRegion(); +} + +void SourceAlpha::apply(Filter* filter) +{ + GraphicsContext* filterContext = getEffectContext(); + if (!filterContext) + return; + + setIsAlphaImage(true); + + FloatRect imageRect(FloatPoint(), filter->sourceImage()->image()->size()); + filterContext->save(); + filterContext->clipToImageBuffer(imageRect, filter->sourceImage()); + filterContext->fillRect(imageRect, Color::black); + filterContext->restore(); } void SourceAlpha::dump() diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h index 5341562ff..172d05a17 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/filters/SourceAlpha.h @@ -35,7 +35,7 @@ namespace WebCore { static const AtomicString& effectName(); virtual bool isSourceInput() { return true; } - virtual FloatRect calculateEffectRect(Filter* filter) { return filter->sourceImageRect(); } + virtual FloatRect calculateEffectRect(Filter*); void apply(Filter*); void dump(); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.cpp index 895887f61..b2e3d922e 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -339,7 +340,10 @@ bool getEOTHeader(SharedBuffer* fontData, EOTHeader& eotHeader, size_t& overlayD return true; } -HANDLE renameAndActivateFont(SharedBuffer* fontData, const String& fontName) +// code shared by renameFont and renameAndActivateFont +// adds fontName to the font table in fontData, and writes the new font table to rewrittenFontTable +// returns the size of the name table (which is used by renameAndActivateFont), or 0 on early abort +static size_t renameFontInternal(SharedBuffer* fontData, const String& fontName, Vector<char> &rewrittenFontData) { size_t originalDataSize = fontData->size(); const sfntHeader* sfnt = reinterpret_cast<const sfntHeader*>(fontData->data()); @@ -357,7 +361,7 @@ HANDLE renameAndActivateFont(SharedBuffer* fontData, const String& fontName) // Rounded up to a multiple of 4 to simplify the checksum calculation. size_t nameTableSize = ((offsetof(nameTable, nameRecords) + nameRecordCount * sizeof(nameRecord) + fontName.length() * sizeof(UChar)) & ~3) + 4; - Vector<char> rewrittenFontData(fontData->size() + nameTableSize); + rewrittenFontData.resize(fontData->size() + nameTableSize); char* data = rewrittenFontData.data(); memcpy(data, fontData->data(), originalDataSize); @@ -394,8 +398,42 @@ HANDLE renameAndActivateFont(SharedBuffer* fontData, const String& fontName) for (unsigned i = 0; i * sizeof(BigEndianULong) < nameTableSize; ++i) rewrittenSfnt->tables[t].checkSum = rewrittenSfnt->tables[t].checkSum + reinterpret_cast<BigEndianULong*>(name)[i]; + return nameTableSize; +} + +#if PLATFORM(WINCE) +// AddFontMemResourceEx does not exist on WinCE, so we must handle the font data manually +// This function just renames the font and overwrites the old font data with the new +bool renameFont(SharedBuffer* fontData, const String& fontName) +{ + // abort if the data is too small to be a font header with a "tables" entry + if (fontData->size() < offsetof(sfntHeader, tables)) + return false; + + // abort if the data is too small to hold all the tables specified in the header + const sfntHeader* header = reinterpret_cast<const sfntHeader*>(fontData->data()); + if (fontData->size() < offsetof(sfntHeader, tables) + header->numTables * sizeof(TableDirectoryEntry)) + return false; + + Vector<char> rewrittenFontData; + if (!renameFontInternal(fontData, fontName, rewrittenFontData)) + return false; + + fontData->clear(); + fontData->append(rewrittenFontData.data(), rewrittenFontData.size()); + return true; +} +#else +// Rename the font and install the new font data into the system +HANDLE renameAndActivateFont(SharedBuffer* fontData, const String& fontName) +{ + Vector<char> rewrittenFontData; + size_t nameTableSize = renameFontInternal(fontData, fontName, rewrittenFontData); + if (!nameTableSize) + return 0; + DWORD numFonts = 0; - HANDLE fontHandle = AddFontMemResourceEx(data, originalDataSize + nameTableSize, 0, &numFonts); + HANDLE fontHandle = AddFontMemResourceEx(rewrittenFontData.data(), fontData->size() + nameTableSize, 0, &numFonts); if (fontHandle && numFonts != 1) { RemoveFontMemResourceEx(fontHandle); @@ -404,5 +442,6 @@ HANDLE renameAndActivateFont(SharedBuffer* fontData, const String& fontName) return fontHandle; } +#endif } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.h b/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.h index 13dad6f48..4c753142c 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/opentype/OpenTypeUtilities.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -35,6 +36,10 @@ struct BigEndianUShort; struct EOTPrefix; class SharedBuffer; +#if PLATFORM(WINCE) +typedef unsigned __int8 UInt8; +#endif + struct EOTHeader { EOTHeader(); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp index 5d167409b..151766ac3 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ColorQt.cpp @@ -40,7 +40,10 @@ Color::Color(const QColor& c) Color::operator QColor() const { - return QColor(red(), green(), blue(), alpha()); + if (m_valid) + return QColor(red(), green(), blue(), alpha()); + else + return QColor(); } } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontCacheQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontCacheQt.cpp index 5d29389c9..469a72ed9 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontCacheQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontCacheQt.cpp @@ -48,7 +48,7 @@ FontCache::FontCache() { } -void FontCache::getTraitsInFamily(const AtomicString& familyName, Vector<unsigned>& traitsMasks) +void FontCache::getTraitsInFamily(const AtomicString&, Vector<unsigned>&) { } @@ -58,8 +58,8 @@ class FontPlatformDataCacheKey { public: FontPlatformDataCacheKey(const FontDescription& description) : m_familyName() - , m_bold(false) , m_size(description.computedPixelSize()) + , m_bold(false) , m_italic(description.italic()) , m_smallCaps(description.smallCaps()) , m_hash(0) @@ -177,15 +177,20 @@ typedef HashMap<FontPlatformDataCacheKey, FontPlatformData*, FontPlatformDataCac // using Q_GLOBAL_STATIC leads to crash. TODO investigate the way to fix this. static FontPlatformDataCache* gFontPlatformDataCache = 0; -FontPlatformData* FontCache::getCachedFontPlatformData(const FontDescription& description, const AtomicString& family, bool checkingAlternateName) +FontPlatformData* FontCache::getCachedFontPlatformData(const FontDescription& description, const AtomicString& family, bool) { if (!gFontPlatformDataCache) gFontPlatformDataCache = new FontPlatformDataCache; - FontPlatformDataCacheKey key(description); + FontDescription descriptionWithResolvedFamily(description); + FontFamily resolvedFamily; + resolvedFamily.setFamily(family); + descriptionWithResolvedFamily.setFamily(resolvedFamily); + + FontPlatformDataCacheKey key(descriptionWithResolvedFamily); FontPlatformData* platformData = gFontPlatformDataCache->get(key); if (!platformData) { - platformData = new FontPlatformData(description); + platformData = new FontPlatformData(descriptionWithResolvedFamily); gFontPlatformDataCache->add(key, platformData); } return platformData; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontFallbackListQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontFallbackListQt.cpp index c29fd56f3..0306abf86 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontFallbackListQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontFallbackListQt.cpp @@ -102,7 +102,7 @@ const FontData* FontFallbackList::fontDataAt(const WebCore::Font* _font, unsigne const FontDescription& description = _font->fontDescription(); const FontFamily* family = &description.family(); while (family) { - if (m_fontSelector) { + if (family->family().length() && m_fontSelector) { FontData* data = m_fontSelector->getFontData(description, family->family()); if (data) { if (data->isLoading()) @@ -130,7 +130,7 @@ const FontData* FontFallbackList::fontDataForCharacters(const WebCore::Font* fon return primaryFontData(font); } -void FontFallbackList::setPlatformFont(const WebCore::FontPlatformData& platformData) +void FontFallbackList::setPlatformFont(const WebCore::FontPlatformData&) { m_familyIndex = cAllFamiliesScanned; } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp index f89ff9f94..c5960ac2a 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/FontQt.cpp @@ -197,7 +197,7 @@ float Font::floatWidthForComplexText(const TextRun& run, HashSet<const SimpleFon return w + run.padding(); } -int Font::offsetForPositionForComplexText(const TextRun& run, int position, bool includePartialGlyphs) const +int Font::offsetForPositionForComplexText(const TextRun& run, int position, bool) const { const QString string = fixSpacing(qstring(run)); QTextLayout layout(string, font()); @@ -221,7 +221,10 @@ FloatRect Font::selectionRectForComplexText(const TextRun& run, const IntPoint& QFont Font::font() const { - return primaryFont()->getQtFont(); + QFont f = primaryFont()->getQtFont(); + f.setLetterSpacing(QFont::AbsoluteSpacing, m_letterSpacing); + f.setWordSpacing(m_wordSpacing); + return f; } } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp index a35c5ac26..57a481ae7 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/GraphicsContextQt.cpp @@ -34,29 +34,29 @@ */ #include "config.h" +#include "GraphicsContext.h" #ifdef Q_WS_WIN #include <windows.h> #endif -#include "TransformationMatrix.h" #include "Color.h" #include "FloatConversion.h" #include "Font.h" -#include "GraphicsContext.h" #include "GraphicsContextPrivate.h" #include "ImageBuffer.h" +#include "NotImplemented.h" #include "Path.h" #include "Pattern.h" #include "Pen.h" -#include "NotImplemented.h" +#include "TransformationMatrix.h" #include <QBrush> #include <QDebug> #include <QGradient> -#include <QPainter> #include <QPaintDevice> #include <QPaintEngine> +#include <QPainter> #include <QPainterPath> #include <QPixmap> #include <QPolygonF> @@ -72,34 +72,35 @@ namespace WebCore { static inline QPainter::CompositionMode toQtCompositionMode(CompositeOperator op) { switch (op) { - case CompositeClear: - return QPainter::CompositionMode_Clear; - case CompositeCopy: - return QPainter::CompositionMode_Source; - case CompositeSourceOver: - return QPainter::CompositionMode_SourceOver; - case CompositeSourceIn: - return QPainter::CompositionMode_SourceIn; - case CompositeSourceOut: - return QPainter::CompositionMode_SourceOut; - case CompositeSourceAtop: - return QPainter::CompositionMode_SourceAtop; - case CompositeDestinationOver: - return QPainter::CompositionMode_DestinationOver; - case CompositeDestinationIn: - return QPainter::CompositionMode_DestinationIn; - case CompositeDestinationOut: - return QPainter::CompositionMode_DestinationOut; - case CompositeDestinationAtop: - return QPainter::CompositionMode_DestinationAtop; - case CompositeXOR: - return QPainter::CompositionMode_Xor; - case CompositePlusDarker: - return QPainter::CompositionMode_SourceOver; - case CompositeHighlight: - return QPainter::CompositionMode_SourceOver; - case CompositePlusLighter: - return QPainter::CompositionMode_Plus; + case CompositeClear: + return QPainter::CompositionMode_Clear; + case CompositeCopy: + return QPainter::CompositionMode_Source; + case CompositeSourceOver: + return QPainter::CompositionMode_SourceOver; + case CompositeSourceIn: + return QPainter::CompositionMode_SourceIn; + case CompositeSourceOut: + return QPainter::CompositionMode_SourceOut; + case CompositeSourceAtop: + return QPainter::CompositionMode_SourceAtop; + case CompositeDestinationOver: + return QPainter::CompositionMode_DestinationOver; + case CompositeDestinationIn: + return QPainter::CompositionMode_DestinationIn; + case CompositeDestinationOut: + return QPainter::CompositionMode_DestinationOut; + case CompositeDestinationAtop: + return QPainter::CompositionMode_DestinationAtop; + case CompositeXOR: + return QPainter::CompositionMode_Xor; + case CompositePlusDarker: + // there is no exact match, but this is the closest + return QPainter::CompositionMode_Darken; + case CompositeHighlight: + return QPainter::CompositionMode_SourceOver; + case CompositePlusLighter: + return QPainter::CompositionMode_Plus; } return QPainter::CompositionMode_SourceOver; @@ -108,12 +109,12 @@ static inline QPainter::CompositionMode toQtCompositionMode(CompositeOperator op static inline Qt::PenCapStyle toQtLineCap(LineCap lc) { switch (lc) { - case ButtCap: - return Qt::FlatCap; - case RoundCap: - return Qt::RoundCap; - case SquareCap: - return Qt::SquareCap; + case ButtCap: + return Qt::FlatCap; + case RoundCap: + return Qt::RoundCap; + case SquareCap: + return Qt::SquareCap; } return Qt::FlatCap; @@ -122,12 +123,12 @@ static inline Qt::PenCapStyle toQtLineCap(LineCap lc) static inline Qt::PenJoinStyle toQtLineJoin(LineJoin lj) { switch (lj) { - case MiterJoin: - return Qt::SvgMiterJoin; - case RoundJoin: - return Qt::RoundJoin; - case BevelJoin: - return Qt::BevelJoin; + case MiterJoin: + return Qt::SvgMiterJoin; + case RoundJoin: + return Qt::RoundJoin; + case BevelJoin: + return Qt::BevelJoin; } return Qt::MiterJoin; @@ -209,8 +210,8 @@ public: return redirect; return painter; - } else - return &layers.top()->painter; + } + return &layers.top()->painter; } bool antiAliasingForRectsAndLines; @@ -410,46 +411,25 @@ void GraphicsContext::drawRect(const IntRect& rect) if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); const bool antiAlias = p->testRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::Antialiasing, m_data->antiAliasingForRectsAndLines); + IntSize shadowSize; + int shadowBlur; + Color shadowColor; + if (getShadow(shadowSize, shadowBlur, shadowColor)) { + IntRect shadowRect = rect; + shadowRect.move(shadowSize.width(), shadowSize.height()); + shadowRect.inflate(static_cast<int>(p->pen().widthF())); + p->fillRect(shadowRect, QColor(shadowColor)); + } + p->drawRect(rect); p->setRenderHint(QPainter::Antialiasing, antiAlias); } -// FIXME: Now that this is refactored, it should be shared by all contexts. -static void adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2, float strokeWidth, - const StrokeStyle& penStyle) -{ - // For odd widths, we add in 0.5 to the appropriate x/y so that the float arithmetic - // works out. For example, with a border width of 3, KHTML will pass us (y1+y2)/2, e.g., - // (50+53)/2 = 103/2 = 51 when we want 51.5. It is always true that an even width gave - // us a perfect position, but an odd width gave us a position that is off by exactly 0.5. - if (penStyle == DottedStroke || penStyle == DashedStroke) { - if (p1.x() == p2.x()) { - p1.setY(p1.y() + strokeWidth); - p2.setY(p2.y() - strokeWidth); - } else { - p1.setX(p1.x() + strokeWidth); - p2.setX(p2.x() - strokeWidth); - } - } - - if (((int) strokeWidth) % 2) { - if (p1.x() == p2.x()) { - // We're a vertical line. Adjust our x. - p1.setX(p1.x() + 0.5); - p2.setX(p2.x() + 0.5); - } else { - // We're a horizontal line. Adjust our y. - p1.setY(p1.y() + 0.5); - p2.setY(p2.y() + 0.5); - } - } -} - // This is only used to draw borders. void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) { @@ -467,7 +447,7 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) FloatPoint p2 = point2; bool isVerticalLine = (p1.x() == p2.x()); - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); const bool antiAlias = p->testRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::Antialiasing, m_data->antiAliasingForRectsAndLines); adjustLineToPixelBoundaries(p1, p2, width, style); @@ -478,22 +458,22 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) if (textDrawingMode() == cTextFill && getShadow(shadowSize, shadowBlur, shadowColor)) { p->save(); p->translate(shadowSize.width(), shadowSize.height()); - p->setPen(QColor(shadowColor)); + p->setPen(shadowColor); p->drawLine(p1, p2); p->restore(); } int patWidth = 0; switch (style) { - case NoStroke: - case SolidStroke: - break; - case DottedStroke: - patWidth = (int)width; - break; - case DashedStroke: - patWidth = 3 * (int)width; - break; + case NoStroke: + case SolidStroke: + break; + case DottedStroke: + patWidth = static_cast<int>(width); + break; + case DashedStroke: + patWidth = 3 * static_cast<int>(width); + break; } if (patWidth) { @@ -522,7 +502,7 @@ void GraphicsContext::drawLine(const IntPoint& point1, const IntPoint& point2) if (patWidth == 1) patternOffset = 1.0f; else { - bool evenNumberOfSegments = numSegments % 2 == 0; + bool evenNumberOfSegments = !(numSegments % 2); if (remainder) evenNumberOfSegments = !evenNumberOfSegments; if (evenNumberOfSegments) { @@ -570,11 +550,25 @@ void GraphicsContext::strokeArc(const IntRect& rect, int startAngle, int angleSp if (paintingDisabled() || strokeStyle() == NoStroke || strokeThickness() <= 0.0f || !strokeColor().alpha()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); const bool antiAlias = p->testRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::Antialiasing, true); - p->drawArc(rect, startAngle * 16, angleSpan * 16); + IntSize shadowSize; + int shadowBlur; + Color shadowColor; + startAngle *= 16; + angleSpan *= 16; + if (getShadow(shadowSize, shadowBlur, shadowColor)) { + p->save(); + p->translate(shadowSize.width(), shadowSize.height()); + QPen pen(p->pen()); + pen.setColor(shadowColor); + p->setPen(pen); + p->drawArc(rect, startAngle, angleSpan); + p->restore(); + } + p->drawArc(rect, startAngle, angleSpan); p->setRenderHint(QPainter::Antialiasing, antiAlias); } @@ -592,9 +586,25 @@ void GraphicsContext::drawConvexPolygon(size_t npoints, const FloatPoint* points for (size_t i = 0; i < npoints; i++) polygon[i] = points[i]; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); p->save(); p->setRenderHint(QPainter::Antialiasing, shouldAntialias); + IntSize shadowSize; + int shadowBlur; + Color shadowColor; + if (getShadow(shadowSize, shadowBlur, shadowColor)) { + p->save(); + p->translate(shadowSize.width(), shadowSize.height()); + if (p->brush().style() != Qt::NoBrush) + p->setBrush(QBrush(shadowColor)); + QPen pen(p->pen()); + if (pen.style() != Qt::NoPen) { + pen.setColor(shadowColor); + p->setPen(pen); + } + p->drawConvexPolygon(polygon); + p->restore(); + } p->drawConvexPolygon(polygon); p->restore(); } @@ -604,34 +614,50 @@ QPen GraphicsContext::pen() if (paintingDisabled()) return QPen(); - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); return p->pen(); } +static void inline drawFilledShadowPath(GraphicsContext* context, QPainter* p, const QPainterPath *path) +{ + IntSize shadowSize; + int shadowBlur; + Color shadowColor; + if (context->getShadow(shadowSize, shadowBlur, shadowColor)) { + p->translate(shadowSize.width(), shadowSize.height()); + p->fillPath(*path, QBrush(shadowColor)); + p->translate(-shadowSize.width(), -shadowSize.height()); + } +} + void GraphicsContext::fillPath() { if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPainterPath path = m_data->currentPath; path.setFillRule(toQtFillRule(fillRule())); - switch (m_common->state.fillColorSpace) { - case SolidColorSpace: - if (fillColor().alpha()) - p->fillPath(path, p->brush()); - break; - case PatternColorSpace: { - TransformationMatrix affine; - p->fillPath(path, QBrush(m_common->state.fillPattern->createPlatformPattern(affine))); - break; - } - case GradientColorSpace: - QBrush brush(*m_common->state.fillGradient->platformGradient()); - brush.setTransform(m_common->state.fillGradient->gradientSpaceTransform()); - p->fillPath(path, brush); - break; + if ((m_common->state.fillColorSpace != SolidColorSpace) + || (fillColor().alpha())) { + drawFilledShadowPath(this, p, &path); + switch (m_common->state.fillColorSpace) { + case SolidColorSpace: + if (fillColor().alpha()) + p->fillPath(path, p->brush()); + break; + case PatternColorSpace: { + TransformationMatrix affine; + p->fillPath(path, QBrush(m_common->state.fillPattern->createPlatformPattern(affine))); + break; + } + case GradientColorSpace: + QBrush brush(*m_common->state.fillGradient->platformGradient()); + brush.setTransform(m_common->state.fillGradient->gradientSpaceTransform()); + p->fillPath(path, brush); + break; + } } m_data->currentPath = QPainterPath(); } @@ -641,59 +667,88 @@ void GraphicsContext::strokePath() if (paintingDisabled()) return; - QPainter *p = m_data->p(); - QPen pen = p->pen(); + QPainter* p = m_data->p(); + QPen pen(p->pen()); QPainterPath path = m_data->currentPath; path.setFillRule(toQtFillRule(fillRule())); - switch (m_common->state.strokeColorSpace) { - case SolidColorSpace: - if (strokeColor().alpha()) + if ((m_common->state.strokeColorSpace != SolidColorSpace) + || (strokeColor().alpha())) { + IntSize shadowSize; + int shadowBlur; + Color shadowColor; + if (getShadow(shadowSize, shadowBlur, shadowColor)) { + QTransform t(p->worldTransform()); + p->translate(shadowSize.width(), shadowSize.height()); + QPen shadowPen(pen); + shadowPen.setColor(shadowColor); + p->strokePath(path, shadowPen); + p->setWorldTransform(t); + } + switch (m_common->state.strokeColorSpace) { + case SolidColorSpace: + if (strokeColor().alpha()) + p->strokePath(path, pen); + break; + case PatternColorSpace: { + TransformationMatrix affine; + pen.setBrush(QBrush(m_common->state.strokePattern->createPlatformPattern(affine))); + p->setPen(pen); p->strokePath(path, pen); - break; - case PatternColorSpace: { - TransformationMatrix affine; - pen.setBrush(QBrush(m_common->state.strokePattern->createPlatformPattern(affine))); - p->setPen(pen); - p->strokePath(path, pen); - break; - } - case GradientColorSpace: { - QBrush brush(*m_common->state.strokeGradient->platformGradient()); - brush.setTransform(m_common->state.strokeGradient->gradientSpaceTransform()); - pen.setBrush(brush); - p->setPen(pen); - p->strokePath(path, pen); - break; - } + break; + } + case GradientColorSpace: { + QBrush brush(*m_common->state.strokeGradient->platformGradient()); + brush.setTransform(m_common->state.strokeGradient->gradientSpaceTransform()); + pen.setBrush(brush); + p->setPen(pen); + p->strokePath(path, pen); + break; + } + } } m_data->currentPath = QPainterPath(); } +static inline void drawBorderlessRectShadow(GraphicsContext* context, QPainter* p, const FloatRect& rect) +{ + IntSize shadowSize; + int shadowBlur; + Color shadowColor; + if (context->getShadow(shadowSize, shadowBlur, shadowColor)) { + FloatRect shadowRect(rect); + shadowRect.move(shadowSize.width(), shadowSize.height()); + p->fillRect(shadowRect, QColor(shadowColor)); + } +} + void GraphicsContext::fillRect(const FloatRect& rect) { if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); - switch (m_common->state.fillColorSpace) { - case SolidColorSpace: - if (fillColor().alpha()) - p->fillRect(rect, p->brush()); - break; - case PatternColorSpace: { - TransformationMatrix affine; - p->fillRect(rect, QBrush(m_common->state.fillPattern->createPlatformPattern(affine))); - break; - } - case GradientColorSpace: - QBrush brush(*m_common->state.fillGradient->platformGradient()); - brush.setTransform(m_common->state.fillGradient->gradientSpaceTransform()); - p->fillRect(rect, brush); - break; + if ((m_common->state.fillColorSpace != SolidColorSpace) + || (fillColor().alpha())) { + drawBorderlessRectShadow(this, p, rect); + switch (m_common->state.fillColorSpace) { + case SolidColorSpace: + if (fillColor().alpha()) + p->fillRect(rect, p->brush()); + break; + case PatternColorSpace: { + TransformationMatrix affine; + p->fillRect(rect, QBrush(m_common->state.fillPattern->createPlatformPattern(affine))); + break; + } + case GradientColorSpace: + QBrush brush(*m_common->state.fillGradient->platformGradient()); + brush.setTransform(m_common->state.fillGradient->gradientSpaceTransform()); + p->fillRect(rect, brush); + break; + } } - m_data->currentPath = QPainterPath(); } void GraphicsContext::fillRect(const FloatRect& rect, const Color& c) @@ -701,8 +756,10 @@ void GraphicsContext::fillRect(const FloatRect& rect, const Color& c) if (paintingDisabled()) return; - m_data->solidColor.setColor(QColor(c)); - m_data->p()->fillRect(rect, m_data->solidColor); + m_data->solidColor.setColor(c); + QPainter* p = m_data->p(); + drawBorderlessRectShadow(this, p, rect); + p->fillRect(rect, m_data->solidColor); } void GraphicsContext::fillRoundedRect(const IntRect& rect, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight, const Color& color) @@ -711,7 +768,9 @@ void GraphicsContext::fillRoundedRect(const IntRect& rect, const IntSize& topLef return; Path path = Path::createRoundedRectangle(rect, topLeft, topRight, bottomLeft, bottomRight); - m_data->p()->fillPath(*path.platformPath(), QColor(color)); + QPainter* p = m_data->p(); + drawFilledShadowPath(this, p, path.platformPath()); + p->fillPath(*path.platformPath(), QColor(color)); } void GraphicsContext::beginPath() @@ -749,7 +808,7 @@ void GraphicsContext::clipPath(WindRule clipRule) if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPainterPath newPath = m_data->currentPath; newPath.setFillRule(clipRule == RULE_EVENODD ? Qt::OddEvenFill : Qt::WindingFill); p->setClipPath(newPath); @@ -768,10 +827,10 @@ void GraphicsContext::drawFocusRing(const Color& color) const Vector<IntRect>& rects = focusRingRects(); unsigned rectCount = rects.size(); - if (rects.size() == 0) + if (!rects.size()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); const bool antiAlias = p->testRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::Antialiasing, m_data->antiAliasingForRectsAndLines); @@ -792,7 +851,7 @@ void GraphicsContext::drawFocusRing(const Color& color) QPainterPath newPath = stroker.createStroke(path); p->strokePath(newPath, nPen); #else - for (int i = 0; i < rectCount; ++i) + for (unsigned i = 0; i < rectCount; ++i) p->drawRect(QRectF(rects[i])); #endif p->setPen(oldPen); @@ -801,7 +860,7 @@ void GraphicsContext::drawFocusRing(const Color& color) p->setRenderHint(QPainter::Antialiasing, antiAlias); } -void GraphicsContext::drawLineForText(const IntPoint& origin, int width, bool printing) +void GraphicsContext::drawLineForText(const IntPoint& origin, int width, bool) { if (paintingDisabled()) return; @@ -810,8 +869,7 @@ void GraphicsContext::drawLineForText(const IntPoint& origin, int width, bool pr drawLine(origin, endPoint); } -void GraphicsContext::drawLineForMisspellingOrBadGrammar(const IntPoint&, - int width, bool grammar) +void GraphicsContext::drawLineForMisspellingOrBadGrammar(const IntPoint&, int, bool) { if (paintingDisabled()) return; @@ -828,10 +886,16 @@ FloatRect GraphicsContext::roundToDevicePixels(const FloatRect& frect) return FloatRect(QRectF(result)); } -void GraphicsContext::setPlatformShadow(const IntSize& pos, int blur, const Color &color) +void GraphicsContext::setPlatformShadow(const IntSize& size, int, const Color&) { // Qt doesn't support shadows natively, they are drawn manually in the draw* // functions + + if (m_common->state.shadowsIgnoreTransforms) { + // Meaning that this graphics context is associated with a CanvasRenderingContext + // We flip the height since CG and HTML5 Canvas have opposite Y axis + m_common->state.shadowSize = IntSize(size.width(), -size.height()); + } } void GraphicsContext::clearPlatformShadow() @@ -847,8 +911,8 @@ void GraphicsContext::beginTransparencyLayer(float opacity) int x, y, w, h; x = y = 0; - QPainter *p = m_data->p(); - const QPaintDevice *device = p->device(); + QPainter* p = m_data->p(); + const QPaintDevice* device = p->device(); w = device->width(); h = device->height(); @@ -870,10 +934,10 @@ void GraphicsContext::endTransparencyLayer() if (paintingDisabled()) return; - TransparencyLayer *layer = m_data->layers.pop(); + TransparencyLayer* layer = m_data->layers.pop(); layer->painter.end(); - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); p->save(); p->resetTransform(); p->setOpacity(layer->opacity); @@ -888,7 +952,7 @@ void GraphicsContext::clearRect(const FloatRect& rect) if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPainter::CompositionMode currentCompositionMode = p->compositionMode(); if (p->paintEngine()->hasFeature(QPaintEngine::PorterDuff)) p->setCompositionMode(QPainter::CompositionMode_Source); @@ -915,7 +979,7 @@ void GraphicsContext::setLineCap(LineCap lc) if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPen nPen = p->pen(); nPen.setCapStyle(toQtLineCap(lc)); p->setPen(nPen); @@ -947,7 +1011,7 @@ void GraphicsContext::setLineJoin(LineJoin lj) if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPen nPen = p->pen(); nPen.setJoinStyle(toQtLineJoin(lj)); p->setPen(nPen); @@ -958,7 +1022,7 @@ void GraphicsContext::setMiterLimit(float limit) if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPen nPen = p->pen(); nPen.setMiterLimit(limit); p->setPen(nPen); @@ -968,7 +1032,7 @@ void GraphicsContext::setAlpha(float opacity) { if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); p->setOpacity(opacity); } @@ -989,20 +1053,29 @@ void GraphicsContext::clip(const Path& path) m_data->p()->setClipPath(*path.platformPath(), Qt::IntersectClip); } +void GraphicsContext::canvasClip(const Path& path) +{ + clip(path); +} + void GraphicsContext::clipOut(const Path& path) { if (paintingDisabled()) return; - QPainter *p = m_data->p(); - QRectF clipBounds = p->clipPath().boundingRect(); + QPainter* p = m_data->p(); QPainterPath clippedOut = *path.platformPath(); QPainterPath newClip; newClip.setFillRule(Qt::OddEvenFill); - newClip.addRect(clipBounds); - newClip.addPath(clippedOut); - - p->setClipPath(newClip, Qt::IntersectClip); + if (p->hasClipping()) { + newClip.addRect(p->clipPath().boundingRect()); + newClip.addPath(clippedOut); + p->setClipPath(newClip, Qt::IntersectClip); + } else { + newClip.addRect(p->window()); + newClip.addPath(clippedOut & newClip); + p->setClipPath(newClip); + } } void GraphicsContext::translate(float x, float y) @@ -1060,14 +1133,21 @@ void GraphicsContext::clipOut(const IntRect& rect) if (paintingDisabled()) return; - QPainter *p = m_data->p(); - QRectF clipBounds = p->clipPath().boundingRect(); + QPainter* p = m_data->p(); QPainterPath newClip; newClip.setFillRule(Qt::OddEvenFill); - newClip.addRect(clipBounds); - newClip.addRect(QRect(rect)); - - p->setClipPath(newClip, Qt::IntersectClip); + if (p->hasClipping()) { + newClip.addRect(p->clipPath().boundingRect()); + newClip.addRect(QRect(rect)); + p->setClipPath(newClip, Qt::IntersectClip); + } else { + QRect clipOutRect(rect); + QRect window(p->window()); + clipOutRect &= window; + newClip.addRect(window); + newClip.addRect(clipOutRect); + p->setClipPath(newClip); + } } void GraphicsContext::clipOutEllipseInRect(const IntRect& rect) @@ -1075,14 +1155,21 @@ void GraphicsContext::clipOutEllipseInRect(const IntRect& rect) if (paintingDisabled()) return; - QPainter *p = m_data->p(); - QRectF clipBounds = p->clipPath().boundingRect(); + QPainter* p = m_data->p(); QPainterPath newClip; newClip.setFillRule(Qt::OddEvenFill); - newClip.addRect(clipBounds); - newClip.addEllipse(QRect(rect)); - - p->setClipPath(newClip, Qt::IntersectClip); + if (p->hasClipping()) { + newClip.addRect(p->clipPath().boundingRect()); + newClip.addEllipse(QRect(rect)); + p->setClipPath(newClip, Qt::IntersectClip); + } else { + QRect clipOutRect(rect); + QRect window(p->window()); + clipOutRect &= window; + newClip.addRect(window); + newClip.addEllipse(clipOutRect); + p->setClipPath(newClip); + } } void GraphicsContext::clipToImageBuffer(const FloatRect&, const ImageBuffer*) @@ -1108,7 +1195,7 @@ void GraphicsContext::addInnerRoundedRectClip(const IntRect& rect, path.setFillRule(Qt::OddEvenFill); - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); const bool antiAlias = p->testRenderHint(QPainter::Antialiasing); p->setRenderHint(QPainter::Antialiasing, true); @@ -1133,7 +1220,7 @@ void GraphicsContext::concatCTM(const TransformationMatrix& transform) } } -void GraphicsContext::setURLForRect(const KURL& link, const IntRect& destRect) +void GraphicsContext::setURLForRect(const KURL&, const IntRect&) { notImplemented(); } @@ -1142,7 +1229,7 @@ void GraphicsContext::setPlatformStrokeColor(const Color& color) { if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPen newPen(p->pen()); newPen.setColor(color); p->setPen(newPen); @@ -1152,7 +1239,7 @@ void GraphicsContext::setPlatformStrokeStyle(const StrokeStyle& strokeStyle) { if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPen newPen(p->pen()); newPen.setStyle(toQPenStyle(strokeStyle)); p->setPen(newPen); @@ -1162,7 +1249,7 @@ void GraphicsContext::setPlatformStrokeThickness(float thickness) { if (paintingDisabled()) return; - QPainter *p = m_data->p(); + QPainter* p = m_data->p(); QPen newPen(p->pen()); newPen.setWidthF(thickness); p->setPen(newPen); @@ -1183,7 +1270,6 @@ void GraphicsContext::setPlatformShouldAntialias(bool enable) } #ifdef Q_WS_WIN -#include <windows.h> HDC GraphicsContext::getWindowsContext(const IntRect& dstRect, bool supportAlphaBlend, bool mayCreateBitmap) { diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/IconQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/IconQt.cpp index 34c3c472a..98f4606d1 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/IconQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/IconQt.cpp @@ -47,7 +47,7 @@ PassRefPtr<Icon> Icon::createIconForFile(const String& filename) return i.release(); } -PassRefPtr<Icon> Icon::createIconForFiles(const Vector<String>& filenames) +PassRefPtr<Icon> Icon::createIconForFiles(const Vector<String>&) { //FIXME: Implement this return 0; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp index 506a8eaf8..5255428a3 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageBufferQt.cpp @@ -40,6 +40,7 @@ #include <QImageWriter> #include <QPainter> #include <QPixmap> +#include <math.h> namespace WebCore { @@ -67,7 +68,7 @@ ImageBufferData::ImageBufferData(const IntSize& size) painter->setCompositionMode(QPainter::CompositionMode_SourceOver); } -ImageBuffer::ImageBuffer(const IntSize& size, bool grayScale, bool& success) +ImageBuffer::ImageBuffer(const IntSize& size, ImageColorSpace, bool& success) : m_data(size) , m_size(size) { @@ -98,12 +99,39 @@ Image* ImageBuffer::image() const return m_image.get(); } -PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const +void ImageBuffer::platformTransformColorSpace(const Vector<int>& lookUpTable) +{ + bool isPainting = m_data.m_painter->isActive(); + if (isPainting) + m_data.m_painter->end(); + + QImage image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32); + ASSERT(!image.isNull()); + + for (int y = 0; y < m_size.height(); ++y) { + for (int x = 0; x < m_size.width(); x++) { + QRgb value = image.pixel(x, y); + value = qRgba(lookUpTable[qRed(value)], + lookUpTable[qGreen(value)], + lookUpTable[qBlue(value)], + lookUpTable[qAlpha(value)]); + image.setPixel(x, y, value); + } + } + + m_data.m_pixmap = QPixmap::fromImage(image); + + if (isPainting) + m_data.m_painter->begin(&m_data.m_pixmap); +} + +template <Multiply multiplied> +PassRefPtr<ImageData> getImageData(const IntRect& rect, const ImageBufferData& imageData, const IntSize& size) { PassRefPtr<ImageData> result = ImageData::create(rect.width(), rect.height()); unsigned char* data = result->data()->data()->data(); - if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > m_size.width() || (rect.y() + rect.height()) > m_size.height()) + if (rect.x() < 0 || rect.y() < 0 || (rect.x() + rect.width()) > size.width() || (rect.y() + rect.height()) > size.height()) memset(data, 0, result->data()->length()); int originx = rect.x(); @@ -113,8 +141,8 @@ PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const originx = 0; } int endx = rect.x() + rect.width(); - if (endx > m_size.width()) - endx = m_size.width(); + if (endx > size.width()) + endx = size.width(); int numColumns = endx - originx; int originy = rect.y(); @@ -124,11 +152,16 @@ PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const originy = 0; } int endy = rect.y() + rect.height(); - if (endy > m_size.height()) - endy = m_size.height(); + if (endy > size.height()) + endy = size.height(); int numRows = endy - originy; - QImage image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32); + QImage image = imageData.m_pixmap.toImage(); + if (multiplied == Unmultiplied) + image = image.convertToFormat(QImage::Format_ARGB32); + else + image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); + ASSERT(!image.isNull()); unsigned destBytesPerRow = 4 * rect.width(); @@ -149,7 +182,18 @@ PassRefPtr<ImageData> ImageBuffer::getImageData(const IntRect& rect) const return result; } -void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) +PassRefPtr<ImageData> ImageBuffer::getUnmultipliedImageData(const IntRect& rect) const +{ + return getImageData<Unmultiplied>(rect, m_data, m_size); +} + +PassRefPtr<ImageData> ImageBuffer::getPremultipliedImageData(const IntRect& rect) const +{ + return getImageData<Premultiplied>(rect, m_data, m_size); +} + +template <Multiply multiplied> +void putImageData(ImageData*& source, const IntRect& sourceRect, const IntPoint& destPoint, ImageBufferData& data, const IntSize& size) { ASSERT(sourceRect.width() > 0); ASSERT(sourceRect.height() > 0); @@ -157,49 +201,65 @@ void ImageBuffer::putImageData(ImageData* source, const IntRect& sourceRect, con int originx = sourceRect.x(); int destx = destPoint.x() + sourceRect.x(); ASSERT(destx >= 0); - ASSERT(destx < m_size.width()); + ASSERT(destx < size.width()); ASSERT(originx >= 0); ASSERT(originx <= sourceRect.right()); int endx = destPoint.x() + sourceRect.right(); - ASSERT(endx <= m_size.width()); + ASSERT(endx <= size.width()); int numColumns = endx - destx; int originy = sourceRect.y(); int desty = destPoint.y() + sourceRect.y(); ASSERT(desty >= 0); - ASSERT(desty < m_size.height()); + ASSERT(desty < size.height()); ASSERT(originy >= 0); ASSERT(originy <= sourceRect.bottom()); int endy = destPoint.y() + sourceRect.bottom(); - ASSERT(endy <= m_size.height()); + ASSERT(endy <= size.height()); int numRows = endy - desty; unsigned srcBytesPerRow = 4 * source->width(); - bool isPainting = m_data.m_painter->isActive(); + bool isPainting = data.m_painter->isActive(); if (isPainting) - m_data.m_painter->end(); + data.m_painter->end(); - QImage image = m_data.m_pixmap.toImage().convertToFormat(QImage::Format_ARGB32); + QImage image = data.m_pixmap.toImage(); + if (multiplied == Unmultiplied) + image = image.convertToFormat(QImage::Format_ARGB32); + else + image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied); unsigned char* srcRows = source->data()->data()->data() + originy * srcBytesPerRow + originx * 4; for (int y = 0; y < numRows; ++y) { quint32* scanLine = reinterpret_cast<quint32*>(image.scanLine(y + desty)); for (int x = 0; x < numColumns; x++) { - int basex = x * 4; - scanLine[x + destx] = reinterpret_cast<quint32*>(srcRows + basex)[0]; + // ImageData stores the pixels in RGBA while QImage is ARGB + quint32 pixel = reinterpret_cast<quint32*>(srcRows + 4 * x)[0]; + pixel = ((pixel << 16) & 0xff0000) | ((pixel >> 16) & 0xff) | (pixel & 0xff00ff00); + scanLine[x + destx] = pixel; } srcRows += srcBytesPerRow; } - m_data.m_pixmap = QPixmap::fromImage(image); + data.m_pixmap = QPixmap::fromImage(image); if (isPainting) - m_data.m_painter->begin(&m_data.m_pixmap); + data.m_painter->begin(&data.m_pixmap); +} + +void ImageBuffer::putUnmultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) +{ + putImageData<Unmultiplied>(source, sourceRect, destPoint, m_data, m_size); +} + +void ImageBuffer::putPremultipliedImageData(ImageData* source, const IntRect& sourceRect, const IntPoint& destPoint) +{ + putImageData<Premultiplied>(source, sourceRect, destPoint, m_data, m_size); } // We get a mimeType here but QImageWriter does not support mimetypes but diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp index 669be1c0d..b6823dd25 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.cpp @@ -35,303 +35,205 @@ #include <QtGui/QImageReader> #include <qdebug.h> -namespace { - const QImage::Format DesiredFormat = QImage::Format_ARGB32; - const bool debugImageDecoderQt = false; -} - namespace WebCore { -ImageDecoderQt::ImageData::ImageData(const QImage& image, ImageState imageState, int duration) : - m_image(image), m_imageState(imageState), m_duration(duration) -{ -} - -// Context, maintains IODevice on a data buffer. -class ImageDecoderQt::ReadContext { -public: - enum LoadMode { - // Load images incrementally. This is still experimental and - // will cause the image plugins to report errors. - // Also note that as of Qt 4.2.2, the JPEG loader does not return error codes - // on "preliminary end of data". - LoadIncrementally, - // Load images only if all data have been received - LoadComplete }; - - ReadContext(const IncomingData & data, LoadMode loadMode, ImageList &target); - - enum ReadResult { ReadEOF, ReadFailed, ReadPartial, ReadComplete }; +ImageDecoder* ImageDecoder::create(const SharedBuffer& data) +{ + // We need at least 4 bytes to figure out what kind of image we're dealing with. + if (data.size() < 4) + return 0; - // Append data and read out all images. Returns the result - // of the last read operation, so, even if ReadPartial is returned, - // a few images might have been read. - ReadResult read(bool allDataReceived); + return new ImageDecoderQt; +} - QImageReader *reader() { return &m_reader; } +ImageDecoderQt::ImageDecoderQt() + : m_buffer(0) + , m_reader(0) + , m_repetitionCount(cAnimationNone) +{ +} -private: - enum IncrementalReadResult { IncrementalReadFailed, IncrementalReadPartial, IncrementalReadComplete }; - // Incrementally read an image - IncrementalReadResult readImageLines(ImageData &); +ImageDecoderQt::~ImageDecoderQt() +{ + delete m_reader; + delete m_buffer; +} - const LoadMode m_loadMode; +void ImageDecoderQt::setData(SharedBuffer* data, bool allDataReceived) +{ + if (m_failed) + return; - QByteArray m_data; - QBuffer m_buffer; - QImageReader m_reader; + // No progressive loading possible + if (!allDataReceived) + return; - ImageList &m_target; + // Cache our own new data. + ImageDecoder::setData(data, allDataReceived); - // Detected data format of the stream - enum QImage::Format m_dataFormat; - QSize m_size; + // We expect to be only called once with allDataReceived + ASSERT(!m_buffer); + ASSERT(!m_reader); -}; + // Attempt to load the data + QByteArray imageData = QByteArray::fromRawData(m_data->data(), m_data->size()); + m_buffer = new QBuffer; + m_buffer->setData(imageData); + m_buffer->open(QBuffer::ReadOnly); + m_reader = new QImageReader(m_buffer, m_format); +} -ImageDecoderQt::ReadContext::ReadContext(const IncomingData & data, LoadMode loadMode, ImageList &target) - : m_loadMode(loadMode) - , m_data(data.data(), data.size()) - , m_buffer(&m_data) - , m_reader(&m_buffer) - , m_target(target) - , m_dataFormat(QImage::Format_Invalid) +bool ImageDecoderQt::isSizeAvailable() { - m_buffer.open(QIODevice::ReadOnly); -} + if (!ImageDecoder::isSizeAvailable() && m_reader) + internalDecodeSize(); + return ImageDecoder::isSizeAvailable(); +} -ImageDecoderQt::ReadContext::ReadResult - ImageDecoderQt::ReadContext::read(bool allDataReceived) +size_t ImageDecoderQt::frameCount() { - // Complete mode: Read only all all data received - if (m_loadMode == LoadComplete && !allDataReceived) - return ReadPartial; - - // Attempt to read out all images - while (true) { - if (m_target.empty() || m_target.back().m_imageState == ImageComplete) { - // Start a new image. - if (!m_reader.canRead()) - return ReadEOF; - - // Attempt to construct an empty image of the matching size and format - // for efficient reading - QImage newImage = m_dataFormat != QImage::Format_Invalid ? - QImage(m_size, m_dataFormat) : QImage(); - m_target.push_back(ImageData(newImage)); - } + if (m_frameBufferCache.isEmpty() && m_reader) { + if (m_reader->supportsAnimation()) { + int imageCount = m_reader->imageCount(); - // read chunks - switch (readImageLines(m_target.back())) { - case IncrementalReadFailed: - m_target.pop_back(); - return ReadFailed; - case IncrementalReadPartial: - return ReadPartial; - case IncrementalReadComplete: - m_target.back().m_imageState = ImageComplete; - //store for next - m_dataFormat = m_target.back().m_image.format(); - m_size = m_target.back().m_image.size(); - const bool supportsAnimation = m_reader.supportsAnimation(); - - if (debugImageDecoderQt) - qDebug() << "readImage(): #" << m_target.size() << " complete, " << m_size - << " format " << m_dataFormat << " supportsAnimation=" << supportsAnimation; - // No point in readinfg further - if (!supportsAnimation) - return ReadComplete; - - break; + // Fixup for Qt decoders... imageCount() is wrong + // and jumpToNextImage does not work either... so + // we will have to parse everything... + if (imageCount == 0) + forceLoadEverything(); + else + m_frameBufferCache.resize(imageCount); + } else { + m_frameBufferCache.resize(1); } } - return ReadComplete; + + return m_frameBufferCache.size(); } +int ImageDecoderQt::repetitionCount() const +{ + if (m_reader && m_reader->supportsAnimation()) + m_repetitionCount = qMax(0, m_reader->loopCount()); + return m_repetitionCount; +} -ImageDecoderQt::ReadContext::IncrementalReadResult - ImageDecoderQt::ReadContext::readImageLines(ImageData &imageData) +String ImageDecoderQt::filenameExtension() const { - // TODO: Implement incremental reading here, - // set state to reflect complete header, etc. - // For now, we read the whole image. - - const qint64 startPos = m_buffer.pos(); - // Oops, failed. Rewind. - if (!m_reader.read(&imageData.m_image)) { - m_buffer.seek(startPos); - const bool gotHeader = imageData.m_image.size().width(); - - if (debugImageDecoderQt) - qDebug() << "readImageLines(): read() failed: " << m_reader.errorString() - << " got header=" << gotHeader; - // [Experimental] Did we manage to read the header? - if (gotHeader) { - imageData.m_imageState = ImageHeaderValid; - return IncrementalReadPartial; - } - return IncrementalReadFailed; - } - imageData.m_duration = m_reader.nextImageDelay(); - return IncrementalReadComplete; -} + return String(m_format.constData(), m_format.length()); +}; -ImageDecoderQt* ImageDecoderQt::create(const SharedBuffer& data) +RGBA32Buffer* ImageDecoderQt::frameBufferAtIndex(size_t index) { - // We need at least 4 bytes to figure out what kind of image we're dealing with. - if (data.size() < 4) - return 0; + // In case the ImageDecoderQt got recreated we don't know + // yet how many images we are going to have and need to + // find that out now. + int count = m_frameBufferCache.size(); + if (!m_failed && count == 0) { + internalDecodeSize(); + count = frameCount(); + } - QByteArray bytes = QByteArray::fromRawData(data.data(), data.size()); - QBuffer buffer(&bytes); - if (!buffer.open(QBuffer::ReadOnly)) + if (index >= static_cast<size_t>(count)) return 0; - QString imageFormat = QString::fromLatin1(QImageReader::imageFormat(&buffer).toLower()); - if (imageFormat.isEmpty()) - return 0; // Image format not supported - - return new ImageDecoderQt(imageFormat); + RGBA32Buffer& frame = m_frameBufferCache[index]; + if (frame.status() != RGBA32Buffer::FrameComplete && m_reader) + internalReadImage(index); + return &frame; } -ImageDecoderQt::ImageDecoderQt(const QString &imageFormat) - : m_hasAlphaChannel(false) - , m_imageFormat(imageFormat) +void ImageDecoderQt::clearFrameBufferCache(size_t /*index*/) { } -ImageDecoderQt::~ImageDecoderQt() +void ImageDecoderQt::internalDecodeSize() { -} + ASSERT(m_reader); -bool ImageDecoderQt::hasFirstImageHeader() const -{ - return !m_imageList.empty() && m_imageList[0].m_imageState >= ImageHeaderValid; -} + // If we have a QSize() something failed + QSize size = m_reader->size(); + if (size.isEmpty()) + return failRead(); -void ImageDecoderQt::reset() -{ - m_hasAlphaChannel = false; - m_failed = false; - m_imageList.clear(); - m_pixmapCache.clear(); - m_loopCount = cAnimationNone; + m_format = m_reader->format(); + setSize(size.width(), size.height()); } -void ImageDecoderQt::setData(const IncomingData &data, bool allDataReceived) +void ImageDecoderQt::internalReadImage(size_t frameIndex) { - reset(); - ReadContext readContext(data, ReadContext::LoadComplete, m_imageList); - - if (debugImageDecoderQt) - qDebug() << " setData " << data.size() << " image bytes, complete=" << allDataReceived; - - const ReadContext::ReadResult readResult = readContext.read(allDataReceived); - - if (hasFirstImageHeader()) - m_hasAlphaChannel = m_imageList[0].m_image.hasAlphaChannel(); - - if (debugImageDecoderQt) - qDebug() << " read returns " << readResult; - - switch (readResult) { - case ReadContext::ReadFailed: - m_failed = true; - break; - case ReadContext::ReadEOF: - case ReadContext::ReadPartial: - case ReadContext::ReadComplete: - // Did we read anything - try to set the size. - if (hasFirstImageHeader()) { - QSize imgSize = m_imageList[0].m_image.size(); - setSize(imgSize.width(), imgSize.height()); - - if (readContext.reader()->supportsAnimation()) { - if (readContext.reader()->loopCount() != -1) - m_loopCount = readContext.reader()->loopCount(); - else - m_loopCount = 0; //loop forever - } - } - break; - } -} + ASSERT(m_reader); + if (m_reader->supportsAnimation()) + m_reader->jumpToImage(frameIndex); + else if (frameIndex != 0) + return failRead(); -bool ImageDecoderQt::isSizeAvailable() -{ - if (debugImageDecoderQt) - qDebug() << " ImageDecoderQt::isSizeAvailable() returns" << ImageDecoder::isSizeAvailable(); - return ImageDecoder::isSizeAvailable(); -} + internalHandleCurrentImage(frameIndex); -int ImageDecoderQt::frameCount() const -{ - if (debugImageDecoderQt) - qDebug() << " ImageDecoderQt::frameCount() returns" << m_imageList.size(); - return m_imageList.size(); -} + // Attempt to return some memory + for (int i = 0; i < m_frameBufferCache.size(); ++i) + if (m_frameBufferCache[i].status() != RGBA32Buffer::FrameComplete) + return; -int ImageDecoderQt::repetitionCount() const -{ - if (debugImageDecoderQt) - qDebug() << " ImageDecoderQt::repetitionCount() returns" << m_loopCount; - return m_loopCount; + delete m_reader; + delete m_buffer; + m_buffer = 0; + m_reader = 0; } -bool ImageDecoderQt::supportsAlpha() const +void ImageDecoderQt::internalHandleCurrentImage(size_t frameIndex) { - return m_hasAlphaChannel; -} + // Now get the QImage from Qt and place it in the RGBA32Buffer + QImage img; + if (!m_reader->read(&img)) + return failRead(); -int ImageDecoderQt::duration(size_t index) const -{ - if (index >= m_imageList.size()) - return 0; - return m_imageList[index].m_duration; + // now into the RGBA32Buffer - even if the image is not + QSize imageSize = img.size(); + RGBA32Buffer* const buffer = &m_frameBufferCache[frameIndex]; + buffer->setRect(m_reader->currentImageRect()); + buffer->setStatus(RGBA32Buffer::FrameComplete); + buffer->setDuration(m_reader->nextImageDelay()); + buffer->setDecodedImage(img); } -String ImageDecoderQt::filenameExtension() const -{ - if (debugImageDecoderQt) - qDebug() << " ImageDecoderQt::filenameExtension() returns" << m_imageFormat; - return m_imageFormat; -}; +// The QImageIOHandler is not able to tell us how many frames +// we have and we need to parse every image. We do this by +// increasing the m_frameBufferCache by one and try to parse +// the image. We stop when QImage::read fails and then need +// to resize the m_frameBufferCache to the final size and update +// the m_failed. In case we failed to decode the first image +// we want to keep m_failed set to true. -RGBA32Buffer* ImageDecoderQt::frameBufferAtIndex(size_t index) -{ - Q_ASSERT("use imageAtIndex instead"); - return 0; -} - -QPixmap* ImageDecoderQt::imageAtIndex(size_t index) const +// TODO: Do not increment the m_frameBufferCache.size() by one but more than one +void ImageDecoderQt::forceLoadEverything() { - if (debugImageDecoderQt) - qDebug() << "ImageDecoderQt::imageAtIndex(" << index << ')'; + int imageCount = 0; - if (index >= m_imageList.size()) - return 0; - - if (!m_pixmapCache.contains(index)) { - m_pixmapCache.insert(index, - QPixmap::fromImage(m_imageList[index].m_image)); + do { + m_frameBufferCache.resize(++imageCount); + internalHandleCurrentImage(imageCount - 1); + } while(!m_failed); - // store null image since the converted pixmap is already in pixmap cache - Q_ASSERT(m_imageList[index].m_imageState == ImageComplete); - m_imageList[index].m_image = QImage(); - } - return &m_pixmapCache[index]; + // If we failed decoding the first image we actually + // have no images and need to keep m_failed set to + // true otherwise we want to reset it and forget about + // the last attempt to decode a image. + m_frameBufferCache.resize(imageCount - 1); + m_failed = imageCount == 1; } -void ImageDecoderQt::clearFrame(size_t index) +void ImageDecoderQt::failRead() { - if (m_imageList.size() < (int)index) - m_imageList[index].m_image = QImage(); - m_pixmapCache.take(index); + setFailed(); + delete m_reader; + delete m_buffer; + m_reader = 0; + m_buffer = 0; } - } // vim: ts=4 sw=4 et diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h index ece0e48f1..d11b93849 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageDecoderQt.h @@ -28,10 +28,11 @@ #define ImageDecoderQt_h #include "ImageDecoder.h" -#include <QtGui/QImage> +#include <QtGui/QImageReader> #include <QtGui/QPixmap> #include <QtCore/QList> #include <QtCore/QHash> +#include <QtCore/QBuffer> namespace WebCore { @@ -39,54 +40,35 @@ namespace WebCore { class ImageDecoderQt : public ImageDecoder { public: - static ImageDecoderQt* create(const SharedBuffer& data); + ImageDecoderQt(); ~ImageDecoderQt(); - typedef Vector<char> IncomingData; - - virtual void setData(const IncomingData& data, bool allDataReceived); + virtual void setData(SharedBuffer* data, bool allDataReceived); virtual bool isSizeAvailable(); - virtual int frameCount() const; + virtual size_t frameCount(); virtual int repetitionCount() const; virtual RGBA32Buffer* frameBufferAtIndex(size_t index); - QPixmap* imageAtIndex(size_t index) const; - virtual bool supportsAlpha() const; - int duration(size_t index) const; virtual String filenameExtension() const; - void clearFrame(size_t index); + virtual void clearFrameBufferCache(size_t clearBeforeFrame); private: - ImageDecoderQt(const QString &imageFormat); ImageDecoderQt(const ImageDecoderQt&); ImageDecoderQt &operator=(const ImageDecoderQt&); - class ReadContext; - void reset(); - bool hasFirstImageHeader() const; - - enum ImageState { - // Started image reading - ImagePartial, - // Header (size / alpha) are known - ImageHeaderValid, - // Image is complete - ImageComplete }; - - struct ImageData { - ImageData(const QImage& image, ImageState imageState = ImagePartial, int duration=0); - QImage m_image; - ImageState m_imageState; - int m_duration; - }; - - bool m_hasAlphaChannel; - typedef QList<ImageData> ImageList; - mutable ImageList m_imageList; - mutable QHash<int, QPixmap> m_pixmapCache; - int m_loopCount; - QString m_imageFormat; +private: + void internalDecodeSize(); + void internalReadImage(size_t); + void internalHandleCurrentImage(size_t); + void forceLoadEverything(); + void failRead(); + +private: + QByteArray m_format; + QBuffer* m_buffer; + QImageReader* m_reader; + mutable int m_repetitionCount; }; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp index 5d40e26ad..b67110750 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/ImageQt.cpp @@ -76,6 +76,7 @@ bool FrameData::clear(bool clearMetadata) m_haveMetadata = false; if (m_frame) { + delete m_frame; m_frame = 0; return true; } @@ -119,6 +120,38 @@ void Image::drawPattern(GraphicsContext* ctxt, const FloatRect& tileRect, const imageObserver()->didDraw(this); } +BitmapImage::BitmapImage(QPixmap* pixmap, ImageObserver* observer) + : Image(observer) + , m_currentFrame(0) + , m_frames(0) + , m_frameTimer(0) + , m_repetitionCount(cAnimationNone) + , m_repetitionCountStatus(Unknown) + , m_repetitionsComplete(0) + , m_isSolidColor(false) + , m_checkedForSolidColor(false) + , m_animationFinished(true) + , m_allDataReceived(true) + , m_haveSize(true) + , m_sizeAvailable(true) + , m_decodedSize(0) + , m_haveFrameCount(true) + , m_frameCount(1) +{ + initPlatformData(); + + int width = pixmap->width(); + int height = pixmap->height(); + m_decodedSize = width * height * 4; + m_size = IntSize(width, height); + + m_frames.grow(1); + m_frames[0].m_frame = pixmap; + m_frames[0].m_hasAlpha = pixmap->hasAlpha(); + m_frames[0].m_haveMetadata = true; + checkForSolidColor(); +} + void BitmapImage::initPlatformData() { } @@ -180,6 +213,13 @@ void BitmapImage::checkForSolidColor() m_solidColor = QColor::fromRgba(framePixmap->toImage().pixel(0, 0)); } +#if PLATFORM(WIN_OS) +PassRefPtr<BitmapImage> BitmapImage::create(HBITMAP hBitmap) +{ + return BitmapImage::create(new QPixmap(QPixmap::fromWinHBITMAP(hBitmap))); +} +#endif + } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.cpp index 76b14943a..9faa23403 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.cpp @@ -27,6 +27,7 @@ #include "FrameView.h" #include "GraphicsContext.h" #include "NotImplemented.h" +#include "TimeRanges.h" #include "Widget.h" #include <wtf/HashSet.h> @@ -37,9 +38,12 @@ #include <QUrl> #include <QEvent> -#include <Phonon/AudioOutput> -#include <Phonon/MediaObject> -#include <Phonon/VideoWidget> +#if defined (__SYMBIAN32__) +#include <phonon/path.h> +#endif +#include <audiooutput.h> +#include <mediaobject.h> +#include <videowidget.h> using namespace Phonon; @@ -100,15 +104,15 @@ MediaPlayerPrivate::MediaPlayerPrivate(MediaPlayer* player) foreach (QWidget* widget, qFindChildren<QWidget*>(m_videoWidget)) widget->installEventFilter(this); - connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State, Phonon::State)), - this, SLOT(stateChanged(Phonon::State, Phonon::State))); + connect(m_mediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), + this, SLOT(stateChanged(Phonon::State,Phonon::State))); connect(m_mediaObject, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged())); connect(m_mediaObject, SIGNAL(seekableChanged(bool)), this, SLOT(seekableChanged(bool))); connect(m_mediaObject, SIGNAL(hasVideoChanged(bool)), this, SLOT(hasVideoChanged(bool))); connect(m_mediaObject, SIGNAL(bufferStatus(int)), this, SLOT(bufferStatus(int))); connect(m_mediaObject, SIGNAL(finished()), this, SLOT(finished())); - connect(m_mediaObject, SIGNAL(currentSourceChanged(const Phonon::MediaSource&)), - this, SLOT(currentSourceChanged(const Phonon::MediaSource&))); + connect(m_mediaObject, SIGNAL(currentSourceChanged(Phonon::MediaSource)), + this, SLOT(currentSourceChanged(Phonon::MediaSource))); connect(m_mediaObject, SIGNAL(aboutToFinish()), this, SLOT(aboutToFinish())); connect(m_mediaObject, SIGNAL(totalTimeChanged(qint64)), this, SLOT(totalTimeChanged(qint64))); } @@ -146,7 +150,7 @@ void MediaPlayerPrivate::getSupportedTypes(HashSet<String>&) notImplemented(); } -MediaPlayer::SupportsType MediaPlayerPrivate::supportsType(const String& type, const String& codecs) +MediaPlayer::SupportsType MediaPlayerPrivate::supportsType(const String&, const String&) { // FIXME: do the real thing notImplemented(); @@ -160,6 +164,14 @@ bool MediaPlayerPrivate::hasVideo() const return hasVideo; } +bool MediaPlayerPrivate::hasAudio() const +{ + // FIXME: Phonon::MediaObject does not have such a hasAudio() function + bool hasAudio = true; + LOG(Media, "MediaPlayerPrivatePhonon::hasAudio() -> %s", hasAudio ? "true" : "false"); + return hasAudio; +} + void MediaPlayerPrivate::load(const String& url) { LOG(Media, "MediaPlayerPrivatePhonon::load(\"%s\")", url.utf8().data()); @@ -247,15 +259,15 @@ float MediaPlayerPrivate::currentTime() const return currentTime; } -void MediaPlayerPrivate::setEndTime(float endTime) +void MediaPlayerPrivate::setEndTime(float) { notImplemented(); } -float MediaPlayerPrivate::maxTimeBuffered() const +PassRefPtr<TimeRanges> MediaPlayerPrivate::buffered() const { notImplemented(); - return 0.0f; + return TimeRanges::create(); } float MediaPlayerPrivate::maxTimeSeekable() const diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h b/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h index 9572d6151..e1193b6c9 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/MediaPlayerPrivatePhonon.h @@ -80,6 +80,7 @@ namespace WebCore { IntSize naturalSize() const; bool hasVideo() const; + bool hasAudio() const; void load(const String &url); void cancelLoad(); @@ -104,7 +105,7 @@ namespace WebCore { MediaPlayer::NetworkState networkState() const; MediaPlayer::ReadyState readyState() const; - float maxTimeBuffered() const; + PassRefPtr<TimeRanges> buffered() const; float maxTimeSeekable() const; unsigned bytesLoaded() const; bool totalBytesKnown() const; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp index 39e243ecb..e5cecc833 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/PathQt.cpp @@ -92,7 +92,7 @@ bool Path::strokeContains(StrokeStyleApplier* applier, const FloatPoint& point) // FIXME: We should try to use a 'shared Context' instead of creating a new ImageBuffer // on each call. - OwnPtr<ImageBuffer> scratchImage = ImageBuffer::create(IntSize(1, 1), false); + OwnPtr<ImageBuffer> scratchImage = ImageBuffer::create(IntSize(1, 1)); GraphicsContext* gc = scratchImage->context(); QPainterPathStroker stroke; applier->strokeStyle(gc); @@ -124,7 +124,7 @@ FloatRect Path::strokeBoundingRect(StrokeStyleApplier* applier) { // FIXME: We should try to use a 'shared Context' instead of creating a new ImageBuffer // on each call. - OwnPtr<ImageBuffer> scratchImage = ImageBuffer::create(IntSize(1, 1), false); + OwnPtr<ImageBuffer> scratchImage = ImageBuffer::create(IntSize(1, 1)); GraphicsContext* gc = scratchImage->context(); QPainterPathStroker stroke; if (applier) { diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp index f823f8421..f093d7db8 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/SimpleFontDataQt.cpp @@ -33,7 +33,7 @@ void SimpleFontData::determinePitch() m_treatAsFixedPitch = m_platformData.font().fixedPitch(); } -bool SimpleFontData::containsCharacters(const UChar*, int length) const +bool SimpleFontData::containsCharacters(const UChar*, int) const { return true; } diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/qt/StillImageQt.h b/src/3rdparty/webkit/WebCore/platform/graphics/qt/StillImageQt.h index 2b2c1f733..6c417b14a 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/qt/StillImageQt.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/qt/StillImageQt.h @@ -41,7 +41,7 @@ namespace WebCore { // FIXME: StillImages are underreporting decoded sizes and will be unable // to prune because these functions are not implemented yet. - virtual void destroyDecodedData(bool destroyAll = true) { } + virtual void destroyDecodedData(bool destroyAll = true) { Q_UNUSED(destroyAll); } virtual unsigned decodedSize() const { return 0; } virtual IntSize size() const; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp index ab3413bb2..230be3c93 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.cpp @@ -47,7 +47,7 @@ PassRefPtr<TransformOperation> Matrix3DTransformOperation::blend(const Transform apply(toT, size); if (blendToIdentity) - swap(fromT, toT); + std::swap(fromT, toT); toT.blend(fromT, progress); return Matrix3DTransformOperation::create(toT); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp index 4934fa65b..0eaccea2c 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/MatrixTransformOperation.cpp @@ -43,7 +43,7 @@ PassRefPtr<TransformOperation> MatrixTransformOperation::blend(const TransformOp } if (blendToIdentity) - swap(fromT, toT); + std::swap(fromT, toT); toT.blend(fromT, progress); return MatrixTransformOperation::create(toT.a(), toT.b(), toT.c(), toT.d(), toT.e(), toT.f()); diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformOperations.h b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformOperations.h index 11605e854..dd5640843 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformOperations.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformOperations.h @@ -60,6 +60,9 @@ public: Vector<RefPtr<TransformOperation> >& operations() { return m_operations; } const Vector<RefPtr<TransformOperation> >& operations() const { return m_operations; } + size_t size() const { return m_operations.size(); } + const TransformOperation* at(size_t index) const { return index < m_operations.size() ? m_operations.at(index).get() : 0; } + private: Vector<RefPtr<TransformOperation> > m_operations; }; diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.cpp b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.cpp index a358aaf9d..13ef28131 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.cpp +++ b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -865,6 +866,16 @@ TransformationMatrix& TransformationMatrix::applyPerspective(double p) return *this; } +TransformationMatrix TransformationMatrix::rectToRect(const FloatRect& from, const FloatRect& to) +{ + ASSERT(!from.isEmpty()); + return TransformationMatrix(to.width() / from.width(), + 0, 0, + to.height() / from.height(), + to.x() - from.x(), + to.y() - from.y()); +} + // // *this = mat * *this // diff --git a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.h b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.h index 36e4b7055..83719d21b 100644 --- a/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.h +++ b/src/3rdparty/webkit/WebCore/platform/graphics/transforms/TransformationMatrix.h @@ -225,6 +225,9 @@ public: TransformationMatrix& applyPerspective(double p); bool hasPerspective() const { return m_matrix[2][3] != 0.0f; } + // returns a transformation that maps a rect to a rect + static TransformationMatrix rectToRect(const FloatRect&, const FloatRect&); + bool isInvertible() const; // This method returns the identity matrix if it is not invertible. @@ -284,7 +287,7 @@ public: } // result = *this * t (i.e., a multRight) - TransformationMatrix operator*(const TransformationMatrix& t) + TransformationMatrix operator*(const TransformationMatrix& t) const { TransformationMatrix result = t; result.multLeft(*this); diff --git a/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.cpp b/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.cpp new file mode 100644 index 000000000..a16b94084 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.cpp @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2008-2009 Torch Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" + +#include "ImageDecoder.h" + +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) +#include <algorithm> +#endif + +#include "BMPImageDecoder.h" +#include "GIFImageDecoder.h" +#include "ICOImageDecoder.h" +#include "JPEGImageDecoder.h" +#include "PNGImageDecoder.h" +#include "SharedBuffer.h" +#include "XBMImageDecoder.h" + +namespace WebCore { + +ImageDecoder* ImageDecoder::create(const SharedBuffer& data) +{ + // We need at least 4 bytes to figure out what kind of image we're dealing with. + int length = data.size(); + if (length < 4) + return 0; + + const unsigned char* uContents = (const unsigned char*)data.data(); + const char* contents = data.data(); + + // GIFs begin with GIF8(7 or 9). + if (strncmp(contents, "GIF8", 4) == 0) + return new GIFImageDecoder(); + + // Test for PNG. + if (uContents[0]==0x89 && + uContents[1]==0x50 && + uContents[2]==0x4E && + uContents[3]==0x47) + return new PNGImageDecoder(); + + // JPEG + if (uContents[0]==0xFF && + uContents[1]==0xD8 && + uContents[2]==0xFF) + return new JPEGImageDecoder(); + + // BMP + if (strncmp(contents, "BM", 2) == 0) + return new BMPImageDecoder(); + + // ICOs always begin with a 2-byte 0 followed by a 2-byte 1. + // CURs begin with 2-byte 0 followed by 2-byte 2. + if (!memcmp(contents, "\000\000\001\000", 4) || + !memcmp(contents, "\000\000\002\000", 4)) + return new ICOImageDecoder(); + + // XBMs require 8 bytes of info. + if (length >= 8 && strncmp(contents, "#define ", 8) == 0) + return new XBMImageDecoder(); + + // Give up. We don't know what the heck this is. + return 0; +} + +#if !PLATFORM(SKIA) + +RGBA32Buffer::RGBA32Buffer() + : m_hasAlpha(false) + , m_status(FrameEmpty) + , m_duration(0) + , m_disposalMethod(DisposeNotSpecified) +{ +} + +void RGBA32Buffer::clear() +{ + m_bytes.clear(); + m_status = FrameEmpty; + // NOTE: Do not reset other members here; clearFrameBufferCache() + // calls this to free the bitmap data, but other functions like + // initFrameBuffer() and frameComplete() may still need to read + // other metadata out of this frame later. +} + +void RGBA32Buffer::zeroFill() +{ + m_bytes.fill(0); + m_hasAlpha = true; +} + +void RGBA32Buffer::copyBitmapData(const RGBA32Buffer& other) +{ + if (this == &other) + return; + + m_bytes = other.m_bytes; + m_size = other.m_size; + setHasAlpha(other.m_hasAlpha); +} + +bool RGBA32Buffer::setSize(int newWidth, int newHeight) +{ + // NOTE: This has no way to check for allocation failure if the + // requested size was too big... + m_bytes.resize(newWidth * newHeight); + m_size = IntSize(newWidth, newHeight); + + // Zero the image. + zeroFill(); + + return true; +} + +bool RGBA32Buffer::hasAlpha() const +{ + return m_hasAlpha; +} + +void RGBA32Buffer::setHasAlpha(bool alpha) +{ + m_hasAlpha = alpha; +} + +void RGBA32Buffer::setStatus(FrameStatus status) +{ + m_status = status; +} + +RGBA32Buffer& RGBA32Buffer::operator=(const RGBA32Buffer& other) +{ + if (this == &other) + return *this; + + copyBitmapData(other); + setRect(other.rect()); + setStatus(other.status()); + setDuration(other.duration()); + setDisposalMethod(other.disposalMethod()); + return *this; +} + +int RGBA32Buffer::width() const +{ + return m_size.width(); +} + +int RGBA32Buffer::height() const +{ + return m_size.height(); +} + +#endif + +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) + +namespace { + +enum MatchType { + Exact, + UpperBound, + LowerBound +}; + +inline void fillScaledValues(Vector<int>& scaledValues, double scaleRate, int length) +{ + double inflateRate = 1. / scaleRate; + scaledValues.reserveCapacity(static_cast<int>(length * scaleRate + 0.5)); + for (int scaledIndex = 0;;) { + int index = static_cast<int>(scaledIndex * inflateRate + 0.5); + if (index < length) { + scaledValues.append(index); + ++scaledIndex; + } else + break; + } +} + +template <MatchType type> int getScaledValue(const Vector<int>& scaledValues, int valueToMatch, int searchStart) +{ + const int* dataStart = scaledValues.data(); + const int* dataEnd = dataStart + scaledValues.size(); + const int* matched = std::lower_bound(dataStart + searchStart, dataEnd, valueToMatch); + switch (type) { + case Exact: + return matched != dataEnd && *matched == valueToMatch ? matched - dataStart : -1; + case LowerBound: + return matched != dataEnd && *matched == valueToMatch ? matched - dataStart : matched - dataStart - 1; + case UpperBound: + default: + return matched != dataEnd ? matched - dataStart : -1; + } +} + +} + +void ImageDecoder::prepareScaleDataIfNecessary() +{ + int width = m_size.width(); + int height = m_size.height(); + int numPixels = height * width; + if (m_maxNumPixels <= 0 || numPixels <= m_maxNumPixels) { + m_scaled = false; + return; + } + + m_scaled = true; + double scale = sqrt(m_maxNumPixels / (double)numPixels); + fillScaledValues(m_scaledColumns, scale, width); + fillScaledValues(m_scaledRows, scale, height); +} + +int ImageDecoder::upperBoundScaledX(int origX, int searchStart) +{ + return getScaledValue<UpperBound>(m_scaledColumns, origX, searchStart); +} + +int ImageDecoder::lowerBoundScaledX(int origX, int searchStart) +{ + return getScaledValue<LowerBound>(m_scaledColumns, origX, searchStart); +} + +int ImageDecoder::scaledY(int origY, int searchStart) +{ + return getScaledValue<Exact>(m_scaledRows, origY, searchStart); +} + +#endif // ENABLE(IMAGE_DECODER_DOWN_SAMPLING) + +} diff --git a/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h b/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h index 9c2a9d7f2..5692de71d 100644 --- a/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h +++ b/src/3rdparty/webkit/WebCore/platform/image-decoders/ImageDecoder.h @@ -1,5 +1,7 @@ /* * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2008-2009 Torch Mobile, Inc. + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -36,7 +38,8 @@ #if PLATFORM(SKIA) #include "NativeImageSkia.h" -#include "SkBitmap.h" +#elif PLATFORM(QT) +#include <QImage> #endif namespace WebCore { @@ -54,7 +57,7 @@ namespace WebCore { DisposeOverwriteBgcolor, // Clear frame to transparent DisposeOverwritePrevious, // Clear frame to previous framebuffer contents }; -#if PLATFORM(SKIA) +#if PLATFORM(SKIA) || PLATFORM(QT) typedef uint32_t PixelData; #else typedef unsigned PixelData; @@ -126,6 +129,11 @@ namespace WebCore { setRGBA(getAddr(x, y), r, g, b, a); } +#if PLATFORM(QT) + void setDecodedImage(const QImage& image); + QImage decodedImage() const { return m_image; } +#endif + private: RGBA32Buffer& operator=(const RGBA32Buffer& other); @@ -134,13 +142,12 @@ namespace WebCore { inline PixelData* getAddr(int x, int y) { -#if PLATFORM(CAIRO) || PLATFORM(WX) - return m_bytes.data() + (y * width()) + x; -#elif PLATFORM(SKIA) +#if PLATFORM(SKIA) return m_bitmap.getAddr32(x, y); +#elif PLATFORM(QT) + return reinterpret_cast<QRgb*>(m_image.scanLine(y)) + x; #else - ASSERT_NOT_REACHED(); - return 0; + return m_bytes.data() + (y * width()) + x; #endif } @@ -160,13 +167,17 @@ namespace WebCore { } } -#if PLATFORM(CAIRO) || PLATFORM(WX) +#if PLATFORM(SKIA) + NativeImageSkia m_bitmap; +#elif PLATFORM(QT) + mutable QImage m_image; + bool m_hasAlpha; + IntSize m_size; +#else Vector<PixelData> m_bytes; IntSize m_size; // The size of the buffer. This should be the // same as ImageDecoder::m_size. bool m_hasAlpha; // Whether or not any of the pixels in the buffer have transparency. -#elif PLATFORM(SKIA) - NativeImageSkia m_bitmap; #endif IntRect m_rect; // The rect of the original specified frame within the overall buffer. // This will always just be the entire buffer except for GIF frames @@ -182,14 +193,27 @@ namespace WebCore { // and the base class manages the RGBA32 frame cache. class ImageDecoder { public: + // ENABLE(IMAGE_DECODER_DOWN_SAMPLING) allows image decoders to write directly to + // scaled output buffers by down sampling. Call setMaxNumPixels() to specify the + // biggest size that decoded images can have. Image decoders will deflate those + // images that are bigger than m_maxNumPixels. (Not supported by all image decoders yet) ImageDecoder() : m_failed(false) , m_sizeAvailable(false) +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) + , m_maxNumPixels(-1) + , m_scaled(false) +#endif { } virtual ~ImageDecoder() {} + // Factory function to create an ImageDecoder. Ports that subclass + // ImageDecoder can provide their own implementation of this to avoid + // needing to write a dedicated setData() implementation. + static ImageDecoder* create(const SharedBuffer& data); + // The the filename extension usually associated with an undecoded image of this type. virtual String filenameExtension() const = 0; @@ -205,7 +229,7 @@ namespace WebCore { return !m_failed && m_sizeAvailable; } - // Requests the size. + // Returns the size of the image. virtual IntSize size() const { // Requesting the size of an invalid bitmap is meaningless. @@ -213,6 +237,17 @@ namespace WebCore { return m_size; } + // Returns the size of frame |index|. This will only differ from size() + // for formats where different frames are different sizes (namely ICO, + // where each frame represents a different icon within the master file). + // Notably, this does not return different sizes for different GIF + // frames, since while these may be stored as smaller rectangles, during + // decoding they are composited to create a full-size frame. + virtual IntSize frameSizeAtIndex(size_t) const + { + return size(); + } + // Called by the image decoders to set their decoded size, this also check // the size for validity. It will return true if the size was set, or false // if there is an error. On error, the m_failed flag will be set and the @@ -231,7 +266,7 @@ namespace WebCore { // The total number of frames for the image. Classes that support multiple frames // will scan the image data for the answer if they need to (without necessarily // decoding all of the individual frames). - virtual int frameCount() { return 1; } + virtual size_t frameCount() { return 1; } // The number of repetitions to perform for an animation loop. virtual int repetitionCount() const { return cAnimationNone; } @@ -239,7 +274,7 @@ namespace WebCore { // Called to obtain the RGBA32Buffer full of decoded data for rendering. The // decoder plugin will decode as much of the frame as it can before handing // back the buffer. - virtual RGBA32Buffer* frameBufferAtIndex(size_t index) = 0; + virtual RGBA32Buffer* frameBufferAtIndex(size_t) = 0; // Whether or not the underlying image format even supports alpha transparency. virtual bool supportsAlpha() const { return true; } @@ -255,8 +290,25 @@ namespace WebCore { // since in practice only GIFs will ever use this. virtual void clearFrameBufferCache(size_t clearBeforeFrame) { } +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) + void setMaxNumPixels(int m) { m_maxNumPixels = m; } +#endif + protected: +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) + void prepareScaleDataIfNecessary(); + int upperBoundScaledX(int origX, int searchStart = 0); + int lowerBoundScaledX(int origX, int searchStart = 0); + int scaledY(int origY, int searchStart = 0); +#endif + RefPtr<SharedBuffer> m_data; // The encoded data. +#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) + int m_maxNumPixels; + Vector<int> m_scaledColumns; + Vector<int> m_scaledRows; + bool m_scaled; +#endif Vector<RGBA32Buffer> m_frameBufferCache; bool m_failed; diff --git a/src/3rdparty/webkit/WebCore/platform/image-decoders/cairo/ImageDecoderCairo.cpp b/src/3rdparty/webkit/WebCore/platform/image-decoders/cairo/ImageDecoderCairo.cpp index c53eabd9f..203205db0 100644 --- a/src/3rdparty/webkit/WebCore/platform/image-decoders/cairo/ImageDecoderCairo.cpp +++ b/src/3rdparty/webkit/WebCore/platform/image-decoders/cairo/ImageDecoderCairo.cpp @@ -30,53 +30,6 @@ namespace WebCore { -RGBA32Buffer::RGBA32Buffer() - : m_hasAlpha(false) - , m_status(FrameEmpty) - , m_duration(0) - , m_disposalMethod(DisposeNotSpecified) -{ -} - -void RGBA32Buffer::clear() -{ - m_bytes.clear(); - m_status = FrameEmpty; - // NOTE: Do not reset other members here; clearFrameBufferCache() - // calls this to free the bitmap data, but other functions like - // initFrameBuffer() and frameComplete() may still need to read - // other metadata out of this frame later. -} - -void RGBA32Buffer::zeroFill() -{ - m_bytes.fill(0); - m_hasAlpha = true; -} - -void RGBA32Buffer::copyBitmapData(const RGBA32Buffer& other) -{ - if (this == &other) - return; - - m_bytes = other.m_bytes; - m_size = other.m_size; - setHasAlpha(other.m_hasAlpha); -} - -bool RGBA32Buffer::setSize(int newWidth, int newHeight) -{ - // NOTE: This has no way to check for allocation failure if the - // requested size was too big... - m_bytes.resize(newWidth * newHeight); - m_size = IntSize(newWidth, newHeight); - - // Zero the image. - zeroFill(); - - return true; -} - NativeImagePtr RGBA32Buffer::asNewNativeImage() const { return cairo_image_surface_create_for_data( @@ -85,40 +38,4 @@ NativeImagePtr RGBA32Buffer::asNewNativeImage() const width() * sizeof(PixelData)); } -bool RGBA32Buffer::hasAlpha() const -{ - return m_hasAlpha; -} - -void RGBA32Buffer::setHasAlpha(bool alpha) -{ - m_hasAlpha = alpha; -} - -void RGBA32Buffer::setStatus(FrameStatus status) -{ - m_status = status; -} - -RGBA32Buffer& RGBA32Buffer::operator=(const RGBA32Buffer& other) -{ - if (this == &other) - return *this; - - copyBitmapData(other); - setRect(other.rect()); - setStatus(other.status()); - setDuration(other.duration()); - setDisposalMethod(other.disposalMethod()); - return *this; -} - -int RGBA32Buffer::width() const { - return m_size.width(); -} - -int RGBA32Buffer::height() const { - return m_size.height(); -} - } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/image-decoders/qt/RGBA32BufferQt.cpp b/src/3rdparty/webkit/WebCore/platform/image-decoders/qt/RGBA32BufferQt.cpp new file mode 100644 index 000000000..da6ab380c --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/image-decoders/qt/RGBA32BufferQt.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2008, 2009 Google, Inc. + * Copyright (C) 2009 Holger Hans Peter Freyther + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 "ImageDecoder.h" + +#include <QPixmap> +#include <stdio.h> + +namespace WebCore { + +RGBA32Buffer::RGBA32Buffer() + : m_status(FrameEmpty) + , m_hasAlpha(false) + , m_size() + , m_duration(0) + , m_disposalMethod(DisposeNotSpecified) +{ +} + +// The image must not have format 8888 pre multiplied... +void RGBA32Buffer::setDecodedImage(const QImage& image) +{ + m_image = image; + m_size = image.size(); + m_hasAlpha = image.hasAlphaChannel(); +} + +void RGBA32Buffer::clear() +{ + m_image = QImage(); + m_status = FrameEmpty; + // NOTE: Do not reset other members here; clearFrameBufferCache() + // calls this to free the bitmap data, but other functions like + // initFrameBuffer() and frameComplete() may still need to read + // other metadata out of this frame later. +} + +void RGBA32Buffer::zeroFill() +{ + m_image.fill(0); +} + +void RGBA32Buffer::copyBitmapData(const RGBA32Buffer& other) +{ + if (this == &other) + return; + + m_image = other.m_image; + m_size = other.m_size; + m_hasAlpha = other.m_hasAlpha; +} + +bool RGBA32Buffer::setSize(int newWidth, int newHeight) +{ + // This function should only be called once, it will leak memory + // otherwise. + ASSERT(width() == 0 && height() == 0); + + m_size = IntSize(newWidth, newHeight); + m_image = QImage(newWidth, newHeight, QImage::Format_ARGB32_Premultiplied); + if (m_image.isNull()) { + // Allocation failure, maybe the bitmap was too big. + setStatus(FrameComplete); + return false; + } + + // Zero the image. + zeroFill(); + + return true; +} + +QPixmap* RGBA32Buffer::asNewNativeImage() const +{ + QPixmap pix = QPixmap::fromImage(m_image); + m_image = QImage(); + + return new QPixmap(pix); +} + +bool RGBA32Buffer::hasAlpha() const +{ + return m_hasAlpha; +} + +void RGBA32Buffer::setHasAlpha(bool alpha) +{ + m_hasAlpha = alpha; +} + +void RGBA32Buffer::setStatus(FrameStatus status) +{ + m_status = status; +} + +RGBA32Buffer& RGBA32Buffer::operator=(const RGBA32Buffer& other) +{ + if (this == &other) + return *this; + + copyBitmapData(other); + setRect(other.rect()); + setStatus(other.status()); + setDuration(other.duration()); + setDisposalMethod(other.disposalMethod()); + return *this; +} + +int RGBA32Buffer::width() const +{ + return m_size.width(); +} + +int RGBA32Buffer::height() const +{ + return m_size.height(); +} + +} diff --git a/src/3rdparty/webkit/WebCore/platform/image-decoders/wx/ImageDecoderWx.cpp b/src/3rdparty/webkit/WebCore/platform/image-decoders/wx/ImageDecoderWx.cpp index 8e8809e66..3cadf1cf0 100644 --- a/src/3rdparty/webkit/WebCore/platform/image-decoders/wx/ImageDecoderWx.cpp +++ b/src/3rdparty/webkit/WebCore/platform/image-decoders/wx/ImageDecoderWx.cpp @@ -37,73 +37,21 @@ namespace WebCore { -RGBA32Buffer::RGBA32Buffer() - : m_hasAlpha(false) - , m_status(FrameEmpty) - , m_duration(0) - , m_disposalMethod(DisposeNotSpecified) -{ -} - -void RGBA32Buffer::clear() -{ - m_bytes.clear(); - m_status = FrameEmpty; - // NOTE: Do not reset other members here; clearFrameBufferCache() - // calls this to free the bitmap data, but other functions like - // initFrameBuffer() and frameComplete() may still need to read - // other metadata out of this frame later. -} - -void RGBA32Buffer::zeroFill() -{ - m_bytes.fill(0); - m_hasAlpha = true; -} - -void RGBA32Buffer::copyBitmapData(const RGBA32Buffer& other) -{ - if (this == &other) - return; - - m_bytes = other.m_bytes; - m_size = other.m_size; - setHasAlpha(other.m_hasAlpha); -} - -bool RGBA32Buffer::setSize(int newWidth, int newHeight) -{ - // NOTE: This has no way to check for allocation failure if the - // requested size was too big... - m_bytes.resize(newWidth * newHeight); - m_size = IntSize(newWidth, newHeight); - - // Zero the image. - zeroFill(); - - return true; -} - NativeImagePtr RGBA32Buffer::asNewNativeImage() const { - const unsigned char* bytes = (const unsigned char*)m_bytes.data(); - - typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> WxPixelData; - wxBitmap* bmp = new wxBitmap(width(), height(), 32); + typedef wxPixelData<wxBitmap, wxAlphaPixelFormat> WxPixelData; WxPixelData data(*bmp); + // NB: It appears that the data is in BGRA format instead of RGBA format. + // This code works properly on both ppc and intel, meaning the issue is + // likely not an issue of byte order getting mixed up on different archs. + const unsigned char* bytes = (const unsigned char*)m_bytes.data(); int rowCounter = 0; long pixelCounter = 0; - WxPixelData::Iterator p(data); - WxPixelData::Iterator rowStart = p; - - // NB: It appears that the data is in BGRA format instead of RGBA format. - // This code works properly on both ppc and intel, meaning the issue is - // likely not an issue of byte order getting mixed up on different archs. - for (long i = 0; i < m_bytes.size() * sizeof(PixelData); i += sizeof(PixelData)) { + for (size_t i = 0; i < m_bytes.size() * sizeof(PixelData); i += sizeof(PixelData)) { p.Red() = bytes[i+2]; p.Green() = bytes[i+1]; p.Blue() = bytes[i+0]; @@ -112,12 +60,11 @@ NativeImagePtr RGBA32Buffer::asNewNativeImage() const p++; pixelCounter++; - if ( (pixelCounter % width() ) == 0 ) { + if ((pixelCounter % width()) == 0) { rowCounter++; p = rowStart; p.MoveTo(data, 0, rowCounter); } - } #if !wxCHECK_VERSION(2,9,0) bmp->UseAlpha(); @@ -125,7 +72,7 @@ NativeImagePtr RGBA32Buffer::asNewNativeImage() const ASSERT(bmp->IsOk()); #if USE(WXGC) - wxGraphicsBitmap* bitmap = new wxGraphicsBitmap(wxGraphicsRenderer::GetDefaultRenderer()->CreateBitmap(*bmp)); + wxGraphicsBitmap* bitmap = new wxGraphicsBitmap(wxGraphicsRenderer::GetDefaultRenderer()->CreateBitmap(*bmp)); delete bmp; return bitmap; #else @@ -133,40 +80,4 @@ NativeImagePtr RGBA32Buffer::asNewNativeImage() const #endif } -bool RGBA32Buffer::hasAlpha() const -{ - return m_hasAlpha; -} - -void RGBA32Buffer::setHasAlpha(bool alpha) -{ - m_hasAlpha = alpha; -} - -void RGBA32Buffer::setStatus(FrameStatus status) -{ - m_status = status; -} - -RGBA32Buffer& RGBA32Buffer::operator=(const RGBA32Buffer& other) -{ - if (this == &other) - return *this; - - copyBitmapData(other); - setRect(other.rect()); - setStatus(other.status()); - setDuration(other.duration()); - setDisposalMethod(other.disposalMethod()); - return *this; -} - -int RGBA32Buffer::width() const { - return m_size.width(); -} - -int RGBA32Buffer::height() const { - return m_size.height(); -} - } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.h b/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.h index 9bdd276f4..3d3c78eff 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.h +++ b/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.h @@ -67,7 +67,9 @@ public: void setDragImageElement(Node *, const IntPoint&); virtual DragImageRef createDragImage(IntPoint& dragLoc) const; +#if ENABLE(DRAG_SUPPORT) virtual void declareAndWriteDragImage(Element*, const KURL&, const String& title, Frame*); +#endif virtual void writeRange(Range*, Frame* frame); virtual void writeURL(const KURL&, const String&, Frame* frame); diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm index 52bc9523d..f4321ad26 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/ClipboardMac.mm @@ -63,7 +63,7 @@ bool ClipboardMac::hasData() return m_pasteboard && [m_pasteboard.get() types] && [[m_pasteboard.get() types] count] > 0; } -static NSString *cocoaTypeFromMIMEType(const String& type) +static NSString *cocoaTypeFromHTMLClipboardType(const String& type) { String qType = type.stripWhiteSpace(); @@ -82,10 +82,9 @@ static NSString *cocoaTypeFromMIMEType(const String& type) // Try UTI now NSString *mimeType = qType; - CFStringRef UTIType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (CFStringRef)mimeType, NULL); - if (UTIType) { - CFStringRef pbType = UTTypeCopyPreferredTagWithClass(UTIType, kUTTagClassNSPboardType); - CFRelease(UTIType); + RetainPtr<CFStringRef> utiType(AdoptCF, UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (CFStringRef)mimeType, NULL)); + if (utiType) { + CFStringRef pbType = UTTypeCopyPreferredTagWithClass(utiType.get(), kUTTagClassNSPboardType); if (pbType) return HardAutorelease(pbType); } @@ -94,28 +93,48 @@ static NSString *cocoaTypeFromMIMEType(const String& type) return qType; } -static String MIMETypeFromCocoaType(NSString *type) +static String utiTypeFromCocoaType(NSString *type) +{ + RetainPtr<CFStringRef> utiType(AdoptCF, UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType, (CFStringRef)type, NULL)); + if (utiType) { + RetainPtr<CFStringRef> mimeType(AdoptCF, UTTypeCopyPreferredTagWithClass(utiType.get(), kUTTagClassMIMEType)); + if (mimeType) + return String(mimeType.get()); + } + return String(); +} + +static void addHTMLClipboardTypesForCocoaType(HashSet<String>& resultTypes, NSString *cocoaType, NSPasteboard *pasteboard) { // UTI may not do these right, so make sure we get the right, predictable result - if ([type isEqualToString:NSStringPboardType]) - return "text/plain"; - if ([type isEqualToString:NSURLPboardType] || [type isEqualToString:NSFilenamesPboardType]) - return "text/uri-list"; - - // Now try the general UTI mechanism - CFStringRef UTIType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType, (CFStringRef)type, NULL); - if (UTIType) { - CFStringRef mimeType = UTTypeCopyPreferredTagWithClass(UTIType, kUTTagClassMIMEType); - CFRelease(UTIType); - if (mimeType) { - String result = mimeType; - CFRelease(mimeType); - return result; + if ([cocoaType isEqualToString:NSStringPboardType]) { + resultTypes.add("text/plain"); + return; + } + if ([cocoaType isEqualToString:NSURLPboardType]) { + resultTypes.add("text/uri-list"); + return; + } + if ([cocoaType isEqualToString:NSFilenamesPboardType]) { + // If file list is empty, add nothing. + // Note that there is a chance that the file list count could have changed since we grabbed the types array. + // However, this is not really an issue for us doing a sanity check here. + NSArray *fileList = [pasteboard propertyListForType:NSFilenamesPboardType]; + if ([fileList count]) { + // It is unknown if NSFilenamesPboardType always implies NSURLPboardType in Cocoa, + // but NSFilenamesPboardType should imply both 'text/uri-list' and 'Files' + resultTypes.add("text/uri-list"); + resultTypes.add("Files"); } + return; + } + String utiType = utiTypeFromCocoaType(cocoaType); + if (!utiType.isEmpty()) { + resultTypes.add(utiType); + return; } - // No mapping, just pass the whole string though - return type; + resultTypes.add(cocoaType); } void ClipboardMac::clearData(const String& type) @@ -125,7 +144,7 @@ void ClipboardMac::clearData(const String& type) // note NSPasteboard enforces changeCount itself on writing - can't write if not the owner - NSString *cocoaType = cocoaTypeFromMIMEType(type); + NSString *cocoaType = cocoaTypeFromHTMLClipboardType(type); if (cocoaType) [m_pasteboard.get() setString:@"" forType:cocoaType]; } @@ -192,12 +211,12 @@ String ClipboardMac::getData(const String& type, bool& success) const if (policy() != ClipboardReadable) return String(); - NSString *cocoaType = cocoaTypeFromMIMEType(type); + NSString *cocoaType = cocoaTypeFromHTMLClipboardType(type); NSString *cocoaValue = nil; // Grab the value off the pasteboard corresponding to the cocoaType if ([cocoaType isEqualToString:NSURLPboardType]) { - // "URL" and "text/url-list" both map to NSURLPboardType in cocoaTypeFromMIMEType(), "URL" only wants the first URL + // "URL" and "text/url-list" both map to NSURLPboardType in cocoaTypeFromHTMLClipboardType(), "URL" only wants the first URL bool onlyFirstURL = (type == "URL"); NSArray *absoluteURLs = absoluteURLsFromPasteboard(m_pasteboard.get(), onlyFirstURL); cocoaValue = [absoluteURLs componentsJoinedByString:@"\n"]; @@ -222,7 +241,7 @@ bool ClipboardMac::setData(const String &type, const String &data) return false; // note NSPasteboard enforces changeCount itself on writing - can't write if not the owner - NSString *cocoaType = cocoaTypeFromMIMEType(type); + NSString *cocoaType = cocoaTypeFromHTMLClipboardType(type); NSString *cocoaData = data; if ([cocoaType isEqualToString:NSURLPboardType]) { @@ -263,15 +282,16 @@ HashSet<String> ClipboardMac::types() const HashSet<String> result; NSUInteger count = [types count]; + // 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 (NSUInteger i = 0; i < count; i++) { NSString *pbType = [types objectAtIndex:i]; if ([pbType isEqualToString:@"NeXT plain ascii pasteboard type"]) continue; // skip this ancient type that gets auto-supplied by some system conversion - String str = MIMETypeFromCocoaType(pbType); - if (!result.contains(str)) - result.add(str); + addHTMLClipboardTypesForCocoaType(result, pbType, m_pasteboard.get()); } + return result; } @@ -283,7 +303,7 @@ PassRefPtr<FileList> ClipboardMac::files() const if (policy() != ClipboardReadable) return FileList::create(); - NSArray *absoluteURLs = absoluteURLsFromPasteboard(m_pasteboard.get()); + NSArray *absoluteURLs = absoluteURLsFromPasteboardFilenames(m_pasteboard.get()); NSUInteger count = [absoluteURLs count]; RefPtr<FileList> fileList = FileList::create(); @@ -355,12 +375,14 @@ void ClipboardMac::writeURL(const KURL& url, const String& title, Frame* frame) Pasteboard::writeURL(m_pasteboard.get(), nil, url, title, frame); } +#if ENABLE(DRAG_SUPPORT) void ClipboardMac::declareAndWriteDragImage(Element* element, const KURL& url, const String& title, Frame* frame) { ASSERT(frame); if (Page* page = frame->page()) page->dragController()->client()->declareAndWriteDragImage(m_pasteboard.get(), kit(element), url, title, frame); } +#endif // ENABLE(DRAG_SUPPORT) DragImageRef ClipboardMac::createDragImage(IntPoint& loc) const { diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuItemMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuItemMac.mm index c5e2942c5..48da7860f 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuItemMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuItemMac.mm @@ -26,6 +26,8 @@ #include "config.h" #include "ContextMenuItem.h" +#if ENABLE(CONTEXT_MENUS) + #include "ContextMenu.h" namespace WebCore { @@ -152,4 +154,6 @@ bool ContextMenuItem::enabled() const return [m_platformDescription.get() isEnabled]; } -} +} // namespace WebCore + +#endif // ENABLE(CONTEXT_MENUS) diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuMac.mm index b56d0b9eb..8ced8cb52 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/ContextMenuMac.mm @@ -26,6 +26,8 @@ #include "config.h" #include "ContextMenu.h" +#if ENABLE(CONTEXT_MENUS) + #include "ContextMenuController.h" @interface WebCoreMenuTarget : NSObject { @@ -151,4 +153,6 @@ NSMutableArray* ContextMenu::releasePlatformDescription() return m_platformDescription.releaseRef(); } -} +} // namespace WebCore + +#endif // ENABLE(CONTEXT_MENUS) diff --git a/src/3rdparty/webkit/WebCore/platform/mac/CookieJar.mm b/src/3rdparty/webkit/WebCore/platform/mac/CookieJar.mm index d8df60190..e1d3e5aaa 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/CookieJar.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/CookieJar.mm @@ -27,6 +27,7 @@ #import "CookieJar.h" #import "BlockExceptions.h" +#import "Cookie.h" #import "Document.h" #import "KURL.h" #import <wtf/RetainPtr.h> @@ -116,4 +117,52 @@ bool cookiesEnabled(const Document*) return false; } +bool getRawCookies(const Document*, const KURL& url, Vector<Cookie>& rawCookies) +{ + rawCookies.clear(); + BEGIN_BLOCK_OBJC_EXCEPTIONS; + + NSURL *cookieURL = url; + NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:cookieURL]; + + NSUInteger count = [cookies count]; + rawCookies.reserveCapacity(count); + for (NSUInteger i = 0; i < count; ++i) { + NSHTTPCookie *cookie = (NSHTTPCookie *)[cookies objectAtIndex:i]; + NSString *name = [cookie name]; + NSString *value = [cookie value]; + NSString *domain = [cookie domain]; + NSString *path = [cookie path]; + NSTimeInterval expires = [[cookie expiresDate] timeIntervalSince1970] * 1000; + bool httpOnly = [cookie isHTTPOnly]; + bool secure = [cookie isSecure]; + bool session = [cookie isSessionOnly]; + rawCookies.uncheckedAppend(Cookie(name, value, domain, path, expires, httpOnly, secure, session)); + } + + END_BLOCK_OBJC_EXCEPTIONS; + return true; +} + +void deleteCookie(const Document*, const KURL& url, const String& cookieName) +{ + BEGIN_BLOCK_OBJC_EXCEPTIONS; + + NSURL *cookieURL = url; + NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; + NSArray *cookies = [cookieStorage cookiesForURL:cookieURL]; + NSString *cookieNameString = (NSString *) cookieName; + + NSUInteger count = [cookies count]; + for (NSUInteger i = 0; i < count; ++i) { + NSHTTPCookie *cookie = (NSHTTPCookie *)[cookies objectAtIndex:i]; + if ([[cookie name] isEqualToString:cookieNameString]) { + [cookieStorage deleteCookie:cookie]; + break; + } + } + + END_BLOCK_OBJC_EXCEPTIONS; +} + } diff --git a/src/3rdparty/webkit/WebCore/platform/mac/DragDataMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/DragDataMac.mm index a7b751c0f..02a6af736 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/DragDataMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/DragDataMac.mm @@ -26,6 +26,7 @@ #import "config.h" #import "DragData.h" +#if ENABLE(DRAG_SUPPORT) #import "ClipboardMac.h" #import "ClipboardAccessPolicy.h" #import "Document.h" @@ -127,5 +128,6 @@ PassRefPtr<DocumentFragment> DragData::asFragment(Document*) const return core(m_pasteboardHelper->fragmentFromPasteboard([m_platformDragData draggingPasteboard])); } -} +} // namespace WebCore +#endif // ENABLE(DRAG_SUPPORT) diff --git a/src/3rdparty/webkit/WebCore/platform/mac/DragImageMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/DragImageMac.mm index 842e6d405..7b5101880 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/DragImageMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/DragImageMac.mm @@ -26,6 +26,7 @@ #import "config.h" #import "DragImage.h" +#if ENABLE(DRAG_SUPPORT) #import "CachedImage.h" #import "Image.h" #import "KURL.h" @@ -98,4 +99,6 @@ RetainPtr<NSImage> createDragImageIconForCachedImage(CachedImage* image) return [[NSWorkspace sharedWorkspace] iconForFileType:extension]; } -} +} // namespace WebCore + +#endif // ENABLE(DRAG_SUPPORT) diff --git a/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.h b/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.h index d0342e7a6..4beefca63 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.h +++ b/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.h @@ -45,7 +45,7 @@ namespace WebCore { class GeolocationServiceMac : public GeolocationService { public: - GeolocationServiceMac(GeolocationServiceClient*); + static GeolocationService* create(GeolocationServiceClient*); virtual ~GeolocationServiceMac(); virtual bool startUpdating(PositionOptions*); @@ -61,6 +61,8 @@ public: void errorOccurred(PassRefPtr<PositionError>); private: + GeolocationServiceMac(GeolocationServiceClient*); + RetainPtr<CLLocationManager> m_locationManager; RetainPtr<WebCoreCoreLocationObserver> m_objcObserver; diff --git a/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.mm index 01eca4a62..1093e6955 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/GeolocationServiceMac.mm @@ -65,11 +65,13 @@ using namespace WebCore; namespace WebCore { -GeolocationService* GeolocationService::create(GeolocationServiceClient* client) +GeolocationService* GeolocationServiceMac::create(GeolocationServiceClient* client) { return new GeolocationServiceMac(client); } +GeolocationService::FactoryFunction* GeolocationService::s_factoryFunction = &GeolocationServiceMac::create; + GeolocationServiceMac::GeolocationServiceMac(GeolocationServiceClient* client) : GeolocationService(client) , m_objcObserver(AdoptNS, [[WebCoreCoreLocationObserver alloc] initWithCallback:this]) diff --git a/src/3rdparty/webkit/WebCore/platform/mac/LocalizedStringsMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/LocalizedStringsMac.mm index fdd7df5dd..261347f0a 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/LocalizedStringsMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/LocalizedStringsMac.mm @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2003, 2006, 2009 Apple Computer, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -89,6 +89,7 @@ String copyImageUnknownFileLabel() return String(); } +#if ENABLE(CONTEXT_MENUS) String contextMenuItemTagOpenLinkInNewWindow() { BEGIN_BLOCK_OBJC_EXCEPTIONS; @@ -544,6 +545,7 @@ String contextMenuItemTagInspectElement() END_BLOCK_OBJC_EXCEPTIONS; return String(); } +#endif // ENABLE(CONTEXT_MENUS) String searchMenuNoRecentSearchesText() { @@ -625,6 +627,14 @@ String AXDefinitionListDefinitionText() return String(); } +String AXARIAContentGroupText(const String& ariaType) +{ + BEGIN_BLOCK_OBJC_EXCEPTIONS; + return [[WebCoreViewFactory sharedFactory] AXARIAContentGroupText:ariaType]; + END_BLOCK_OBJC_EXCEPTIONS; + return String(); +} + String AXButtonActionVerb() { BEGIN_BLOCK_OBJC_EXCEPTIONS; @@ -713,4 +723,29 @@ String mediaElementLiveBroadcastStateText() return String(); } +String localizedMediaControlElementString(const String& controlName) +{ + BEGIN_BLOCK_OBJC_EXCEPTIONS; + return [[WebCoreViewFactory sharedFactory] localizedMediaControlElementString:controlName]; + END_BLOCK_OBJC_EXCEPTIONS; + return String(); +} + +String localizedMediaControlElementHelpText(const String& controlName) +{ + BEGIN_BLOCK_OBJC_EXCEPTIONS; + return [[WebCoreViewFactory sharedFactory] localizedMediaControlElementHelpText:controlName]; + END_BLOCK_OBJC_EXCEPTIONS; + return String(); +} + +String localizedMediaTimeDescription(float time) +{ + BEGIN_BLOCK_OBJC_EXCEPTIONS; + return [[WebCoreViewFactory sharedFactory] localizedMediaTimeDescription:time]; + END_BLOCK_OBJC_EXCEPTIONS; + return String(); +} + + } diff --git a/src/3rdparty/webkit/WebCore/platform/mac/PasteboardMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/PasteboardMac.mm index c0e43b3cf..f048791d6 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/PasteboardMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/PasteboardMac.mm @@ -135,8 +135,8 @@ static NSAttributedString *stripAttachmentCharacters(NSAttributedString *string) void Pasteboard::writeSelection(NSPasteboard* pasteboard, Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame) { - if (WebArchivePboardType == nil) - Pasteboard::generalPasteboard(); //Initialises pasteboard types + if (!WebArchivePboardType) + Pasteboard::generalPasteboard(); // Initialises pasteboard types ASSERT(selectedRange); NSAttributedString *attributedString = [[[NSAttributedString alloc] _initWithDOMRange:kit(selectedRange)] autorelease]; @@ -203,12 +203,24 @@ void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Pasteboard::writeSelection(m_pasteboard.get(), selectedRange, canSmartCopyOrDelete, frame); } +void Pasteboard::writePlainText(const String& text) +{ + if (!WebArchivePboardType) + Pasteboard::generalPasteboard(); // Initialises pasteboard types + + NSArray *types = [NSArray arrayWithObject:NSStringPboardType]; + NSPasteboard *pasteboard = m_pasteboard.get(); + [pasteboard declareTypes:types owner:nil]; + + [pasteboard setString:text forType:NSStringPboardType]; +} + void Pasteboard::writeURL(NSPasteboard* pasteboard, NSArray* types, const KURL& url, const String& titleStr, Frame* frame) { - if (WebArchivePboardType == nil) - Pasteboard::generalPasteboard(); //Initialises pasteboard types + if (!WebArchivePboardType) + Pasteboard::generalPasteboard(); // Initialises pasteboard types - if (types == nil) { + if (!types) { types = writableTypesForURL(); [pasteboard declareTypes:types owner:nil]; } @@ -279,7 +291,7 @@ void Pasteboard::writeImage(Node* node, const KURL& url, const String& title) ASSERT(node->renderer() && node->renderer()->isImage()); RenderImage* renderer = toRenderImage(node->renderer()); - CachedImage* cachedImage = static_cast<CachedImage*>(renderer->cachedImage()); + CachedImage* cachedImage = renderer->cachedImage(); ASSERT(cachedImage); if (cachedImage->errorOccurred()) diff --git a/src/3rdparty/webkit/WebCore/platform/mac/PopupMenuMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/PopupMenuMac.mm index 23324d378..dfb0fff8e 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/PopupMenuMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/PopupMenuMac.mm @@ -91,6 +91,7 @@ void PopupMenu::populate() NSMenuItem* menuItem = [m_popup.get() lastItem]; [menuItem setAttributedTitle:string]; [menuItem setEnabled:client()->itemIsEnabled(i)]; + [menuItem setToolTip:client()->itemToolTip(i)]; [string release]; } } @@ -104,7 +105,7 @@ void PopupMenu::show(const IntRect& r, FrameView* v, int index) int numItems = [m_popup.get() numberOfItems]; if (numItems <= 0) { if (client()) - client()->hidePopup(); + client()->popupDidHide(); return; } ASSERT(numItems > index); @@ -161,7 +162,7 @@ void PopupMenu::show(const IntRect& r, FrameView* v, int index) if (client()) { int newIndex = [m_popup.get() indexOfSelectedItem]; - client()->hidePopup(); + client()->popupDidHide(); // Adjust newIndex for hidden first item. if (!client()->shouldPopOver()) diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ScrollViewMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ScrollViewMac.mm index 5ff0ff5c7..202d49e2b 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/ScrollViewMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/ScrollViewMac.mm @@ -163,26 +163,12 @@ bool ScrollView::platformScroll(ScrollDirection, ScrollGranularity) void ScrollView::platformRepaintContentRectangle(const IntRect& rect, bool now) { BEGIN_BLOCK_OBJC_EXCEPTIONS; - NSView *view = documentView(); - NSRect visibleRect = visibleContentRect(); - - // FIXME: I don't think this intersection is necessary any more now that - // selection doesn't call this method directly (but has to go through FrameView's - // repaintContentRectangle, which does the intersection test also). Leaving it in - // for now until I'm sure. - // Checking for rect visibility is an important optimization for the case of - // Select All of a large document. AppKit does not do this check, and so ends - // up building a large complicated NSRegion if we don't perform the check. - NSRect dirtyRect = NSIntersectionRect(rect, visibleRect); - if (!NSIsEmptyRect(dirtyRect)) { - [view setNeedsDisplayInRect:dirtyRect]; - if (now) { - [[view window] displayIfNeeded]; - [[view window] flushWindowIfNeeded]; - } + [view setNeedsDisplayInRect:rect]; + if (now) { + [[view window] displayIfNeeded]; + [[view window] flushWindowIfNeeded]; } - END_BLOCK_OBJC_EXCEPTIONS; } diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ScrollbarThemeMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ScrollbarThemeMac.mm index 759a6e1e6..0a20e2f89 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/ScrollbarThemeMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/ScrollbarThemeMac.mm @@ -391,7 +391,7 @@ bool ScrollbarThemeMac::paint(Scrollbar* scrollbar, GraphicsContext* context, co bufferRect.intersect(damageRect); bufferRect.move(-scrollbar->frameRect().x(), -scrollbar->frameRect().y()); - OwnPtr<ImageBuffer> imageBuffer = ImageBuffer::create(bufferRect.size(), false); + OwnPtr<ImageBuffer> imageBuffer = ImageBuffer::create(bufferRect.size()); if (!imageBuffer) return true; diff --git a/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm b/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm index e7e12ac83..fd2f94473 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/ThemeMac.mm @@ -311,6 +311,14 @@ static const IntSize* buttonSizes() return sizes; } +#if ENABLE(DATALIST) +static const IntSize* listButtonSizes() +{ + static const IntSize sizes[3] = { IntSize(21, 21), IntSize(19, 18), IntSize(17, 16) }; + return sizes; +} +#endif + static const int* buttonMargins(NSControlSize controlSize) { static const int margins[3][4] = @@ -333,6 +341,13 @@ static NSButtonCell* button(ControlPart part, ControlStates states, const IntRec } // Set the control size based off the rectangle we're painting into. + const IntSize* sizes = buttonSizes(); +#if ENABLE(DATALIST) + if (part == ListButtonPart) { + [buttonCell setBezelStyle:NSRoundedDisclosureBezelStyle]; + sizes = listButtonSizes(); + } else +#endif if (part == SquareButtonPart || zoomedRect.height() > buttonSizes()[NSRegularControlSize].height() * zoomFactor) { // Use the square button if ([buttonCell bezelStyle] != NSShadowlessSquareBezelStyle) @@ -362,7 +377,11 @@ static void paintButton(ControlPart part, ControlStates states, GraphicsContext* LocalCurrentGraphicsContext localContext(context); NSControlSize controlSize = [buttonCell controlSize]; +#if ENABLE(DATALIST) + IntSize zoomedSize = (part == ListButtonPart ? listButtonSizes() : buttonSizes())[controlSize]; +#else IntSize zoomedSize = buttonSizes()[controlSize]; +#endif zoomedSize.setWidth(zoomedRect.width()); // Buttons don't ever constrain width, so the zoomed width can just be honored. zoomedSize.setHeight(zoomedSize.height() * zoomFactor); IntRect inflatedRect = zoomedRect; @@ -442,6 +461,10 @@ LengthSize ThemeMac::controlSize(ControlPart part, const Font& font, const Lengt case PushButtonPart: // Height is reset to auto so that specified heights can be ignored. return sizeFromFont(font, LengthSize(zoomedSize.width(), Length()), zoomFactor, buttonSizes()); +#if ENABLE(DATALIST) + case ListButtonPart: + return sizeFromFont(font, LengthSize(zoomedSize.width(), Length()), zoomFactor, listButtonSizes()); +#endif default: return zoomedSize; } @@ -453,6 +476,7 @@ LengthSize ThemeMac::minimumControlSize(ControlPart part, const Font& font, floa case SquareButtonPart: case DefaultButtonPart: case ButtonPart: + case ListButtonPart: return LengthSize(Length(0, Fixed), Length(static_cast<int>(15 * zoomFactor), Fixed)); default: return Theme::minimumControlSize(part, font, zoomFactor); @@ -465,6 +489,7 @@ LengthBox ThemeMac::controlBorder(ControlPart part, const Font& font, const Leng case SquareButtonPart: case DefaultButtonPart: case ButtonPart: + case ListButtonPart: return LengthBox(0, zoomedBox.right().value(), 0, zoomedBox.left().value()); default: return Theme::controlBorder(part, font, zoomedBox, zoomFactor); @@ -548,6 +573,7 @@ void ThemeMac::paint(ControlPart part, ControlStates states, GraphicsContext* co case DefaultButtonPart: case ButtonPart: case SquareButtonPart: + case ListButtonPart: paintButton(part, states, context, zoomedRect, zoomFactor, scrollView); break; default: diff --git a/src/3rdparty/webkit/WebCore/platform/mac/WebCoreNSStringExtras.mm b/src/3rdparty/webkit/WebCore/platform/mac/WebCoreNSStringExtras.mm index b7087f154..d6c3f0c62 100644 --- a/src/3rdparty/webkit/WebCore/platform/mac/WebCoreNSStringExtras.mm +++ b/src/3rdparty/webkit/WebCore/platform/mac/WebCoreNSStringExtras.mm @@ -29,6 +29,8 @@ #import "config.h" #import "WebCoreNSStringExtras.h" +#import <wtf/RetainPtr.h> + BOOL stringIsCaseInsensitiveEqualToString(NSString *first, NSString *second) { return [first compare:second options:(NSCaseInsensitiveSearch|NSLiteralSearch)] == NSOrderedSame; @@ -69,50 +71,41 @@ NSString *filenameByFixingIllegalCharacters(NSString *string) CFStringEncoding stringEncodingForResource(Handle resource) { short resRef = HomeResFile(resource); - if (ResError() != noErr) { + if (ResError() != noErr) return NSMacOSRomanStringEncoding; - } // Get the FSRef for the current resource file FSRef fref; OSStatus error = FSGetForkCBInfo(resRef, 0, NULL, NULL, NULL, &fref, NULL); - if (error != noErr) { + if (error != noErr) return NSMacOSRomanStringEncoding; - } - CFURLRef URL = CFURLCreateFromFSRef(NULL, &fref); - if (URL == NULL) { + RetainPtr<CFURLRef> url(AdoptCF, CFURLCreateFromFSRef(NULL, &fref)); + if (!url) return NSMacOSRomanStringEncoding; - } - - NSString *path = [(NSURL *)URL path]; - CFRelease(URL); - + + NSString *path = [(NSURL *)url.get() path]; + // Get the lproj directory name path = [path stringByDeletingLastPathComponent]; - if (!stringIsCaseInsensitiveEqualToString([path pathExtension], @"lproj")) { + if (!stringIsCaseInsensitiveEqualToString([path pathExtension], @"lproj")) return NSMacOSRomanStringEncoding; - } NSString *directoryName = [[path stringByDeletingPathExtension] lastPathComponent]; - CFStringRef locale = CFLocaleCreateCanonicalLocaleIdentifierFromString(NULL, (CFStringRef)directoryName); - if (locale == NULL) { + RetainPtr<CFStringRef> locale(AdoptCF, CFLocaleCreateCanonicalLocaleIdentifierFromString(NULL, (CFStringRef)directoryName)); + if (!locale) return NSMacOSRomanStringEncoding; - } - + LangCode lang; RegionCode region; - error = LocaleStringToLangAndRegionCodes([(NSString *)locale UTF8String], &lang, ®ion); - CFRelease(locale); - if (error != noErr) { + error = LocaleStringToLangAndRegionCodes([(NSString *)locale.get() UTF8String], &lang, ®ion); + if (error != noErr) return NSMacOSRomanStringEncoding; - } - + TextEncoding encoding; error = UpgradeScriptInfoToTextEncoding(kTextScriptDontCare, lang, region, NULL, &encoding); - if (error != noErr) { + if (error != noErr) return NSMacOSRomanStringEncoding; - } return encoding; } diff --git a/src/3rdparty/webkit/WebCore/platform/mock/GeolocationServiceMock.cpp b/src/3rdparty/webkit/WebCore/platform/mock/GeolocationServiceMock.cpp new file mode 100644 index 000000000..f1871047c --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/mock/GeolocationServiceMock.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "GeolocationServiceMock.h" + +#include "Logging.h" +#include "Geolocation.h" +#include "Geoposition.h" +#include "PositionError.h" +#include "PositionOptions.h" + +namespace WebCore { + +GeolocationServiceMock::GeolocationServiceSet* GeolocationServiceMock::s_instances = 0; +RefPtr<Geoposition>* GeolocationServiceMock::s_lastPosition; +RefPtr<PositionError>* GeolocationServiceMock::s_lastError; + +GeolocationService* GeolocationServiceMock::create(GeolocationServiceClient* client) +{ + initStatics(); + return new GeolocationServiceMock(client); +} + +GeolocationServiceMock::GeolocationServiceMock(GeolocationServiceClient* client) + : GeolocationService(client) + , m_timer(this, &GeolocationServiceMock::timerFired) + , m_isActive(false) +{ + s_instances->add(this); +} + +GeolocationServiceMock::~GeolocationServiceMock() +{ + GeolocationServiceSet::iterator iter = s_instances->find(this); + ASSERT(iter != s_instances->end()); + s_instances->remove(iter); + cleanUpStatics(); +} + +void GeolocationServiceMock::setPosition(PassRefPtr<Geoposition> position) +{ + initStatics(); + GeolocationService::useMock(); + *s_lastPosition = position; + *s_lastError = 0; + makeGeolocationCallbackFromAllInstances(); +} + +void GeolocationServiceMock::setError(PassRefPtr<PositionError> error) +{ + initStatics(); + GeolocationService::useMock(); + *s_lastError = error; + *s_lastPosition = 0; + makeGeolocationCallbackFromAllInstances(); +} + +bool GeolocationServiceMock::startUpdating(PositionOptions*) +{ + m_isActive = true; + m_timer.startOneShot(0); + return true; +} + +void GeolocationServiceMock::stopUpdating() +{ + m_isActive = false; +} + +void GeolocationServiceMock::timerFired(Timer<GeolocationServiceMock>* timer) +{ + ASSERT_UNUSED(timer, timer == &m_timer); + makeGeolocationCallback(); +} + +void GeolocationServiceMock::makeGeolocationCallbackFromAllInstances() +{ + GeolocationServiceSet::const_iterator end = s_instances->end(); + for (GeolocationServiceSet::const_iterator iter = s_instances->begin(); iter != end; ++iter) + (*iter)->makeGeolocationCallback(); +} + +void GeolocationServiceMock::makeGeolocationCallback() +{ + if (!m_isActive) + return; + + if (*s_lastPosition) + positionChanged(); + else if (*s_lastError) + errorOccurred(); +} + +void GeolocationServiceMock::initStatics() +{ + if (s_instances == 0) { + s_instances = new GeolocationServiceSet; + s_lastPosition = new RefPtr<Geoposition>; + s_lastError = new RefPtr<PositionError>; + } +} + +void GeolocationServiceMock::cleanUpStatics() +{ + if (s_instances->size() == 0) { + delete s_instances; + s_instances = 0; + delete s_lastPosition; + delete s_lastError; + } +} + +} // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/mock/GeolocationServiceMock.h b/src/3rdparty/webkit/WebCore/platform/mock/GeolocationServiceMock.h new file mode 100644 index 000000000..7d0279739 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/mock/GeolocationServiceMock.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 GeolocationServiceMock_h +#define GeolocationServiceMock_h + +#include "GeolocationService.h" +#include "Timer.h" +#include <wtf/HashSet.h> +#include <wtf/PassRefPtr.h> +#include <wtf/RefPtr.h> + +namespace WebCore { + +// This class provides a mock implementation of a GeolocationService for testing +// purposes. It allows the position or error that will be reported by this class +// to be set manually using the setPosition and setError methods. Objects of +// this class call back to their respective GeolocationServiceClient with the +// position or error every time either of these is updated. +class GeolocationServiceMock : public GeolocationService { + public: + static GeolocationService* create(GeolocationServiceClient*); + + GeolocationServiceMock(GeolocationServiceClient*); + virtual ~GeolocationServiceMock(); + + virtual bool startUpdating(PositionOptions*); + virtual void stopUpdating(); + + static void setPosition(PassRefPtr<Geoposition> position); + static void setError(PassRefPtr<PositionError> position); + + virtual Geoposition* lastPosition() const { return s_lastPosition->get(); } + virtual PositionError* lastError() const { return s_lastError->get(); } + + private: + static void makeGeolocationCallbackFromAllInstances(); + void makeGeolocationCallback(); + + void timerFired(Timer<GeolocationServiceMock>*); + + static void initStatics(); + static void cleanUpStatics(); + + typedef HashSet<GeolocationServiceMock*> GeolocationServiceSet; + static GeolocationServiceSet* s_instances; + + static RefPtr<Geoposition>* s_lastPosition; + static RefPtr<PositionError>* s_lastError; + + Timer<GeolocationServiceMock> m_timer; + + bool m_isActive; +}; + +} // namespace WebCore + +#endif // GeolocationServiceMock_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/Credential.cpp b/src/3rdparty/webkit/WebCore/platform/network/Credential.cpp index 474395935..f90574319 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/Credential.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/Credential.cpp @@ -32,6 +32,7 @@ namespace WebCore { Credential::Credential() : m_user("") , m_password("") + , m_persistence(CredentialPersistenceNone) { } @@ -43,6 +44,11 @@ Credential::Credential(const String& user, const String& password, CredentialPer , m_persistence(persistence) { } + +bool Credential::isEmpty() const +{ + return m_user.isEmpty() && m_password.isEmpty(); +} const String& Credential::user() const { diff --git a/src/3rdparty/webkit/WebCore/platform/network/Credential.h b/src/3rdparty/webkit/WebCore/platform/network/Credential.h index 4d8049045..0471fbca7 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/Credential.h +++ b/src/3rdparty/webkit/WebCore/platform/network/Credential.h @@ -41,6 +41,8 @@ public: Credential(); Credential(const String& user, const String& password, CredentialPersistence); + bool isEmpty() const; + const String& user() const; const String& password() const; bool hasPassword() const; diff --git a/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp new file mode 100644 index 000000000..ec7837264 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.cpp @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "CredentialStorage.h" + +#include "CString.h" +#include "Credential.h" +#include "KURL.h" +#include "ProtectionSpaceHash.h" +#include "StringHash.h" + +#include <wtf/StdLibExtras.h> + +namespace WebCore { + +typedef HashMap<ProtectionSpace, Credential> ProtectionSpaceToCredentialMap; +static ProtectionSpaceToCredentialMap& protectionSpaceToCredentialMap() +{ + DEFINE_STATIC_LOCAL(ProtectionSpaceToCredentialMap, map, ()); + return map; +} + +static HashSet<String>& originsWithCredentials() +{ + DEFINE_STATIC_LOCAL(HashSet<String>, set, ()); + return set; +} + +typedef HashMap<String, ProtectionSpace> PathToDefaultProtectionSpaceMap; +static PathToDefaultProtectionSpaceMap& pathToDefaultProtectionSpaceMap() +{ + DEFINE_STATIC_LOCAL(PathToDefaultProtectionSpaceMap, map, ()); + return map; +} + +static String originStringFromURL(const KURL& url) +{ + if (url.port()) + return url.protocol() + "://" + url.host() + String::format(":%i/", url.port()); + + return url.protocol() + "://" + url.host() + "/"; +} + +static String protectionSpaceMapKeyFromURL(const KURL& url) +{ + ASSERT(url.isValid()); + + // Remove the last path component that is not a directory to determine the subtree for which credentials will apply. + // We keep a leading slash, but remove a trailing one. + String directoryURL = url.string().substring(0, url.pathEnd()); + unsigned directoryURLPathStart = url.pathStart(); + ASSERT(directoryURL[directoryURLPathStart] == '/'); + if (directoryURL.length() > directoryURLPathStart + 1) { + int index = directoryURL.reverseFind('/'); + ASSERT(index > 0); + directoryURL = directoryURL.substring(0, (static_cast<unsigned>(index) != directoryURLPathStart) ? index : directoryURLPathStart + 1); + } + ASSERT(directoryURL.length() == directoryURLPathStart + 1 || directoryURL[directoryURL.length() - 1] != '/'); + + return directoryURL; +} + +void CredentialStorage::set(const Credential& credential, const ProtectionSpace& protectionSpace, const KURL& url) +{ + ASSERT(url.protocolInHTTPFamily()); + ASSERT(url.isValid()); + + protectionSpaceToCredentialMap().set(protectionSpace, credential); + originsWithCredentials().add(originStringFromURL(url)); + + ProtectionSpaceAuthenticationScheme scheme = protectionSpace.authenticationScheme(); + if (scheme == ProtectionSpaceAuthenticationSchemeHTTPBasic || scheme == ProtectionSpaceAuthenticationSchemeDefault) { + // The map can contain both a path and its subpath - while redundant, this makes lookups faster. + pathToDefaultProtectionSpaceMap().set(protectionSpaceMapKeyFromURL(url), protectionSpace); + } +} + +Credential CredentialStorage::get(const ProtectionSpace& protectionSpace) +{ + return protectionSpaceToCredentialMap().get(protectionSpace); +} + +static PathToDefaultProtectionSpaceMap::iterator findDefaultProtectionSpaceForURL(const KURL& url) +{ + ASSERT(url.protocolInHTTPFamily()); + ASSERT(url.isValid()); + + PathToDefaultProtectionSpaceMap& map = pathToDefaultProtectionSpaceMap(); + + // Don't spend time iterating the path for origins that don't have any credentials. + if (!originsWithCredentials().contains(originStringFromURL(url))) + return map.end(); + + String directoryURL = protectionSpaceMapKeyFromURL(url); + unsigned directoryURLPathStart = url.pathStart(); + while (true) { + PathToDefaultProtectionSpaceMap::iterator iter = map.find(directoryURL); + if (iter != map.end()) + return iter; + + if (directoryURL.length() == directoryURLPathStart + 1) // path is "/" already, cannot shorten it any more + return map.end(); + + int index = directoryURL.reverseFind('/', -2); + ASSERT(index > 0); + directoryURL = directoryURL.substring(0, (static_cast<unsigned>(index) == directoryURLPathStart) ? index + 1 : index); + ASSERT(directoryURL.length() > directoryURLPathStart); + ASSERT(directoryURL.length() == directoryURLPathStart + 1 || directoryURL[directoryURL.length() - 1] != '/'); + } +} + +bool CredentialStorage::set(const Credential& credential, const KURL& url) +{ + ASSERT(url.protocolInHTTPFamily()); + ASSERT(url.isValid()); + PathToDefaultProtectionSpaceMap::iterator iter = findDefaultProtectionSpaceForURL(url); + if (iter == pathToDefaultProtectionSpaceMap().end()) + return false; + ASSERT(originsWithCredentials().contains(originStringFromURL(url))); + protectionSpaceToCredentialMap().set(iter->second, credential); + return true; +} + +Credential CredentialStorage::get(const KURL& url) +{ + PathToDefaultProtectionSpaceMap::iterator iter = findDefaultProtectionSpaceForURL(url); + if (iter == pathToDefaultProtectionSpaceMap().end()) + return Credential(); + return protectionSpaceToCredentialMap().get(iter->second); +} + +} // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h new file mode 100644 index 000000000..5086f69f6 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/CredentialStorage.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 SessionCredentialStorage_h +#define SessionCredentialStorage_h + +namespace WebCore { + +class Credential; +class KURL; +class ProtectionSpace; + +class CredentialStorage { +public: + static void set(const Credential&, const ProtectionSpace&, const KURL&); + static Credential get(const ProtectionSpace&); + + // These methods work for authentication schemes that support sending credentials without waiting for a request. E.g., for HTTP Basic authentication scheme + // a client should assume that all paths at or deeper than the depth of a known protected resource share are within the same protection space. + static bool set(const Credential&, const KURL&); // Returns true if the URL corresponds to a known protection space, so credentials could be updated. + static Credential get(const KURL&); +}; + +} // namespace WebCore + +#endif // SessionCredentialStorage_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/FormDataBuilder.cpp b/src/3rdparty/webkit/WebCore/platform/network/FormDataBuilder.cpp index 27bdee319..04c75278c 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/FormDataBuilder.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/FormDataBuilder.cpp @@ -108,6 +108,34 @@ static inline void append(Vector<char>& buffer, const CString& string) buffer.append(string.data(), string.length()); } +static void appendQuotedString(Vector<char>& buffer, const CString& string) +{ + // Append a string as a quoted value, escaping quotes and line breaks. + // FIXME: Is it correct to use percent escaping here? Other browsers do not encode these characters yet, + // so we should test popular servers to find out if there is an encoding form they can handle. + unsigned length = string.length(); + for (unsigned i = 0; i < length; ++i) { + unsigned char c = string.data()[i]; + + switch (c) { + case 0x0a: + append(buffer, "%0A"); + break; + case 0x0d: + append(buffer, "%0D"); + break; + case '"': + append(buffer, "%22"); + break; + case '%': + append(buffer, "%25"); + break; + default: + append(buffer, c); + } + } +} + Vector<char> FormDataBuilder::generateUniqueBoundaryString() { Vector<char> boundary; @@ -161,8 +189,10 @@ void FormDataBuilder::beginMultiPartHeader(Vector<char>& buffer, const CString& { addBoundaryToMultiPartHeader(buffer, boundary); + // FIXME: This loses data irreversibly if the input name includes characters you can't encode + // in the website's character set. append(buffer, "Content-Disposition: form-data; name=\""); - append(buffer, name); + appendQuotedString(buffer, name); append(buffer, '"'); } @@ -179,12 +209,10 @@ void FormDataBuilder::addBoundaryToMultiPartHeader(Vector<char>& buffer, const C void FormDataBuilder::addFilenameToMultiPartHeader(Vector<char>& buffer, const TextEncoding& encoding, const String& filename) { - // FIXME: This won't work if the filename includes a " mark, - // or control characters like CR or LF. This also does strange - // things if the filename includes characters you can't encode + // FIXME: This loses data irreversibly if the filename includes characters you can't encode // in the website's character set. append(buffer, "; filename=\""); - append(buffer, encoding.encode(filename.characters(), filename.length(), QuestionMarksForUnencodables)); + appendQuotedString(buffer, encoding.encode(filename.characters(), filename.length(), QuestionMarksForUnencodables)); append(buffer, '"'); } diff --git a/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp b/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp index ff470a023..07c66e815 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/HTTPHeaderMap.cpp @@ -45,7 +45,7 @@ auto_ptr<CrossThreadHTTPHeaderMapData> HTTPHeaderMap::copyData() const HTTPHeaderMap::const_iterator end_it = end(); for (HTTPHeaderMap::const_iterator it = begin(); it != end_it; ++it) { - data->append(make_pair(it->first.string().copy(), it->second.copy())); + data->append(make_pair(it->first.string().crossThreadString(), it->second.crossThreadString())); } return data; } diff --git a/src/3rdparty/webkit/WebCore/platform/network/HTTPParsers.cpp b/src/3rdparty/webkit/WebCore/platform/network/HTTPParsers.cpp index e57401ec0..9202660df 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/HTTPParsers.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/HTTPParsers.cpp @@ -100,6 +100,13 @@ bool parseHTTPRefresh(const String& refresh, bool fromHttpEquivMeta, double& del if (refresh[urlEndPos] == quotationMark) break; } + + // https://bugs.webkit.org/show_bug.cgi?id=27868 + // Sometimes there is no closing quote for the end of the URL even though there was an opening quote. + // If we looped over the entire alleged URL string back to the opening quote, just go ahead and use everything + // after the opening quote instead. + if (urlEndPos == urlStartPos) + urlEndPos = len; } url = refresh.substring(urlStartPos, urlEndPos - urlStartPos).stripWhiteSpace(); diff --git a/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.cpp b/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.cpp index bd73558e5..d04bcbe81 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.cpp @@ -37,7 +37,11 @@ namespace WebCore { // combined with the semantics of the String(NSString*) constructor ProtectionSpace::ProtectionSpace() : m_host("") + , m_port(0) + , m_serverType(ProtectionSpaceServerHTTP) , m_realm("") + , m_authenticationScheme(ProtectionSpaceAuthenticationSchemeDefault) + , m_isHashTableDeletedValue(false) { } @@ -49,6 +53,7 @@ ProtectionSpace::ProtectionSpace(const String& host, int port, ProtectionSpaceSe , m_serverType(serverType) , m_realm(realm.length() ? realm : "") , m_authenticationScheme(authenticationScheme) + , m_isHashTableDeletedValue(false) { } diff --git a/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.h b/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.h index 9a73cff63..126b49995 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.h +++ b/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpace.h @@ -54,6 +54,10 @@ class ProtectionSpace { public: ProtectionSpace(); ProtectionSpace(const String& host, int port, ProtectionSpaceServerType, const String& realm, ProtectionSpaceAuthenticationScheme); + + // Hash table deleted values, which are only constructed and never copied or destroyed. + ProtectionSpace(WTF::HashTableDeletedValueType) : m_isHashTableDeletedValue(true) { } + bool isHashTableDeletedValue() const { return m_isHashTableDeletedValue; } const String& host() const; int port() const; @@ -70,10 +74,12 @@ private: ProtectionSpaceServerType m_serverType; String m_realm; ProtectionSpaceAuthenticationScheme m_authenticationScheme; + bool m_isHashTableDeletedValue; }; bool operator==(const ProtectionSpace& a, const ProtectionSpace& b); inline bool operator!=(const ProtectionSpace& a, const ProtectionSpace& b) { return !(a == b); } -} -#endif +} // namespace WebCore + +#endif // ProtectionSpace_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpaceHash.h b/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpaceHash.h new file mode 100644 index 000000000..6f68b5b8c --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/ProtectionSpaceHash.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2009 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 ProtectionSpaceHash_h +#define ProtectionSpaceHash_h + +#include "ProtectionSpace.h" + +namespace WebCore { + +struct ProtectionSpaceHash { + static unsigned hash(const ProtectionSpace& protectionSpace) + { + unsigned hashCodes[5] = { + protectionSpace.host().impl() ? protectionSpace.host().impl()->hash() : 0, + protectionSpace.port(), + protectionSpace.serverType(), + protectionSpace.realm().impl() ? protectionSpace.realm().impl()->hash() : 0, + protectionSpace.authenticationScheme() + }; + + return StringImpl::computeHash(reinterpret_cast<UChar*>(hashCodes), sizeof(hashCodes) / sizeof(UChar)); + } + + static bool equal(const ProtectionSpace& a, const ProtectionSpace& b) { return a == b; } + static const bool safeToCompareToEmptyOrDeleted = false; +}; + +} // namespace WebCore + +namespace WTF { + + // WebCore::ProtectionSpaceHash is the default hash for ProtectionSpace + template<> struct HashTraits<WebCore::ProtectionSpace> : GenericHashTraits<WebCore::ProtectionSpace> { + static const bool emptyValueIsZero = true; + static void constructDeletedValue(WebCore::ProtectionSpace& slot) { new (&slot) WebCore::ProtectionSpace(HashTableDeletedValue); } + static bool isDeletedValue(const WebCore::ProtectionSpace& slot) { return slot.isHashTableDeletedValue(); } + }; + + template<typename T> struct DefaultHash; + template<> struct DefaultHash<WebCore::ProtectionSpace> { + typedef WebCore::ProtectionSpaceHash Hash; + }; + +} // namespace WTF + + +#endif // ProtectionSpaceHash_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp index 370650f6a..97435bad5 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceErrorBase.cpp @@ -34,10 +34,10 @@ ResourceError ResourceErrorBase::copy() const lazyInit(); ResourceError errorCopy; - errorCopy.m_domain = m_domain.copy(); + errorCopy.m_domain = m_domain.crossThreadString(); errorCopy.m_errorCode = m_errorCode; - errorCopy.m_failingURL = m_failingURL.copy(); - errorCopy.m_localizedDescription = m_localizedDescription.copy(); + errorCopy.m_failingURL = m_failingURL.crossThreadString(); + errorCopy.m_localizedDescription = m_localizedDescription.crossThreadString(); errorCopy.m_isNull = m_isNull; errorCopy.m_isCancellation = m_isCancellation; return errorCopy; diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceHandle.h b/src/3rdparty/webkit/WebCore/platform/network/ResourceHandle.h index 4cb3561b8..a7dc9566b 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ResourceHandle.h +++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceHandle.h @@ -105,7 +105,7 @@ public: static PassRefPtr<ResourceHandle> create(const ResourceRequest&, ResourceHandleClient*, Frame*, bool defersLoading, bool shouldContentSniff, bool mightDownloadFromHandle = false); static void loadResourceSynchronously(const ResourceRequest&, StoredCredentials, ResourceError&, ResourceResponse&, Vector<char>& data, Frame* frame); - static bool willLoadFromCache(ResourceRequest&); + static bool willLoadFromCache(ResourceRequest&, Frame*); #if PLATFORM(MAC) static bool didSendBodyDataDelegateExists(); #endif diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceHandleInternal.h b/src/3rdparty/webkit/WebCore/platform/network/ResourceHandleInternal.h index 091a26b0d..1733deaa0 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ResourceHandleInternal.h +++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceHandleInternal.h @@ -150,6 +150,8 @@ namespace WebCore { String m_user; String m_pass; + Credential m_initialCredential; + int status; bool m_defersLoading; diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp index bfa3dc623..e0707d960 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.cpp @@ -62,7 +62,7 @@ auto_ptr<ResourceRequest> ResourceRequestBase::adopt(auto_ptr<CrossThreadResourc request->setResponseContentDispositionEncodingFallbackArray(encoding1, encoding2, encoding3); } request->setHTTPBody(data->m_httpBody); - request->setAllowHTTPCookies(data->m_allowHTTPCookies); + request->setAllowCookies(data->m_allowCookies); return request; } @@ -73,17 +73,17 @@ auto_ptr<CrossThreadResourceRequestData> ResourceRequestBase::copyData() const data->m_cachePolicy = cachePolicy(); data->m_timeoutInterval = timeoutInterval(); data->m_firstPartyForCookies = firstPartyForCookies().copy(); - data->m_httpMethod = httpMethod().copy(); + data->m_httpMethod = httpMethod().crossThreadString(); data->m_httpHeaders.adopt(httpHeaderFields().copyData()); data->m_responseContentDispositionEncodingFallbackArray.reserveInitialCapacity(m_responseContentDispositionEncodingFallbackArray.size()); size_t encodingArraySize = m_responseContentDispositionEncodingFallbackArray.size(); for (size_t index = 0; index < encodingArraySize; ++index) { - data->m_responseContentDispositionEncodingFallbackArray.append(m_responseContentDispositionEncodingFallbackArray[index].copy()); + data->m_responseContentDispositionEncodingFallbackArray.append(m_responseContentDispositionEncodingFallbackArray[index].crossThreadString()); } if (m_httpBody) data->m_httpBody = m_httpBody->deepCopy(); - data->m_allowHTTPCookies = m_allowHTTPCookies; + data->m_allowCookies = m_allowCookies; return data; } @@ -218,6 +218,26 @@ void ResourceRequestBase::setHTTPHeaderField(const AtomicString& name, const Str m_platformRequestUpdated = false; } +void ResourceRequestBase::clearHTTPReferrer() +{ + updateResourceRequest(); + + m_httpHeaderFields.remove("Referer"); + + if (url().protocolInHTTPFamily()) + m_platformRequestUpdated = false; +} + +void ResourceRequestBase::clearHTTPOrigin() +{ + updateResourceRequest(); + + m_httpHeaderFields.remove("Origin"); + + if (url().protocolInHTTPFamily()) + m_platformRequestUpdated = false; +} + void ResourceRequestBase::setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2, const String& encoding3) { updateResourceRequest(); @@ -251,18 +271,18 @@ void ResourceRequestBase::setHTTPBody(PassRefPtr<FormData> httpBody) m_platformRequestUpdated = false; } -bool ResourceRequestBase::allowHTTPCookies() const +bool ResourceRequestBase::allowCookies() const { updateResourceRequest(); - return m_allowHTTPCookies; + return m_allowCookies; } -void ResourceRequestBase::setAllowHTTPCookies(bool allowHTTPCookies) +void ResourceRequestBase::setAllowCookies(bool allowCookies) { updateResourceRequest(); - m_allowHTTPCookies = allowHTTPCookies; + m_allowCookies = allowCookies; if (url().protocolInHTTPFamily()) m_platformRequestUpdated = false; @@ -274,6 +294,9 @@ void ResourceRequestBase::addHTTPHeaderField(const AtomicString& name, const Str pair<HTTPHeaderMap::iterator, bool> result = m_httpHeaderFields.add(name, value); if (!result.second) result.first->second += "," + value; + + if (url().protocolInHTTPFamily()) + m_platformRequestUpdated = false; } void ResourceRequestBase::addHTTPHeaderFields(const HTTPHeaderMap& headerFields) @@ -300,7 +323,7 @@ bool equalIgnoringHeaderFields(const ResourceRequestBase& a, const ResourceReque if (a.httpMethod() != b.httpMethod()) return false; - if (a.allowHTTPCookies() != b.allowHTTPCookies()) + if (a.allowCookies() != b.allowCookies()) return false; FormData* formDataA = a.httpBody(); @@ -355,7 +378,7 @@ void ResourceRequestBase::updateResourceRequest() const m_resourceRequestUpdated = true; } -#if !PLATFORM(MAC) && !USE(CFNETWORK) +#if !PLATFORM(MAC) && !USE(CFNETWORK) && !USE(SOUP) && !PLATFORM(CHROMIUM) unsigned initializeMaximumHTTPConnectionCountPerHost() { // This is used by the loader to control the number of issued parallel load requests. diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.h b/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.h index 2d87d6e36..84a7bd0b7 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.h +++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceRequestBase.h @@ -88,11 +88,11 @@ namespace WebCore { String httpReferrer() const { return httpHeaderField("Referer"); } void setHTTPReferrer(const String& httpReferrer) { setHTTPHeaderField("Referer", httpReferrer); } - void clearHTTPReferrer() { m_httpHeaderFields.remove("Referer"); } + void clearHTTPReferrer(); String httpOrigin() const { return httpHeaderField("Origin"); } void setHTTPOrigin(const String& httpOrigin) { setHTTPHeaderField("Origin", httpOrigin); } - void clearHTTPOrigin() { m_httpHeaderFields.remove("Origin"); } + void clearHTTPOrigin(); String httpUserAgent() const { return httpHeaderField("User-Agent"); } void setHTTPUserAgent(const String& httpUserAgent) { setHTTPHeaderField("User-Agent", httpUserAgent); } @@ -105,8 +105,8 @@ namespace WebCore { FormData* httpBody() const; void setHTTPBody(PassRefPtr<FormData> httpBody); - bool allowHTTPCookies() const; - void setAllowHTTPCookies(bool allowHTTPCookies); + bool allowCookies() const; + void setAllowCookies(bool allowCookies); bool isConditional() const; @@ -129,7 +129,7 @@ namespace WebCore { , m_cachePolicy(policy) , m_timeoutInterval(unspecifiedTimeoutInterval) , m_httpMethod("GET") - , m_allowHTTPCookies(true) + , m_allowCookies(true) , m_resourceRequestUpdated(true) , m_platformRequestUpdated(false) , m_reportUploadProgress(false) @@ -148,7 +148,7 @@ namespace WebCore { HTTPHeaderMap m_httpHeaderFields; Vector<String> m_responseContentDispositionEncodingFallbackArray; RefPtr<FormData> m_httpBody; - bool m_allowHTTPCookies; + bool m_allowCookies; mutable bool m_resourceRequestUpdated; mutable bool m_platformRequestUpdated; bool m_reportUploadProgress; @@ -173,7 +173,7 @@ namespace WebCore { OwnPtr<CrossThreadHTTPHeaderMapData> m_httpHeaders; Vector<String> m_responseContentDispositionEncodingFallbackArray; RefPtr<FormData> m_httpBody; - bool m_allowHTTPCookies; + bool m_allowCookies; }; unsigned initializeMaximumHTTPConnectionCountPerHost(); diff --git a/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp index 7f8a4e2f5..fd442252f 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/ResourceResponseBase.cpp @@ -108,12 +108,12 @@ auto_ptr<CrossThreadResourceResponseData> ResourceResponseBase::copyData() const { auto_ptr<CrossThreadResourceResponseData> data(new CrossThreadResourceResponseData()); data->m_url = url().copy(); - data->m_mimeType = mimeType().copy(); + data->m_mimeType = mimeType().crossThreadString(); data->m_expectedContentLength = expectedContentLength(); - data->m_textEncodingName = textEncodingName().copy(); - data->m_suggestedFilename = suggestedFilename().copy(); + data->m_textEncodingName = textEncodingName().crossThreadString(); + data->m_suggestedFilename = suggestedFilename().crossThreadString(); data->m_httpStatusCode = httpStatusCode(); - data->m_httpStatusText = httpStatusText().copy(); + data->m_httpStatusText = httpStatusText().crossThreadString(); data->m_httpHeaders.adopt(httpHeaderFields().copyData()); data->m_lastModifiedDate = lastModifiedDate(); return data; diff --git a/src/3rdparty/webkit/WebCore/platform/network/SocketStreamErrorBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamErrorBase.cpp new file mode 100644 index 000000000..72fb44ce9 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamErrorBase.cpp @@ -0,0 +1,48 @@ +/* + * 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 "SocketStreamError.h" + +namespace WebCore { + +SocketStreamError SocketStreamErrorBase::copy() const +{ + SocketStreamError errorCopy; + errorCopy.m_errorCode = m_errorCode; + return errorCopy; +} + +bool SocketStreamErrorBase::compare(const SocketStreamError& a, const SocketStreamError& b) +{ + return a.errorCode() == b.errorCode(); +} + +} // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/network/SocketStreamErrorBase.h b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamErrorBase.h new file mode 100644 index 000000000..b7ca35bdc --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamErrorBase.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * 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 SocketStreamErrorBase_h +#define SocketStreamErrorBase_h + +namespace WebCore { + + class SocketStreamError; + + class SocketStreamErrorBase { + public: + // Makes a deep copy. Useful for when you need to use a SocketStreamError on another thread. + SocketStreamError copy() const; + + bool isNull() const { return m_isNull; } + + int errorCode() const { return m_errorCode; } + + static bool compare(const SocketStreamError&, const SocketStreamError&); + + protected: + SocketStreamErrorBase() + : m_errorCode(0) + , m_isNull(true) + { + } + + explicit SocketStreamErrorBase(int errorCode) + : m_errorCode(errorCode) + , m_isNull(false) + { + } + + int m_errorCode; + bool m_isNull; + }; + + inline bool operator==(const SocketStreamError& a, const SocketStreamError& b) { return SocketStreamErrorBase::compare(a, b); } + inline bool operator!=(const SocketStreamError& a, const SocketStreamError& b) { return !(a == b); } + +} // namespace WebCore + +#endif // SocketStreamErrorBase_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleBase.cpp b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleBase.cpp new file mode 100644 index 000000000..875c2485d --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleBase.cpp @@ -0,0 +1,106 @@ +/* + * 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 "SocketStreamHandleBase.h" + +#include "SocketStreamHandleClient.h" + +namespace WebCore { + +const unsigned int bufferSize = 100 * 1024 * 1024; + +SocketStreamHandleBase::SocketStreamHandleBase(const KURL& url, SocketStreamHandleClient* client) + : m_url(url) + , m_client(client) + , m_state(Connecting) +{ +} + +SocketStreamHandleBase::SocketStreamState SocketStreamHandleBase::state() const +{ + return m_state; +} + +bool SocketStreamHandleBase::send(const char* data, int length) +{ + if (m_state == Connecting) + return false; + if (!m_buffer.isEmpty()) { + if (m_buffer.size() + length > bufferSize) { + // FIXME: report error to indicate that buffer has no more space. + return false; + } + m_buffer.append(data, length); + return true; + } + int bytesWritten = 0; + if (m_state == Open) + bytesWritten = platformSend(data, length); + if (bytesWritten <= 0) + return false; + if (m_buffer.size() + length - bytesWritten > bufferSize) { + // FIXME: report error to indicate that buffer has no more space. + return false; + } + if (bytesWritten < length) + m_buffer.append(data + bytesWritten, length - bytesWritten); + return true; +} + +void SocketStreamHandleBase::close() +{ + platformClose(); + m_state = Closed; +} + +void SocketStreamHandleBase::setClient(SocketStreamHandleClient* client) +{ + ASSERT(!client || (!m_client && m_state == Connecting)); + m_client = client; +} + +bool SocketStreamHandleBase::sendPendingData() +{ + if (m_state != Open) + return false; + if (m_buffer.isEmpty()) + return false; + int bytesWritten = platformSend(m_buffer.data(), m_buffer.size()); + if (bytesWritten <= 0) + return false; + Vector<char> remainingData; + ASSERT(m_buffer.size() - bytesWritten <= bufferSize); + remainingData.append(m_buffer.data() + bytesWritten, m_buffer.size() - bytesWritten); + m_buffer.swap(remainingData); + return true; +} + +} // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleBase.h b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleBase.h new file mode 100644 index 000000000..fc011dda1 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleBase.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * 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 SocketStreamHandleBase_h +#define SocketStreamHandleBase_h + +#include "KURL.h" + +#include <wtf/Vector.h> + +namespace WebCore { + + class SocketStreamHandle; + class SocketStreamHandleClient; + + class SocketStreamHandleBase { + public: + enum SocketStreamState { Connecting, Open, Closed }; + virtual ~SocketStreamHandleBase() { } + SocketStreamState state() const; + + bool send(const char* data, int length); + void close(); + int bufferedAmount() const { return m_buffer.size(); } + + SocketStreamHandleClient* client() const { return m_client; } + void setClient(SocketStreamHandleClient*); + + protected: + SocketStreamHandleBase(const KURL&, SocketStreamHandleClient*); + + bool sendPendingData(); + virtual int platformSend(const char* data, int length) = 0; + virtual void platformClose() = 0; + + KURL m_url; + SocketStreamHandleClient* m_client; + Vector<char> m_buffer; + SocketStreamState m_state; + }; + +} // namespace WebCore + +#endif // SocketStreamHandleBase_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleClient.h b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleClient.h new file mode 100644 index 000000000..04c744e96 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/SocketStreamHandleClient.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * 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 SocketStreamHandleClient_h +#define SocketStreamHandleClient_h + +namespace WebCore { + + class AuthenticationChallenge; + class KURL; + class SocketStreamError; + class SocketStreamHandle; + + class SocketStreamHandleClient { + public: + virtual ~SocketStreamHandleClient() { } + + virtual void willOpenStream(SocketStreamHandle*, const KURL&) { } + virtual void willSendData(SocketStreamHandle*, const char* /*data*/, int /*length*/) { } + + virtual void didOpen(SocketStreamHandle*) { } + virtual void didClose(SocketStreamHandle*) { } + virtual void didReceiveData(SocketStreamHandle*, const char* /*data*/, int /*length*/) { } + + virtual void didFail(SocketStreamHandle*, const SocketStreamError&) { } + + virtual void didReceiveAuthenticationChallenge(SocketStreamHandle*, const AuthenticationChallenge&) { } + virtual void didCancelAuthenticationChallenge(SocketStreamHandle*, const AuthenticationChallenge&) { } + virtual void receivedCancellation(SocketStreamHandle*, const AuthenticationChallenge&) { } + }; + +} // namespace WebCore + +#endif // SocketStreamHandleClient_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/DnsPrefetchHelper.cpp b/src/3rdparty/webkit/WebCore/platform/network/qt/DnsPrefetchHelper.cpp new file mode 100644 index 000000000..e687976a1 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/DnsPrefetchHelper.cpp @@ -0,0 +1,35 @@ +/* + Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "config.h" +#include "DnsPrefetchHelper.h" + +#include "CString.h" + +namespace WebCore { +// this is called on mouse over a href and on page loading +void prefetchDNS(const String& hostname) +{ + if (QWebSettings::globalSettings()->testAttribute(QWebSettings::DnsPrefetchEnabled)) { + static DnsPrefetchHelper dnsPrefetchHelper; + dnsPrefetchHelper.lookup(QString(hostname)); + } +} + +} diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/DnsPrefetchHelper.h b/src/3rdparty/webkit/WebCore/platform/network/qt/DnsPrefetchHelper.h new file mode 100644 index 000000000..0d98fcb1e --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/DnsPrefetchHelper.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#ifndef DNSPREFETCHHELPER_H +#define DNSPREFETCHHELPER_H + +#include <QObject> +#include <QCache> +#include <QHostInfo> +#include <QSet> +#include <QString> +#include <QTime> +#include "qwebsettings.h" + +namespace WebCore { + + class DnsPrefetchHelper : public QObject { + Q_OBJECT + public: + DnsPrefetchHelper() : QObject(), currentLookups(0) {}; + + public slots: + void lookup(QString hostname) + { + if (hostname.isEmpty()) + return; // this actually happens + if (currentLookups >= 10) + return; // do not launch more than 10 lookups at the same time + + QTime* entryTime = lookupCache.object(hostname); + if (entryTime && entryTime->elapsed() > 300*1000) { + // delete knowledge about lookup if it is already 300 seconds old + lookupCache.remove(hostname); + } else if (!entryTime) { + // not in cache yet, can look it up + QTime *tmpTime = new QTime(); + *tmpTime = QTime::currentTime(); + lookupCache.insert(hostname, tmpTime); + currentLookups++; + QHostInfo::lookupHost(hostname, this, SLOT(lookedUp(QHostInfo))); + } + } + + void lookedUp(const QHostInfo&) + { + // we do not cache the result, we throw it away. + // we currently rely on the OS to cache the results. If it does not do that + // then at least the ISP nameserver did it. + currentLookups--; + } + + protected: + QCache<QString, QTime> lookupCache; // 100 entries + int currentLookups; + }; + + +} + +#endif // DNSPREFETCHHELPER_H diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp index 898e5f49c..1ac80f68f 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.cpp @@ -112,29 +112,18 @@ qint64 FormDataIODevice::writeData(const char*, qint64) return -1; } -void FormDataIODevice::setParent(QNetworkReply* reply) -{ - QIODevice::setParent(reply); - - connect(reply, SIGNAL(finished()), SLOT(slotFinished()), Qt::QueuedConnection); -} - bool FormDataIODevice::isSequential() const { return true; } -void FormDataIODevice::slotFinished() -{ - deleteLater(); -} - QNetworkReplyHandler::QNetworkReplyHandler(ResourceHandle* handle, LoadMode loadMode) : QObject(0) - , m_resourceHandle(handle) , m_reply(0) + , m_resourceHandle(handle) , m_redirected(false) , m_responseSent(false) + , m_responseDataSent(false) , m_loadMode(loadMode) , m_shouldStart(true) , m_shouldFinish(false) @@ -151,10 +140,14 @@ QNetworkReplyHandler::QNetworkReplyHandler(ResourceHandle* handle, LoadMode load m_method = QNetworkAccessManager::PostOperation; else if (r.httpMethod() == "PUT") m_method = QNetworkAccessManager::PutOperation; +#if QT_VERSION >= 0x040600 + else if (r.httpMethod() == "DELETE") + m_method = QNetworkAccessManager::DeleteOperation; +#endif else m_method = QNetworkAccessManager::UnknownOperation; - m_request = r.toNetworkRequest(); + m_request = r.toNetworkRequest(m_resourceHandle->getInternal()->m_frame); if (m_loadMode == LoadNormal) start(); @@ -186,8 +179,8 @@ void QNetworkReplyHandler::abort() QNetworkReply* reply = release(); reply->abort(); reply->deleteLater(); - deleteLater(); } + deleteLater(); } QNetworkReply* QNetworkReplyHandler::release() @@ -199,11 +192,25 @@ QNetworkReply* QNetworkReplyHandler::release() // posted meta call events that were the result of a signal emission // don't reach the slots in our instance. QCoreApplication::removePostedEvents(this, QEvent::MetaCall); + m_reply->setParent(0); m_reply = 0; } return reply; } +static bool ignoreHttpError(QNetworkReply* reply, bool receivedData) +{ + int httpStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + if (httpStatusCode == 401 || httpStatusCode == 407) + return true; + + if (receivedData && (httpStatusCode >= 400 && httpStatusCode < 600)) + return true; + + return false; +} + void QNetworkReplyHandler::finish() { m_shouldFinish = (m_loadMode != LoadNormal); @@ -220,23 +227,27 @@ void QNetworkReplyHandler::finish() m_reply = 0; return; } + QNetworkReply* oldReply = m_reply; + if (m_redirected) { resetState(); start(); - } else if (m_reply->error() != QNetworkReply::NoError - // a web page that returns 401/403/404 can still have content - && m_reply->error() != QNetworkReply::ContentOperationNotPermittedError - && m_reply->error() != QNetworkReply::ContentNotFoundError - && m_reply->error() != QNetworkReply::AuthenticationRequiredError - && m_reply->error() != QNetworkReply::ProxyAuthenticationRequiredError) { - QUrl url = m_reply->url(); - ResourceError error(url.host(), m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), - url.toString(), m_reply->errorString()); - client->didFail(m_resourceHandle, error); - } else { + } else if (!m_reply->error() || ignoreHttpError(m_reply, m_responseDataSent)) { client->didFinishLoading(m_resourceHandle); + } else { + QUrl url = m_reply->url(); + int httpStatusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + if (httpStatusCode) { + ResourceError error("HTTP", httpStatusCode, url.toString(), m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString()); + client->didFail(m_resourceHandle, error); + } else { + ResourceError error("QtNetwork", m_reply->error(), url.toString(), m_reply->errorString()); + client->didFail(m_resourceHandle, error); + } } + oldReply->deleteLater(); if (oldReply == m_reply) m_reply = 0; @@ -248,6 +259,9 @@ void QNetworkReplyHandler::sendResponseIfNeeded() if (m_shouldSendResponse) return; + if (m_reply->error() && !ignoreHttpError(m_reply, m_responseDataSent)) + return; + if (m_responseSent || !m_resourceHandle) return; m_responseSent = true; @@ -271,41 +285,34 @@ void QNetworkReplyHandler::sendResponseIfNeeded() } KURL url(m_reply->url()); - String suggestedFilename = filenameFromHTTPContentDisposition(QString::fromAscii(m_reply->rawHeader("Content-Disposition"))); - - if (suggestedFilename.isEmpty()) - suggestedFilename = url.lastPathComponent(); - ResourceResponse response(url, mimeType, m_reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(), - encoding, - suggestedFilename); + encoding, String()); - const bool isLocalFileReply = (m_reply->url().scheme() == QLatin1String("file")); - int statusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - if (!isLocalFileReply) { - response.setHTTPStatusCode(statusCode); - response.setHTTPStatusText(m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray().constData()); + if (url.isLocalFile()) { + client->didReceiveResponse(m_resourceHandle, response); + return; } - else if (m_reply->error() == QNetworkReply::ContentNotFoundError) - response.setHTTPStatusCode(404); + // The status code is equal to 0 for protocols not in the HTTP family. + int statusCode = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - /* Fill in the other fields - * For local file requests remove the content length and the last-modified - * headers as required by fast/dom/xmlhttprequest-get.xhtml - */ - foreach (QByteArray headerName, m_reply->rawHeaderList()) { + if (url.protocolInHTTPFamily()) { + String suggestedFilename = filenameFromHTTPContentDisposition(QString::fromAscii(m_reply->rawHeader("Content-Disposition"))); - if (isLocalFileReply - && (headerName == "Content-Length" || headerName == "Last-Modified")) - continue; + if (!suggestedFilename.isEmpty()) + response.setSuggestedFilename(suggestedFilename); + else + response.setSuggestedFilename(url.lastPathComponent()); - response.setHTTPHeaderField(QString::fromAscii(headerName), QString::fromAscii(m_reply->rawHeader(headerName))); - } + response.setHTTPStatusCode(statusCode); + response.setHTTPStatusText(m_reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toByteArray().constData()); - if (isLocalFileReply) - response.setHTTPHeaderField(QString::fromAscii("Cache-Control"), QString::fromAscii("no-cache")); + // Add remaining headers. + foreach (const QByteArray& headerName, m_reply->rawHeaderList()) { + response.setHTTPHeaderField(QString::fromAscii(headerName), QString::fromAscii(m_reply->rawHeader(headerName))); + } + } QUrl redirection = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (redirection.isValid()) { @@ -318,12 +325,17 @@ void QNetworkReplyHandler::sendResponseIfNeeded() newRequest.setHTTPMethod("GET"); } + // Should not set Referer after a redirect from a secure resource to non-secure one. + if (!newRequest.url().protocolIs("https") && protocolIs(newRequest.httpReferrer(), "https")) + newRequest.clearHTTPReferrer(); + client->willSendRequest(m_resourceHandle, newRequest, response); m_redirected = true; - m_request = newRequest.toNetworkRequest(); - } else { - client->didReceiveResponse(m_resourceHandle, response); + m_request = newRequest.toNetworkRequest(m_resourceHandle->getInternal()->m_frame); + return; } + + client->didReceiveResponse(m_resourceHandle, response); } void QNetworkReplyHandler::forwardData() @@ -347,8 +359,10 @@ void QNetworkReplyHandler::forwardData() if (!client) return; - if (!data.isEmpty()) + if (!data.isEmpty()) { + m_responseDataSent = true; client->didReceiveData(m_resourceHandle, data.constData(), data.length(), data.length() /*FixMe*/); + } } void QNetworkReplyHandler::start() @@ -387,6 +401,12 @@ void QNetworkReplyHandler::start() putDevice->setParent(m_reply); break; } +#if QT_VERSION >= 0x040600 + case QNetworkAccessManager::DeleteOperation: { + m_reply = manager->deleteResource(m_request); + break; + } +#endif case QNetworkAccessManager::UnknownOperation: { m_reply = 0; ResourceHandleClient* client = m_resourceHandle->client(); @@ -421,6 +441,7 @@ void QNetworkReplyHandler::resetState() { m_redirected = false; m_responseSent = false; + m_responseDataSent = false; m_shouldStart = true; m_shouldFinish = false; m_shouldSendResponse = false; diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h index f88ce8ab8..fccc4a698 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/QNetworkReplyHandler.h @@ -73,6 +73,7 @@ private: ResourceHandle* m_resourceHandle; bool m_redirected; bool m_responseSent; + bool m_responseDataSent; LoadMode m_loadMode; QNetworkAccessManager::Operation m_method; QNetworkRequest m_request; @@ -95,16 +96,12 @@ public: FormDataIODevice(FormData*); ~FormDataIODevice(); - void setParent(QNetworkReply*); bool isSequential() const; protected: qint64 readData(char*, qint64); qint64 writeData(const char*, qint64); -private Q_SLOTS: - void slotFinished(); - private: void moveToNextElement(); diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceHandleQt.cpp b/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceHandleQt.cpp index c5816a4ec..b3844bf94 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceHandleQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceHandleQt.cpp @@ -35,6 +35,7 @@ #include "ResourceHandleClient.h" #include "ResourceHandleInternal.h" #include "qwebpage_p.h" +#include "qwebframe_p.h" #include "ChromeClientQt.h" #include "FrameLoaderClientQt.h" #include "Page.h" @@ -42,6 +43,9 @@ #include "NotImplemented.h" +#if QT_VERSION >= 0x040500 +#include <QAbstractNetworkCache> +#endif #include <QCoreApplication> #include <QUrl> #if QT_VERSION >= 0x040400 @@ -73,11 +77,10 @@ private: ResourceResponse m_response; ResourceError m_error; Vector<char> m_data; - bool m_finished; + QEventLoop m_eventLoop; }; WebCoreSynchronousLoader::WebCoreSynchronousLoader() - : m_finished(false) { } @@ -93,19 +96,18 @@ void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data, void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*) { - m_finished = true; + m_eventLoop.exit(); } void WebCoreSynchronousLoader::didFail(ResourceHandle*, const ResourceError& error) { m_error = error; - m_finished = true; + m_eventLoop.exit(); } void WebCoreSynchronousLoader::waitForCompletion() { - while (!m_finished) - QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents); } ResourceHandleInternal::~ResourceHandleInternal() @@ -129,6 +131,15 @@ bool ResourceHandle::start(Frame* frame) if (!page) return false; + if (!(d->m_user.isEmpty() || d->m_pass.isEmpty())) { + // If credentials were specified for this request, add them to the url, + // so that they will be passed to QNetworkRequest. + KURL urlWithCredentials(d->m_request.url()); + urlWithCredentials.setUser(d->m_user); + urlWithCredentials.setPass(d->m_pass); + d->m_request.setURL(urlWithCredentials); + } + getInternal()->m_frame = static_cast<FrameLoaderClientQt*>(frame->loader()->client())->webFrame(); #if QT_VERSION < 0x040400 return QWebNetworkManager::self()->add(this, getInternal()->m_frame->page()->d->networkInterface); @@ -154,10 +165,28 @@ bool ResourceHandle::loadsBlocked() return false; } -bool ResourceHandle::willLoadFromCache(ResourceRequest& request) +bool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame* frame) { - notImplemented(); + if (!frame) + return false; + +#if QT_VERSION >= 0x040500 + QNetworkAccessManager* manager = QWebFramePrivate::kit(frame)->page()->networkAccessManager(); + QAbstractNetworkCache* cache = manager->cache(); + + if (!cache) + return false; + + QNetworkCacheMetaData data = cache->metaData(request.url()); + if (data.isValid()) { + request.setCachePolicy(ReturnCacheDataDontLoad); + return true; + } + return false; +#else + return false; +#endif } bool ResourceHandle::supportsBufferedData() @@ -184,6 +213,14 @@ void ResourceHandle::loadResourceSynchronously(const ResourceRequest& request, S } #else ResourceHandleInternal *d = handle.getInternal(); + if (!(d->m_user.isEmpty() || d->m_pass.isEmpty())) { + // If credentials were specified for this request, add them to the url, + // so that they will be passed to QNetworkRequest. + KURL urlWithCredentials(d->m_request.url()); + urlWithCredentials.setUser(d->m_user); + urlWithCredentials.setPass(d->m_pass); + d->m_request.setURL(urlWithCredentials); + } d->m_frame = static_cast<FrameLoaderClientQt*>(frame->loader()->client())->webFrame(); d->m_job = new QNetworkReplyHandler(&handle, QNetworkReplyHandler::LoadNormal); #endif diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequest.h b/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequest.h index af76f61f2..60d32dd0a 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequest.h +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequest.h @@ -31,6 +31,7 @@ QT_BEGIN_NAMESPACE class QNetworkRequest; +class QObject; QT_END_NAMESPACE namespace WebCore { @@ -38,7 +39,7 @@ namespace WebCore { struct ResourceRequest : ResourceRequestBase { ResourceRequest(const String& url) - : ResourceRequestBase(KURL(url), UseProtocolCachePolicy) + : ResourceRequestBase(KURL(ParsedURLString, url), UseProtocolCachePolicy) { } @@ -59,7 +60,7 @@ namespace WebCore { } #if QT_VERSION >= 0x040400 - QNetworkRequest toNetworkRequest() const; + QNetworkRequest toNetworkRequest(QObject* originatingObject) const; #endif private: diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequestQt.cpp b/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequestQt.cpp index c8f6ad598..a183c402d 100644 --- a/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequestQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceRequestQt.cpp @@ -28,17 +28,25 @@ namespace WebCore { -QNetworkRequest ResourceRequest::toNetworkRequest() const +QNetworkRequest ResourceRequest::toNetworkRequest(QObject* originatingFrame) const { QNetworkRequest request; request.setUrl(url()); +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + request.setOriginatingObject(originatingFrame); +#endif const HTTPHeaderMap &headers = httpHeaderFields(); for (HTTPHeaderMap::const_iterator it = headers.begin(), end = headers.end(); it != end; ++it) { QByteArray name = QString(it->first).toAscii(); QByteArray value = QString(it->second).toAscii(); - request.setRawHeader(name, value); + // QNetworkRequest::setRawHeader() would remove the header if the value is null + // Make sure to set an empty header instead of null header. + if (!value.isNull()) + request.setRawHeader(name, value); + else + request.setRawHeader(name, ""); } switch (cachePolicy()) { diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamError.h b/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamError.h new file mode 100644 index 000000000..f9641ad33 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamError.h @@ -0,0 +1,50 @@ +/* + * 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 SocketStreamError_h +#define SocketStreamError_h + +#include "SocketStreamErrorBase.h" + +namespace WebCore { + + class SocketStreamError : public SocketStreamErrorBase { + public: + SocketStreamError() { } + explicit SocketStreamError(int errorCode) + : SocketStreamErrorBase(errorCode) + { + } + + }; + +} // namespace WebCore + +#endif // SocketStreamError_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamHandle.h b/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamHandle.h new file mode 100644 index 000000000..64139e5cd --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamHandle.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2009 Apple Inc. All rights reserved. + * 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 SocketStreamHandle_h +#define SocketStreamHandle_h + +#include "SocketStreamHandleBase.h" + +#include <wtf/PassRefPtr.h> +#include <wtf/RefCounted.h> + +namespace WebCore { + + class AuthenticationChallenge; + class Credential; + class SocketStreamHandleClient; + + class SocketStreamHandle : public RefCounted<SocketStreamHandle>, public SocketStreamHandleBase { + public: + static PassRefPtr<SocketStreamHandle> create(const KURL& url, SocketStreamHandleClient* client) { return adoptRef(new SocketStreamHandle(url, client)); } + + virtual ~SocketStreamHandle(); + + protected: + virtual int platformSend(const char* data, int length); + virtual void platformClose(); + + private: + SocketStreamHandle(const KURL&, SocketStreamHandleClient*); + + // No authentication for streams per se, but proxy may ask for credentials. + void didReceiveAuthenticationChallenge(const AuthenticationChallenge&); + void receivedCredential(const AuthenticationChallenge&, const Credential&); + void receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&); + void receivedCancellation(const AuthenticationChallenge&); + }; + +} // namespace WebCore + +#endif // SocketStreamHandle_h diff --git a/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamHandleSoup.cpp b/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamHandleSoup.cpp new file mode 100644 index 000000000..6aa33fce2 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/network/qt/SocketStreamHandleSoup.cpp @@ -0,0 +1,88 @@ +/* + * 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 "SocketStreamHandle.h" + +#include "KURL.h" +#include "Logging.h" +#include "NotImplemented.h" +#include "SocketStreamHandleClient.h" + +namespace WebCore { + +SocketStreamHandle::SocketStreamHandle(const KURL& url, SocketStreamHandleClient* client) + : SocketStreamHandleBase(url, client) +{ + LOG(Network, "SocketStreamHandle %p new client %p", this, m_client); + notImplemented(); +} + +SocketStreamHandle::~SocketStreamHandle() +{ + LOG(Network, "SocketStreamHandle %p delete", this); + setClient(0); + notImplemented(); +} + +int SocketStreamHandle::platformSend(const char*, int) +{ + LOG(Network, "SocketStreamHandle %p platformSend", this); + notImplemented(); + return 0; +} + +void SocketStreamHandle::platformClose() +{ + LOG(Network, "SocketStreamHandle %p platformClose", this); + notImplemented(); +} + +void SocketStreamHandle::didReceiveAuthenticationChallenge(const AuthenticationChallenge&) +{ + notImplemented(); +} + +void SocketStreamHandle::receivedCredential(const AuthenticationChallenge&, const Credential&) +{ + notImplemented(); +} + +void SocketStreamHandle::receivedRequestToContinueWithoutCredential(const AuthenticationChallenge&) +{ + notImplemented(); +} + +void SocketStreamHandle::receivedCancellation(const AuthenticationChallenge&) +{ + notImplemented(); +} + +} // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp index 82b12a8cd..9d2c452ff 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/ClipboardQt.cpp @@ -229,7 +229,7 @@ static CachedImage* getCachedImage(Element* element) if (!renderer || !renderer->isImage()) return 0; - RenderImage* image = static_cast<RenderImage*>(renderer); + RenderImage* image = toRenderImage(renderer); if (image->cachedImage() && !image->cachedImage()->errorOccurred()) return image->cachedImage(); @@ -239,8 +239,6 @@ static CachedImage* getCachedImage(Element* element) void ClipboardQt::declareAndWriteDragImage(Element* element, const KURL& url, const String& title, Frame* frame) { ASSERT(frame); - Q_UNUSED(url); - Q_UNUSED(title); //WebCore::writeURL(m_writableDataObject.get(), url, title, true, false); if (!m_writableData) @@ -262,8 +260,10 @@ void ClipboardQt::declareAndWriteDragImage(Element* element, const KURL& url, co return; QList<QUrl> urls; + urls.append(url); urls.append(fullURL); + m_writableData->setText(title); m_writableData->setUrls(urls); #ifndef QT_NO_CLIPBOARD if (!isForDragging()) diff --git a/src/3rdparty/webkit/WebCore/platform/qt/ContextMenuQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/ContextMenuQt.cpp index 063a46b4f..9b1a0545a 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/ContextMenuQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/ContextMenuQt.cpp @@ -61,7 +61,7 @@ void ContextMenu::insertItem(unsigned position, ContextMenuItem& item) m_items.insert(position, item); } -void ContextMenu::setPlatformDescription(PlatformMenuDescription menu) +void ContextMenu::setPlatformDescription(PlatformMenuDescription) { // doesn't make sense } diff --git a/src/3rdparty/webkit/WebCore/platform/qt/CookieJarQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/CookieJarQt.cpp index 40d930919..a27a06e20 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/CookieJarQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/CookieJarQt.cpp @@ -28,6 +28,7 @@ #include "config.h" #include "CookieJar.h" +#include "Cookie.h" #include "Document.h" #include "KURL.h" #include "PlatformString.h" @@ -47,6 +48,8 @@ namespace WebCore { #if QT_VERSION >= 0x040400 static QNetworkCookieJar *cookieJar(const Document *document) { + if (!document) + return 0; Frame *frame = document->frame(); if (!frame) return 0; @@ -128,6 +131,18 @@ bool cookiesEnabled(const Document* document) #endif } +bool getRawCookies(const Document*, const KURL&, Vector<Cookie>& rawCookies) +{ + // FIXME: Not yet implemented + rawCookies.clear(); + return false; // return true when implemented +} + +void deleteCookie(const Document*, const KURL&, const String&) +{ + // FIXME: Not yet implemented +} + } // vim: ts=4 sw=4 et diff --git a/src/3rdparty/webkit/WebCore/platform/qt/CursorQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/CursorQt.cpp index aad84be12..3fc83f927 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/CursorQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/CursorQt.cpp @@ -2,7 +2,7 @@ * Copyright (C) 2006 Dirk Mueller <mueller@kde.org> * Copyright (C) 2006 George Staikos <staikos@kde.org> * Copyright (C) 2006 Charles Samuels <charles@kde.org> - * Copyright (C) 2008 Holger Hans Peter Freyther + * Copyright (C) 2008, 2009 Holger Hans Peter Freyther * * All rights reserved. * @@ -92,14 +92,14 @@ protected: , SplitVCursor(Qt::SplitVCursor) , NoDropCursor(Qt::ForbiddenCursor) , BlankCursor(Qt::BlankCursor) - , ZoomInCursor(QPixmap(QLatin1String(":/webkit/resources/zoomInCursor.png"))) - , ZoomOutCursor(QPixmap(QLatin1String(":/webkit/resources/zoomOutCursor.png"))) - , VerticalTextCursor(QPixmap(QLatin1String(":/webkit/resources/verticalTextCursor.png"))) - , CellCursor(QPixmap(QLatin1String(":/webkit/resources/cellCursor.png"))) - , ContextMenuCursor(QPixmap(QLatin1String(":/webkit/resources/contextMenuCursor.png"))) - , CopyCursor(QPixmap(QLatin1String(":/webkit/resources/copyCursor.png"))) - , ProgressCursor(QPixmap(QLatin1String(":/webkit/resources/progressCursor.png"))) - , AliasCursor(QPixmap(QLatin1String(":/webkit/resources/aliasCursor.png"))) + , ZoomInCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/zoomInCursor.png")), 7, 7)) + , ZoomOutCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/zoomOutCursor.png")), 7, 7)) + , VerticalTextCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/verticalTextCursor.png")), 7, 7)) + , CellCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/cellCursor.png")), 7, 7)) + , ContextMenuCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/contextMenuCursor.png")), 3, 2)) + , CopyCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/copyCursor.png")), 3, 2)) + , ProgressCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/progressCursor.png")), 3, 2)) + , AliasCursor(QCursor(QPixmap(QLatin1String(":/webkit/resources/aliasCursor.png")), 11, 3)) #endif { diff --git a/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp index 7b1eff8ce..b0611e61f 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/DragDataQt.cpp @@ -119,7 +119,7 @@ bool DragData::containsURL() const return m_platformDragData->hasUrls(); } -String DragData::asURL(String* title) const +String DragData::asURL(String*) const { if (!m_platformDragData) return String(); @@ -128,7 +128,7 @@ String DragData::asURL(String* title) const if (urls.isEmpty()) return String(); - return urls.first().toString(); + return encodeWithURLEscapeSequences(urls.first().toString()); } PassRefPtr<DocumentFragment> DragData::asFragment(Document* doc) const diff --git a/src/3rdparty/webkit/WebCore/platform/qt/FileSystemQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/FileSystemQt.cpp index 28d3ca7b4..4093fad4e 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/FileSystemQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/FileSystemQt.cpp @@ -81,7 +81,7 @@ bool makeAllDirectories(const String& path) String pathByAppendingComponent(const String& path, const String& component) { - return QDir(path).filePath(component); + return QDir::toNativeSeparators(QDir(path).filePath(component)); } String homeDirectoryPath() @@ -117,7 +117,9 @@ Vector<String> listDirectory(const String& path, const String& filter) CString openTemporaryFile(const char* prefix, PlatformFileHandle& handle) { - QFile *temp = new QTemporaryFile(QLatin1String(prefix)); + QTemporaryFile* tempFile = new QTemporaryFile(QLatin1String(prefix)); + tempFile->setAutoRemove(false); + QFile* temp = tempFile; if (temp->open(QIODevice::ReadWrite)) { handle = temp; return String(temp->fileName()).utf8(); diff --git a/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp b/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp index d1853fc5e..ca3ca9dff 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/Localizations.cpp @@ -33,6 +33,7 @@ #include "PlatformString.h" #include <QCoreApplication> +#include <QLocale> namespace WebCore { @@ -53,7 +54,8 @@ String resetButtonDefaultLabel() String defaultLanguage() { - return "en"; + QLocale locale; + return locale.name().replace("_", "-"); } String searchableIndexIntroduction() @@ -362,5 +364,111 @@ String mediaElementLiveBroadcastStateText() return QCoreApplication::translate("QWebPage", "Live Broadcast", "Media controller status message when watching a live broadcast"); } +#if ENABLE(VIDEO) + +String localizedMediaControlElementString(const String& name) +{ + if (name == "AudioElement") + return QCoreApplication::translate("QWebPage", "Audio Element", "Media controller element"); + if (name == "VideoElement") + return QCoreApplication::translate("QWebPage", "Video Element", "Media controller element"); + if (name == "MuteButton") + return QCoreApplication::translate("QWebPage", "Mute Button", "Media controller element"); + if (name == "UnMuteButton") + return QCoreApplication::translate("QWebPage", "Unmute Button", "Media controller element"); + if (name == "PlayButton") + return QCoreApplication::translate("QWebPage", "Play Button", "Media controller element"); + if (name == "PauseButton") + return QCoreApplication::translate("QWebPage", "Pause Button", "Media controller element"); + if (name == "Slider") + return QCoreApplication::translate("QWebPage", "Slider", "Media controller element"); + if (name == "SliderThumb") + return QCoreApplication::translate("QWebPage", "Slider Thumb", "Media controller element"); + if (name == "RewindButton") + return QCoreApplication::translate("QWebPage", "Rewind Button", "Media controller element"); + if (name == "ReturnToRealtimeButton") + return QCoreApplication::translate("QWebPage", "Return to Real-time Button", "Media controller element"); + if (name == "CurrentTimeDisplay") + return QCoreApplication::translate("QWebPage", "Elapsed Time", "Media controller element"); + if (name == "TimeRemainingDisplay") + return QCoreApplication::translate("QWebPage", "Remaining Time", "Media controller element"); + if (name == "StatusDisplay") + return QCoreApplication::translate("QWebPage", "Status Display", "Media controller element"); + if (name == "FullscreenButton") + return QCoreApplication::translate("QWebPage", "Fullscreen Button", "Media controller element"); + if (name == "SeekForwardButton") + return QCoreApplication::translate("QWebPage", "Seek Forward Button", "Media controller element"); + if (name == "SeekBackButton") + return QCoreApplication::translate("QWebPage", "Seek Back Button", "Media controller element"); + + return String(); +} + +String localizedMediaControlElementHelpText(const String& name) +{ + if (name == "AudioElement") + return QCoreApplication::translate("QWebPage", "Audio element playback controls and status display", "Media controller element"); + if (name == "VideoElement") + return QCoreApplication::translate("QWebPage", "Video element playback controls and status display", "Media controller element"); + if (name == "MuteButton") + return QCoreApplication::translate("QWebPage", "Mute audio tracks", "Media controller element"); + if (name == "UnMuteButton") + return QCoreApplication::translate("QWebPage", "Unmute audio tracks", "Media controller element"); + if (name == "PlayButton") + return QCoreApplication::translate("QWebPage", "Begin playback", "Media controller element"); + if (name == "PauseButton") + return QCoreApplication::translate("QWebPage", "Pause playback", "Media controller element"); + if (name == "Slider") + return QCoreApplication::translate("QWebPage", "Movie time scrubber", "Media controller element"); + if (name == "SliderThumb") + return QCoreApplication::translate("QWebPage", "Movie time scrubber thumb", "Media controller element"); + if (name == "RewindButton") + return QCoreApplication::translate("QWebPage", "Rewind movie", "Media controller element"); + if (name == "ReturnToRealtimeButton") + return QCoreApplication::translate("QWebPage", "Return streaming movie to real-time", "Media controller element"); + if (name == "CurrentTimeDisplay") + return QCoreApplication::translate("QWebPage", "Current movie time", "Media controller element"); + if (name == "TimeRemainingDisplay") + return QCoreApplication::translate("QWebPage", "Remaining movie time", "Media controller element"); + if (name == "StatusDisplay") + return QCoreApplication::translate("QWebPage", "Current movie status", "Media controller element"); + if (name == "FullscreenButton") + return QCoreApplication::translate("QWebPage", "Play movie in full-screen mode", "Media controller element"); + if (name == "SeekForwardButton") + return QCoreApplication::translate("QWebPage", "Seek quickly back", "Media controller element"); + if (name == "SeekBackButton") + return QCoreApplication::translate("QWebPage", "Seek quickly forward", "Media controller element"); + + ASSERT_NOT_REACHED(); + return String(); +} + +String localizedMediaTimeDescription(float time) +{ + if (!isfinite(time)) + return QCoreApplication::translate("QWebPage", "Indefinite time", "Media time description"); + + int seconds = (int)fabsf(time); + int days = seconds / (60 * 60 * 24); + int hours = seconds / (60 * 60); + int minutes = (seconds / 60) % 60; + seconds %= 60; + + if (days) { + return QCoreApplication::translate("QWebPage", "%1 days %2 hours %3 minutes %4 seconds", "Media time description").arg(days).arg(hours).arg(minutes).arg(seconds); + } + + if (hours) { + return QCoreApplication::translate("QWebPage", "%1 hours %2 minutes %3 seconds", "Media time description").arg(hours).arg(minutes).arg(seconds); + } + + if (minutes) { + return QCoreApplication::translate("QWebPage", "%1 minutes %2 seconds", "Media time description").arg(minutes).arg(seconds); + } + + return QCoreApplication::translate("QWebPage", "%1 seconds", "Media time description").arg(seconds); +} +#endif // ENABLE(VIDEO) + } // vim: ts=4 sw=4 et diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PasteboardQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PasteboardQt.cpp index 8a377ad70..209a5730a 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/PasteboardQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/PasteboardQt.cpp @@ -119,6 +119,18 @@ PassRefPtr<DocumentFragment> Pasteboard::documentFragment(Frame* frame, PassRefP return 0; } +void Pasteboard::writePlainText(const String& text) +{ +#ifndef QT_NO_CLIPBOARD + QMimeData* md = new QMimeData; + QString qtext = text; + qtext.replace(QChar(0xa0), QLatin1Char(' ')); + md->setText(qtext); + QApplication::clipboard()->setMimeData(md, m_selectionMode ? + QClipboard::Selection : QClipboard::Clipboard); +#endif +} + void Pasteboard::writeURL(const KURL& _url, const String&, Frame*) { ASSERT(!_url.isEmpty()); @@ -138,7 +150,7 @@ void Pasteboard::writeImage(Node* node, const KURL&, const String&) ASSERT(node && node->renderer() && node->renderer()->isImage()); #ifndef QT_NO_CLIPBOARD - CachedImage* cachedImage = static_cast<RenderImage*>(node->renderer())->cachedImage(); + CachedImage* cachedImage = toRenderImage(node->renderer())->cachedImage(); ASSERT(cachedImage); Image* image = cachedImage->image(); diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp index 43a294ba1..37ea681b3 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/PlatformKeyboardEventQt.cpp @@ -138,42 +138,48 @@ static String keyIdentifierForQtKeyCode(int keyCode) } } -static int windowsKeyCodeForKeyEvent(unsigned int keycode) +static int windowsKeyCodeForKeyEvent(unsigned int keycode, bool isKeypad = false) { - switch (keycode) { - /* FIXME: Need to supply a bool in this func, to determine wheter the event comes from the keypad + // Determine wheter the event comes from the keypad + if (isKeypad) { + switch (keycode) { case Qt::Key_0: - return VK_NUMPAD0;// (60) Numeric keypad 0 key + return VK_NUMPAD0; // (60) Numeric keypad 0 key case Qt::Key_1: - return VK_NUMPAD1;// (61) Numeric keypad 1 key + return VK_NUMPAD1; // (61) Numeric keypad 1 key case Qt::Key_2: return VK_NUMPAD2; // (62) Numeric keypad 2 key case Qt::Key_3: - return VK_NUMPAD3; // (63) Numeric keypad 3 key + return VK_NUMPAD3; // (63) Numeric keypad 3 key case Qt::Key_4: - return VK_NUMPAD4; // (64) Numeric keypad 4 key + return VK_NUMPAD4; // (64) Numeric keypad 4 key case Qt::Key_5: - return VK_NUMPAD5; //(65) Numeric keypad 5 key + return VK_NUMPAD5; // (65) Numeric keypad 5 key case Qt::Key_6: - return VK_NUMPAD6; // (66) Numeric keypad 6 key + return VK_NUMPAD6; // (66) Numeric keypad 6 key case Qt::Key_7: - return VK_NUMPAD7; // (67) Numeric keypad 7 key + return VK_NUMPAD7; // (67) Numeric keypad 7 key case Qt::Key_8: - return VK_NUMPAD8; // (68) Numeric keypad 8 key + return VK_NUMPAD8; // (68) Numeric keypad 8 key case Qt::Key_9: - return VK_NUMPAD9; // (69) Numeric keypad 9 key + return VK_NUMPAD9; // (69) Numeric keypad 9 key case Qt::Key_Asterisk: return VK_MULTIPLY; // (6A) Multiply key case Qt::Key_Plus: - return VK_ADD; // (6B) Add key + return VK_ADD; // (6B) Add key case Qt::Key_Minus: return VK_SUBTRACT; // (6D) Subtract key case Qt::Key_Period: - return VK_DECIMAL; // (6E) Decimal key + return VK_DECIMAL; // (6E) Decimal key case Qt::Key_Slash: - return VK_DIVIDE; // (6F) Divide key + return VK_DIVIDE; // (6F) Divide key + default: + return 0; + } - */ + } else + + switch (keycode) { case Qt::Key_Backspace: return VK_BACK; // (08) BACKSPACE key case Qt::Key_Backtab: @@ -211,7 +217,7 @@ static int windowsKeyCodeForKeyEvent(unsigned int keycode) case Qt::Key_F9: return VK_F9; case Qt::Key_F10: - return VK_F11; + return VK_F10; case Qt::Key_F11: return VK_F11; case Qt::Key_F12: @@ -494,9 +500,9 @@ PlatformKeyboardEvent::PlatformKeyboardEvent(QKeyEvent* event) m_ctrlKey = (state & Qt::ControlModifier) != 0; m_altKey = (state & Qt::AltModifier) != 0; m_metaKey = (state & Qt::MetaModifier) != 0; - m_windowsVirtualKeyCode = windowsKeyCodeForKeyEvent(event->key()); - m_nativeVirtualKeyCode = event->nativeVirtualKey(); m_isKeypad = (state & Qt::KeypadModifier) != 0; + m_windowsVirtualKeyCode = windowsKeyCodeForKeyEvent(event->key(), m_isKeypad); + m_nativeVirtualKeyCode = event->nativeVirtualKey(); m_shiftKey = (state & Qt::ShiftModifier) != 0 || event->key() == Qt::Key_Backtab; // Simulate Shift+Tab with Key_Backtab m_qtEvent = event; } diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PlatformMouseEventQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PlatformMouseEventQt.cpp index 6c1d82d45..e486e6833 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/PlatformMouseEventQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/PlatformMouseEventQt.cpp @@ -31,9 +31,46 @@ #include <wtf/CurrentTime.h> #include <QMouseEvent> +#include <QGraphicsSceneMouseEvent> namespace WebCore { +PlatformMouseEvent::PlatformMouseEvent(QGraphicsSceneMouseEvent* event, int clickCount) +{ + m_timestamp = WTF::currentTime(); + + switch (event->type()) { + case QEvent::GraphicsSceneMouseDoubleClick: + case QEvent::GraphicsSceneMousePress: + m_eventType = MouseEventPressed; + break; + case QEvent::GraphicsSceneMouseRelease: + m_eventType = MouseEventReleased; + break; + case QEvent::GraphicsSceneMouseMove: + default: + m_eventType = MouseEventMoved; + } + + m_position = IntPoint(event->pos().toPoint()); + m_globalPosition = IntPoint(event->screenPos()); + + if (event->button() == Qt::LeftButton || (event->buttons() & Qt::LeftButton)) + m_button = LeftButton; + else if (event->button() == Qt::RightButton || (event->buttons() & Qt::RightButton)) + m_button = RightButton; + else if (event->button() == Qt::MidButton || (event->buttons() & Qt::MidButton)) + m_button = MiddleButton; + else + m_button = NoButton; + + m_clickCount = clickCount; + m_shiftKey = (event->modifiers() & Qt::ShiftModifier) != 0; + m_ctrlKey = (event->modifiers() & Qt::ControlModifier) != 0; + m_altKey = (event->modifiers() & Qt::AltModifier) != 0; + m_metaKey = (event->modifiers() & Qt::MetaModifier) != 0; +} + PlatformMouseEvent::PlatformMouseEvent(QInputEvent* event, int clickCount) { m_timestamp = WTF::currentTime(); diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp index 5dc09637e..822176088 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/PlatformScreenQt.cpp @@ -36,42 +36,54 @@ #include "FrameView.h" #include "HostWindow.h" #include "Widget.h" +#include "QWebPageClient.h" #include <QApplication> #include <QDesktopWidget> namespace WebCore { +static int screenNumber(Widget* w) +{ + if (!w) + return 0; + + QWebPageClient* client = w->root()->hostWindow()->platformPageClient(); + return client ? client->screenNumber() : 0; +} + int screenDepth(Widget* w) { - QDesktopWidget* d = QApplication::desktop(); - QWidget *view = w ? w->root()->hostWindow()->platformWindow() : 0; - int screenNumber = view ? d->screenNumber(view) : 0; - return d->screen(screenNumber)->depth(); + return QApplication::desktop()->screen(screenNumber(w))->depth(); } int screenDepthPerComponent(Widget* w) { - QWidget *view = w ? w->root()->hostWindow()->platformWindow() : 0; - return view ? view->depth() : QApplication::desktop()->screen(0)->depth(); + if (w) { + QWebPageClient* client = w->root()->hostWindow()->platformPageClient(); + + if (client) { + QWidget* view = client->ownerWidget(); + if (view) + return view->depth(); + } + } + return QApplication::desktop()->screen(0)->depth(); } bool screenIsMonochrome(Widget* w) { - QDesktopWidget* d = QApplication::desktop(); - QWidget *view = w ? w->root()->hostWindow()->platformWindow(): 0; - int screenNumber = view ? d->screenNumber(view) : 0; - return d->screen(screenNumber)->numColors() < 2; + return QApplication::desktop()->screen(screenNumber(w))->numColors() < 2; } FloatRect screenRect(Widget* w) { - QRect r = QApplication::desktop()->screenGeometry(w ? w->root()->hostWindow()->platformWindow(): 0); + QRect r = QApplication::desktop()->screenGeometry(screenNumber(w)); return FloatRect(r.x(), r.y(), r.width(), r.height()); } FloatRect screenAvailableRect(Widget* w) { - QRect r = QApplication::desktop()->availableGeometry(w ? w->root()->hostWindow()->platformWindow(): 0); + QRect r = QApplication::desktop()->availableGeometry(screenNumber(w)); return FloatRect(r.x(), r.y(), r.width(), r.height()); } diff --git a/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp index 867e4ea4b..f6ec4f78c 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/PopupMenuQt.cpp @@ -30,14 +30,16 @@ #include "FrameView.h" #include "HostWindow.h" #include "PopupMenuClient.h" +#include "QWebPageClient.h" #include "QWebPopup.h" #include <QAction> #include <QDebug> -#include <QMenu> -#include <QPoint> #include <QListWidget> #include <QListWidgetItem> +#include <QMenu> +#include <QPoint> +#include <QStandardItemModel> #include <QWidgetAction> namespace WebCore { @@ -58,43 +60,39 @@ void PopupMenu::clear() m_popup->clear(); } -void PopupMenu::populate(const IntRect& r) +void PopupMenu::populate(const IntRect&) { clear(); Q_ASSERT(client()); + QStandardItemModel* model = qobject_cast<QStandardItemModel*>(m_popup->model()); + Q_ASSERT(model); + int size = client()->listSize(); for (int i = 0; i < size; i++) { - if (client()->itemIsSeparator(i)) { - //FIXME: better seperator item - m_popup->insertItem(i, QString::fromLatin1("---")); - } else { - //PopupMenuStyle style = client()->itemStyle(i); + if (client()->itemIsSeparator(i)) + m_popup->insertSeparator(i); + else { m_popup->insertItem(i, client()->itemText(i)); -#if 0 - item = new QListWidgetItem(client()->itemText(i)); - m_actions.insert(item, i); - if (style->font() != Font()) - item->setFont(style->font()); - - Qt::ItemFlags flags = Qt::ItemIsSelectable; - if (client()->itemIsEnabled(i)) - flags |= Qt::ItemIsEnabled; - item->setFlags(flags); -#endif + + if (model && !client()->itemIsEnabled(i)) + model->item(i)->setEnabled(false); + + if (client()->itemIsSelected(i)) + m_popup->setCurrentIndex(i); } } } void PopupMenu::show(const IntRect& r, FrameView* v, int index) { - QWidget* window = v->hostWindow()->platformWindow(); + QWebPageClient* client = v->hostWindow()->platformPageClient(); populate(r); QRect rect = r; rect.moveTopLeft(v->contentsToWindow(r.topLeft())); rect.setHeight(m_popup->sizeHint().height()); - m_popup->setParent(window); + m_popup->setParent(client->ownerWidget()); m_popup->setGeometry(rect); m_popup->setCurrentIndex(index); m_popup->exec(); diff --git a/src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h b/src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h new file mode 100644 index 000000000..61adb971a --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/qt/QWebPageClient.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 QWebPageClient_h +#define QWebPageClient_h + +#include <QRect> + +class QWebPageClient { +public: + virtual ~QWebPageClient() { } + + virtual void scroll(int dx, int dy, const QRect&) = 0; + virtual void update(const QRect&) = 0; + virtual void setInputMethodEnabled(bool enable) = 0; + virtual bool inputMethodEnabled() const = 0; +#if QT_VERSION >= 0x040600 + virtual void setInputMethodHint(Qt::InputMethodHint hint, bool enable) = 0; +#endif + inline void resetCursor() + { +#ifndef QT_NO_CURSOR + if (!cursor().bitmap() && cursor().shape() == m_lastCursor.shape()) + return; + updateCursor(m_lastCursor); +#endif + } + + inline void setCursor(const QCursor& cursor) + { +#ifndef QT_NO_CURSOR + m_lastCursor = cursor; + if (!cursor.bitmap() && cursor.shape() == this->cursor().shape()) + return; + updateCursor(cursor); +#endif + } + + virtual QPalette palette() const = 0; + virtual int screenNumber() const = 0; + virtual QWidget* ownerWidget() const = 0; + + virtual QObject* pluginParent() const = 0; + +protected: +#ifndef QT_NO_CURSOR + virtual QCursor cursor() const = 0; + virtual void updateCursor(const QCursor& cursor) = 0; +#endif + +private: +#ifndef QT_NO_CURSOR + QCursor m_lastCursor; +#endif +}; + +#endif diff --git a/src/3rdparty/webkit/WebCore/platform/qt/QWebPopup.cpp b/src/3rdparty/webkit/WebCore/platform/qt/QWebPopup.cpp index f437c27ad..d07707957 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/QWebPopup.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/QWebPopup.cpp @@ -71,7 +71,7 @@ void QWebPopup::hidePopup() return; m_popupVisible = false; - m_client->hidePopup(); + m_client->popupDidHide(); } void QWebPopup::activeChanged(int index) diff --git a/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp index 5f64219c5..501a28b9a 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/RenderThemeQt.cpp @@ -28,36 +28,38 @@ */ #include "config.h" - -#include "qwebpage.h" #include "RenderThemeQt.h" + +#include "CSSStyleSelector.h" +#include "CSSStyleSheet.h" #include "ChromeClientQt.h" +#include "Color.h" +#include "Document.h" +#include "Font.h" +#include "FontSelector.h" +#include "GraphicsContext.h" +#include "HTMLMediaElement.h" +#include "HTMLNames.h" #include "NotImplemented.h" +#include "Page.h" +#include "RenderBox.h" +#include "RenderTheme.h" +#include "UserAgentStyleSheets.h" +#include "QWebPageClient.h" +#include "qwebpage.h" #include <QApplication> #include <QColor> #include <QDebug> #include <QFile> -#include <QWidget> +#include <QLineEdit> #include <QPainter> #include <QPushButton> -#include <QLineEdit> #include <QStyleFactory> #include <QStyleOptionButton> #include <QStyleOptionFrameV2> +#include <QWidget> -#include "Color.h" -#include "CSSStyleSelector.h" -#include "CSSStyleSheet.h" -#include "FontSelector.h" -#include "Document.h" -#include "Page.h" -#include "Font.h" -#include "RenderTheme.h" -#include "GraphicsContext.h" -#include "HTMLMediaElement.h" -#include "HTMLNames.h" -#include "RenderBox.h" namespace WebCore { @@ -172,7 +174,7 @@ bool RenderThemeQt::supportsHover(const RenderStyle*) const return true; } -bool RenderThemeQt::supportsFocusRing(const RenderStyle* style) const +bool RenderThemeQt::supportsFocusRing(const RenderStyle*) const { return true; // Qt provides this through the style } @@ -182,8 +184,7 @@ int RenderThemeQt::baselinePosition(const RenderObject* o) const if (!o->isBox()) return 0; - if (o->style()->appearance() == CheckboxPart || - o->style()->appearance() == RadioPart) + if (o->style()->appearance() == CheckboxPart || o->style()->appearance() == RadioPart) return toRenderBox(o)->marginTop() + toRenderBox(o)->height() - 2; // Same as in old khtml return RenderTheme::baselinePosition(o); } @@ -227,8 +228,8 @@ static QRect inflateButtonRect(const QRect& originalRect, QStyle* style) int paddingBottom = originalRect.bottom() - layoutRect.bottom(); return originalRect.adjusted(-paddingLeft, -paddingTop, paddingRight, paddingBottom); - } else - return originalRect; + } + return originalRect; } void RenderThemeQt::adjustRepaintRect(const RenderObject* o, IntRect& rect) @@ -275,7 +276,7 @@ Color RenderThemeQt::platformInactiveSelectionForegroundColor() const return pal.brush(QPalette::Inactive, QPalette::HighlightedText).color(); } -void RenderThemeQt::systemFont(int propId, FontDescription& fontDescription) const +void RenderThemeQt::systemFont(int, FontDescription&) const { // no-op } @@ -388,7 +389,7 @@ bool RenderThemeQt::paintRadio(RenderObject* o, const RenderObject::PaintInfo& i return paintButton(o, i, r); } -void RenderThemeQt::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const +void RenderThemeQt::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element*) const { // Ditch the border. style->resetBorder(); @@ -419,8 +420,6 @@ void RenderThemeQt::adjustButtonStyle(CSSStyleSelector* selector, RenderStyle* s setButtonSize(style); setButtonPadding(style); - - style->setColor(QApplication::palette().text().color()); } void RenderThemeQt::setButtonSize(RenderStyle* style) const @@ -492,7 +491,6 @@ bool RenderThemeQt::paintButton(RenderObject* o, const RenderObject::PaintInfo& void RenderThemeQt::adjustTextFieldStyle(CSSStyleSelector*, RenderStyle* style, Element*) const { style->setBackgroundColor(Color::transparent); - style->setColor(QApplication::palette().text().color()); style->resetBorder(); style->resetPadding(); computeSizeBasedOnStyle(style); @@ -551,8 +549,6 @@ void RenderThemeQt::adjustMenuListStyle(CSSStyleSelector*, RenderStyle* style, E // Add in the padding that we'd like to use. setPopupPadding(style); - - style->setColor(QApplication::palette().text().color()); } void RenderThemeQt::setPopupPadding(RenderStyle* style) const @@ -578,7 +574,7 @@ bool RenderThemeQt::paintMenuList(RenderObject* o, const RenderObject::PaintInfo QStyleOptionComboBox opt; if (p.widget) opt.initFrom(p.widget); - ControlPart appearance = applyTheme(opt, o); + applyTheme(opt, o); const QPoint topLeft = r.topLeft(); p.painter->translate(topLeft); @@ -590,8 +586,7 @@ bool RenderThemeQt::paintMenuList(RenderObject* o, const RenderObject::PaintInfo return false; } -void RenderThemeQt::adjustMenuListButtonStyle(CSSStyleSelector* selector, RenderStyle* style, - Element* e) const +void RenderThemeQt::adjustMenuListButtonStyle(CSSStyleSelector*, RenderStyle* style, Element*) const { // WORKAROUND because html.css specifies -webkit-border-radius for <select> so we override it here // see also http://bugs.webkit.org/show_bug.cgi?id=18399 @@ -607,8 +602,6 @@ void RenderThemeQt::adjustMenuListButtonStyle(CSSStyleSelector* selector, Render // Add in the padding that we'd like to use. setPopupPadding(style); - - style->setColor(QApplication::palette().text().color()); } bool RenderThemeQt::paintMenuListButton(RenderObject* o, const RenderObject::PaintInfo& i, @@ -705,17 +698,17 @@ bool RenderThemeQt::paintSearchFieldResultsDecoration(RenderObject* o, const Ren bool RenderThemeQt::supportsFocus(ControlPart appearance) const { switch (appearance) { - case PushButtonPart: - case ButtonPart: - case TextFieldPart: - case TextAreaPart: - case ListboxPart: - case MenulistPart: - case RadioPart: - case CheckboxPart: - return true; - default: // No for all others... - return false; + case PushButtonPart: + case ButtonPart: + case TextFieldPart: + case TextAreaPart: + case ListboxPart: + case MenulistPart: + case RadioPart: + case CheckboxPart: + return true; + default: // No for all others... + return false; } } @@ -746,31 +739,32 @@ ControlPart RenderThemeQt::applyTheme(QStyleOption& option, RenderObject* o) con ControlPart result = o->style()->appearance(); switch (result) { - case PushButtonPart: - case SquareButtonPart: - case ButtonPart: - case ButtonBevelPart: - case ListItemPart: - case MenulistButtonPart: - case SearchFieldResultsButtonPart: - case SearchFieldCancelButtonPart: { - if (isPressed(o)) - option.state |= QStyle::State_Sunken; - else if (result == PushButtonPart) - option.state |= QStyle::State_Raised; - break; - } + case PushButtonPart: + case SquareButtonPart: + case ButtonPart: + case ButtonBevelPart: + case ListItemPart: + case MenulistButtonPart: + case SearchFieldResultsButtonPart: + case SearchFieldCancelButtonPart: { + if (isPressed(o)) + option.state |= QStyle::State_Sunken; + else if (result == PushButtonPart) + option.state |= QStyle::State_Raised; + break; + } } if (result == RadioPart || result == CheckboxPart) option.state |= (isChecked(o) ? QStyle::State_On : QStyle::State_Off); - // If the webview has a custom palette, use it + // If the owner widget has a custom palette, use it Page* page = o->document()->page(); if (page) { - QWidget* view = static_cast<ChromeClientQt*>(page->chrome()->client())->m_webPage->view(); - if (view) - option.palette = view->palette(); + ChromeClient* client = page->chrome()->client(); + QWebPageClient* pageClient = client->platformPageClient(); + if (pageClient) + option.palette = pageClient->palette(); } return result; @@ -780,13 +774,7 @@ ControlPart RenderThemeQt::applyTheme(QStyleOption& option, RenderObject* o) con String RenderThemeQt::extraMediaControlsStyleSheet() { - QFile platformStyleSheet(QLatin1String(":/webcore/css/mediaControls-extras.css")); - if (platformStyleSheet.open(QFile::ReadOnly)) { - QByteArray sheetData = platformStyleSheet.readAll(); - return QString::fromUtf8(sheetData.constData(), sheetData.length()); - } - - return String(); + return String(mediaControlsQtUserAgentStyleSheet, sizeof(mediaControlsQtUserAgentStyleSheet)); } // Helper class to transform the painter's world matrix to the object's content area, scaled to 0,0,100,100 @@ -895,13 +883,13 @@ bool RenderThemeQt::paintMediaPlayButton(RenderObject* o, const RenderObject::Pa return false; } -bool RenderThemeQt::paintMediaSeekBackButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) +bool RenderThemeQt::paintMediaSeekBackButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { // We don't want to paint this at the moment. return false; } -bool RenderThemeQt::paintMediaSeekForwardButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) +bool RenderThemeQt::paintMediaSeekForwardButton(RenderObject*, const RenderObject::PaintInfo&, const IntRect&) { // We don't want to paint this at the moment. return false; diff --git a/src/3rdparty/webkit/WebCore/platform/qt/ScrollViewQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/ScrollViewQt.cpp index 48885d320..ccbd75156 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/ScrollViewQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/ScrollViewQt.cpp @@ -53,7 +53,7 @@ void ScrollView::adjustWidgetsPreventingBlittingCount(int delta) parent()->adjustWidgetsPreventingBlittingCount(delta); } -void ScrollView::platformAddChild(Widget* child) +void ScrollView::platformAddChild(Widget*) { adjustWidgetsPreventingBlittingCount(1); } diff --git a/src/3rdparty/webkit/WebCore/platform/qt/SearchPopupMenuQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/SearchPopupMenuQt.cpp index 7822b2ced..187a5de12 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/SearchPopupMenuQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/SearchPopupMenuQt.cpp @@ -29,11 +29,11 @@ SearchPopupMenu::SearchPopupMenu(PopupMenuClient* client) { } -void SearchPopupMenu::saveRecentSearches(const AtomicString& name, const Vector<String>& searchItems) +void SearchPopupMenu::saveRecentSearches(const AtomicString&, const Vector<String>&) { } -void SearchPopupMenu::loadRecentSearches(const AtomicString& name, Vector<String>& searchItems) +void SearchPopupMenu::loadRecentSearches(const AtomicString&, Vector<String>&) { } diff --git a/src/3rdparty/webkit/WebCore/platform/qt/TemporaryLinkStubs.cpp b/src/3rdparty/webkit/WebCore/platform/qt/TemporaryLinkStubs.cpp index 8ef598fa2..814f96151 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/TemporaryLinkStubs.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/TemporaryLinkStubs.cpp @@ -100,7 +100,7 @@ void getSupportedKeySizes(Vector<String>&) notImplemented(); } -String signedPublicKeyAndChallengeString(unsigned keySizeIndex, const String &challengeString, const KURL &url) +String signedPublicKeyAndChallengeString(unsigned, const String&, const KURL&) { return String(); } @@ -114,11 +114,6 @@ float userIdleTime() } #endif -void prefetchDNS(const String& hostname) -{ - notImplemented(); -} - } // vim: ts=4 sw=4 et diff --git a/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp index 9534f2000..9cc27ab07 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/WheelEventQt.cpp @@ -25,9 +25,48 @@ #include <qapplication.h> #include <QWheelEvent> +#include <QGraphicsSceneWheelEvent> namespace WebCore { +void PlatformWheelEvent::applyDelta(int delta, Qt::Orientation orientation) +{ + if (orientation == Qt::Horizontal) { + m_deltaX = (delta / 120.0f); + m_deltaY = 0; + } else { + m_deltaX = 0; + m_deltaY = (delta / 120.0f); + } + + m_wheelTicksX = m_deltaX; + m_wheelTicksY = m_deltaY; + + // Use the same single scroll step as QTextEdit + // (in QTextEditPrivate::init [h,v]bar->setSingleStep) + static const float cDefaultQtScrollStep = 20.f; + m_deltaX *= QApplication::wheelScrollLines() * cDefaultQtScrollStep; + m_deltaY *= QApplication::wheelScrollLines() * cDefaultQtScrollStep; +} + +PlatformWheelEvent::PlatformWheelEvent(QGraphicsSceneWheelEvent* e) +#ifdef QT_NO_WHEELEVENT +{ + Q_UNUSED(e); +} +#else + : m_position(e->pos().toPoint()) + , m_globalPosition(e->screenPos()) + , m_granularity(ScrollByPixelWheelEvent) + , m_isAccepted(false) + , m_shiftKey(e->modifiers() & Qt::ShiftModifier) + , m_ctrlKey(e->modifiers() & Qt::ControlModifier) + , m_altKey(e->modifiers() & Qt::AltModifier) + , m_metaKey(e->modifiers() & Qt::MetaModifier) +{ + applyDelta(e->delta(), e->orientation()); +} +#endif // QT_NO_WHEELEVENT PlatformWheelEvent::PlatformWheelEvent(QWheelEvent* e) #ifdef QT_NO_WHEELEVENT @@ -44,21 +83,7 @@ PlatformWheelEvent::PlatformWheelEvent(QWheelEvent* e) , m_altKey(e->modifiers() & Qt::AltModifier) , m_metaKey(e->modifiers() & Qt::MetaModifier) { - if (e->orientation() == Qt::Horizontal) { - m_deltaX = (e->delta() / 120); - m_deltaY = 0; - } else { - m_deltaX = 0; - m_deltaY = (e->delta() / 120); - } - m_wheelTicksX = m_deltaX; - m_wheelTicksY = m_deltaY; - - // use the same single scroll step as QTextEdit (in - // QTextEditPrivate::init [h,v]bar->setSingleStep ) - static const float cDefaultQtScrollStep = 20.f; - m_deltaX *= QApplication::wheelScrollLines() * cDefaultQtScrollStep; - m_deltaY *= QApplication::wheelScrollLines() * cDefaultQtScrollStep; + applyDelta(e->delta(), e->orientation()); } #endif // QT_NO_WHEELEVENT diff --git a/src/3rdparty/webkit/WebCore/platform/qt/WidgetQt.cpp b/src/3rdparty/webkit/WebCore/platform/qt/WidgetQt.cpp index 9f1a1e804..e9c99a451 100644 --- a/src/3rdparty/webkit/WebCore/platform/qt/WidgetQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/qt/WidgetQt.cpp @@ -30,6 +30,7 @@ */ #include "config.h" +#include "Widget.h" #include "Cursor.h" #include "Font.h" @@ -37,8 +38,8 @@ #include "HostWindow.h" #include "IntRect.h" #include "ScrollView.h" -#include "Widget.h" #include "NotImplemented.h" +#include "QWebPageClient.h" #include "qwebframe.h" #include "qwebframe_p.h" @@ -81,8 +82,10 @@ void Widget::setFocus() void Widget::setCursor(const Cursor& cursor) { #ifndef QT_NO_CURSOR - if (QWidget* widget = root()->hostWindow()->platformWindow()) - QCoreApplication::postEvent(widget, new SetCursorEvent(cursor.impl())); + QWebPageClient* pageClient = root()->hostWindow()->platformPageClient(); + + if (pageClient) + pageClient->setCursor(cursor.impl()); #endif } @@ -98,7 +101,7 @@ void Widget::hide() platformWidget()->hide(); } -void Widget::paint(GraphicsContext *, const IntRect &rect) +void Widget::paint(GraphicsContext*, const IntRect&) { } diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp index 7e178f9f4..0ad643e4c 100644 --- a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp +++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.cpp @@ -32,10 +32,10 @@ namespace WebCore { SQLValue::SQLValue(const SQLValue& val) + : m_type(val.m_type) + , m_number(val.m_number) + , m_string(val.m_string.threadsafeCopy()) { - m_number = val.m_number; - m_string = val.m_string.copy(); - m_type = val.m_type; } String SQLValue::string() const @@ -43,7 +43,7 @@ String SQLValue::string() const ASSERT(m_type == StringValue); // Must return a copy since ref-shared Strings are not thread safe - return m_string.copy(); + return m_string.threadsafeCopy(); } double SQLValue::number() const diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h index 7d85051a3..0f854fc89 100644 --- a/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h +++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLValue.h @@ -38,9 +38,9 @@ namespace WebCore { public: enum Type { NullValue, NumberValue, StringValue }; - SQLValue() : m_type(NullValue) { } + SQLValue() : m_type(NullValue), m_number(0.0) { } SQLValue(double number) : m_type(NumberValue), m_number(number) { } - SQLValue(const String& s) : m_type(StringValue), m_string(s) { } + SQLValue(const String& s) : m_type(StringValue), m_number(0.0), m_string(s) { } SQLValue(const SQLValue&); Type type() const { return m_type; } diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h index d31343581..99822545e 100644 --- a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h +++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteDatabase.h @@ -24,8 +24,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SQLDatabase_h -#define SQLDatabase_h +#ifndef SQLiteDatabase_h +#define SQLiteDatabase_h #include "PlatformString.h" #include <wtf/Threading.h> diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.cpp b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.cpp index 5018f5a00..a4b2ac83a 100644 --- a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.cpp +++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.cpp @@ -20,7 +20,7 @@ * 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. + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" @@ -30,24 +30,35 @@ namespace WebCore { -SQLiteTransaction::SQLiteTransaction(SQLiteDatabase& db) +SQLiteTransaction::SQLiteTransaction(SQLiteDatabase& db, bool readOnly) : m_db(db) , m_inProgress(false) + , m_readOnly(readOnly) { } SQLiteTransaction::~SQLiteTransaction() { - if (m_inProgress) + if (m_inProgress) rollback(); } - + void SQLiteTransaction::begin() { if (!m_inProgress) { ASSERT(!m_db.m_transactionInProgress); - m_inProgress = m_db.executeCommand("BEGIN;"); - m_db.m_transactionInProgress = true; + // Call BEGIN IMMEDIATE for a write transaction to acquire + // a RESERVED lock on the DB file. Otherwise, another write + // transaction (on another connection) could make changes + // to the same DB file before this transaction gets to execute + // any statements. If that happens, this transaction will fail. + // http://www.sqlite.org/lang_transaction.html + // http://www.sqlite.org/lockingv3.html#locking + if (m_readOnly) + m_inProgress = m_db.executeCommand("BEGIN;"); + else + m_inProgress = m_db.executeCommand("BEGIN IMMEDIATE;"); + m_db.m_transactionInProgress = m_inProgress; } } @@ -76,5 +87,5 @@ void SQLiteTransaction::stop() m_inProgress = false; m_db.m_transactionInProgress = false; } - + } // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.h b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.h index cf5a1802b..557d81cb4 100644 --- a/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.h +++ b/src/3rdparty/webkit/WebCore/platform/sql/SQLiteTransaction.h @@ -35,7 +35,7 @@ class SQLiteDatabase; class SQLiteTransaction : public Noncopyable { public: - SQLiteTransaction(SQLiteDatabase& db); + SQLiteTransaction(SQLiteDatabase& db, bool readOnly = false); ~SQLiteTransaction(); void begin(); @@ -47,10 +47,9 @@ public: private: SQLiteDatabase& m_db; bool m_inProgress; - + bool m_readOnly; }; } // namespace WebCore #endif // SQLiteTransation_H - diff --git a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp index 409439e5b..17d7832b2 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.cpp @@ -65,7 +65,9 @@ struct CStringTranslator { static void translate(StringImpl*& location, const char* const& c, unsigned hash) { - location = new StringImpl(c, strlen(c), hash); + location = StringImpl::create(c).releaseRef(); + location->setHash(hash); + location->setInTable(); } }; @@ -140,7 +142,9 @@ struct UCharBufferTranslator { static void translate(StringImpl*& location, const UCharBuffer& buf, unsigned hash) { - location = new StringImpl(buf.s, buf.length, hash); + location = StringImpl::create(buf.s, buf.length).releaseRef(); + location->setHash(hash); + location->setInTable(); } }; @@ -164,7 +168,9 @@ struct HashAndCharactersTranslator { static void translate(StringImpl*& location, const HashAndCharacters& buffer, unsigned hash) { - location = new StringImpl(buffer.characters, buffer.length, hash); + location = StringImpl::create(buffer.characters, buffer.length).releaseRef(); + location->setHash(hash); + location->setInTable(); } }; @@ -222,6 +228,16 @@ void AtomicString::remove(StringImpl* r) { stringTable().remove(r); } + +AtomicString AtomicString::lower() const +{ + // Note: This is a hot function in the Dromaeo benchmark. + StringImpl* impl = this->impl(); + RefPtr<StringImpl> newImpl = impl->lower(); + if (LIKELY(newImpl == impl)) + return *this; + return AtomicString(newImpl); +} #if USE(JSC) PassRefPtr<StringImpl> AtomicString::add(const JSC::Identifier& identifier) diff --git a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h index 3307a2d32..8805f4c7d 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h +++ b/src/3rdparty/webkit/WebCore/platform/text/AtomicString.h @@ -83,6 +83,9 @@ public: bool endsWith(const String& s, bool caseSensitive = true) const { return m_string.endsWith(s, caseSensitive); } + AtomicString lower() const; + AtomicString upper() const { return AtomicString(impl()->upper()); } + int toInt(bool* ok = 0) const { return m_string.toInt(ok); } double toDouble(bool* ok = 0) const { return m_string.toDouble(ok); } float toFloat(bool* ok = 0) const { return m_string.toFloat(ok); } diff --git a/src/3rdparty/webkit/WebCore/platform/text/CString.cpp b/src/3rdparty/webkit/WebCore/platform/text/CString.cpp index 90990f89f..25f5fa13c 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/CString.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/CString.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2006, 2008, 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/src/3rdparty/webkit/WebCore/platform/text/CString.h b/src/3rdparty/webkit/WebCore/platform/text/CString.h index f084ddf37..b9030d662 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/CString.h +++ b/src/3rdparty/webkit/WebCore/platform/text/CString.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2006, 2008, 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h b/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h index ee2c8cee5..8d19c175f 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h +++ b/src/3rdparty/webkit/WebCore/platform/text/PlatformString.h @@ -56,6 +56,10 @@ QT_END_NAMESPACE class wxString; #endif +#if PLATFORM(HAIKU) +class BString; +#endif + namespace WebCore { class CString; @@ -189,16 +193,13 @@ public: bool percentage(int& percentage) const; - // Makes a deep copy. Helpful only if you need to use a String on another thread. + // Returns a StringImpl suitable for use on another thread. + String crossThreadString() const; + // Makes a deep copy. Helpful only if you need to use a String on another thread + // (use crossThreadString if the method call doesn't need to be threadsafe). // Since the underlying StringImpl objects are immutable, there's no other reason // to ever prefer copy() over plain old assignment. - String copy() const; - - // Makes a deep copy like copy() but only for a substring. - // (This ensures that you always get something suitable for a thread while subtring - // may not. For example, in the empty string case, StringImpl::substring returns - // empty() which is not safe for another thread.) - String substringCopy(unsigned pos, unsigned len = UINT_MAX) const; + String threadsafeCopy() const; bool isNull() const { return !m_impl; } bool isEmpty() const; @@ -229,6 +230,11 @@ public: operator wxString() const; #endif +#if PLATFORM(HAIKU) + String(const BString&); + operator BString() const; +#endif + #ifndef NDEBUG Vector<char> ascii() const; #endif @@ -245,6 +251,14 @@ public: // Determines the writing direction using the Unicode Bidi Algorithm rules P2 and P3. WTF::Unicode::Direction defaultWritingDirection() const { return m_impl ? m_impl->defaultWritingDirection() : WTF::Unicode::LeftToRight; } + // Counts the number of grapheme clusters. A surrogate pair or a sequence + // of a non-combining character and following combining characters is + // counted as 1 grapheme cluster. + unsigned numGraphemeClusters() const; + // Returns the number of characters which will be less than or equal to + // the specified grapheme cluster length. + unsigned numCharactersInGraphemeClusters(unsigned) const; + private: RefPtr<StringImpl> m_impl; }; @@ -272,6 +286,8 @@ inline bool equalIgnoringCase(const String& a, const String& b) { return equalIg inline bool equalIgnoringCase(const String& a, const char* b) { return equalIgnoringCase(a.impl(), b); } inline bool equalIgnoringCase(const char* a, const String& b) { return equalIgnoringCase(a, b.impl()); } +inline bool equalIgnoringNullity(const String& a, const String& b) { return equalIgnoringNullity(a.impl(), b.impl()); } + inline bool operator!(const String& str) { return str.isNull(); } inline void swap(String& a, String& b) { a.swap(b); } diff --git a/src/3rdparty/webkit/WebCore/platform/text/RegularExpression.cpp b/src/3rdparty/webkit/WebCore/platform/text/RegularExpression.cpp index 6329b3b31..9b063c920 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/RegularExpression.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/RegularExpression.cpp @@ -32,7 +32,7 @@ namespace WebCore { -class RegularExpression::Private : public RefCounted<Private> { +class RegularExpression::Private : public RefCounted<RegularExpression::Private> { public: static PassRefPtr<Private> create(const String& pattern, TextCaseSensitivity); ~Private(); diff --git a/src/3rdparty/webkit/WebCore/platform/text/String.cpp b/src/3rdparty/webkit/WebCore/platform/text/String.cpp index 97e2d4d7b..44582a925 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/String.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/String.cpp @@ -1,6 +1,7 @@ /* * (C) 1999 Lars Knoll (knoll@kde.org) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,6 +25,7 @@ #include "CString.h" #include "FloatConversion.h" #include "StringBuffer.h" +#include "TextBreakIterator.h" #include "TextEncoding.h" #include <wtf/dtoa.h> #include <limits> @@ -261,13 +263,6 @@ String String::substring(unsigned pos, unsigned len) const return m_impl->substring(pos, len); } -String String::substringCopy(unsigned pos, unsigned len) const -{ - if (!m_impl) - return String(); - return m_impl->substringCopy(pos, len); -} - String String::lower() const { if (!m_impl) @@ -353,6 +348,29 @@ String String::format(const char *format, ...) va_end(args); return buffer; + +#elif PLATFORM(WINCE) + va_list args; + va_start(args, format); + + Vector<char, 256> buffer; + + int bufferSize = 256; + buffer.resize(bufferSize); + for (;;) { + int written = vsnprintf(buffer.data(), bufferSize, format, args); + va_end(args); + + if (written == 0) + return String(""); + if (written > 0) + return StringImpl::create(buffer.data(), written); + + bufferSize <<= 1; + buffer.resize(bufferSize); + va_start(args, format); + } + #else va_list args; va_start(args, format); @@ -423,7 +441,7 @@ String String::number(unsigned long n) String String::number(long long n) { -#if PLATFORM(WIN_OS) +#if PLATFORM(WIN_OS) && !PLATFORM(QT) return String::format("%I64i", n); #else return String::format("%lli", n); @@ -432,7 +450,7 @@ String String::number(long long n) String String::number(unsigned long long n) { -#if PLATFORM(WIN_OS) +#if PLATFORM(WIN_OS) && !PLATFORM(QT) return String::format("%I64u", n); #else return String::format("%llu", n); @@ -565,11 +583,18 @@ float String::toFloat(bool* ok) const return m_impl->toFloat(ok); } -String String::copy() const +String String::threadsafeCopy() const { if (!m_impl) return String(); - return m_impl->copy(); + return m_impl->threadsafeCopy(); +} + +String String::crossThreadString() const +{ + if (!m_impl) + return String(); + return m_impl->crossThreadString(); } bool String::isEmpty() const @@ -897,6 +922,31 @@ PassRefPtr<SharedBuffer> utf8Buffer(const String& string) return SharedBuffer::adoptVector(buffer); } +unsigned String::numGraphemeClusters() const +{ + TextBreakIterator* it = characterBreakIterator(characters(), length()); + if (!it) + return length(); + + unsigned num = 0; + while (textBreakNext(it) != TextBreakDone) + ++num; + return num; +} + +unsigned String::numCharactersInGraphemeClusters(unsigned numGraphemeClusters) const +{ + TextBreakIterator* it = characterBreakIterator(characters(), length()); + if (!it) + return min(length(), numGraphemeClusters); + + for (unsigned i = 0; i < numGraphemeClusters; ++i) { + if (textBreakNext(it) == TextBreakDone) + return length(); + } + return textBreakCurrent(it); +} + } // namespace WebCore #ifndef NDEBUG diff --git a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp index 8cbcc0d95..5cf4ced91 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.cpp @@ -57,7 +57,7 @@ static inline void deleteUCharVector(const UChar* p) } // Some of the factory methods create buffers using fastMalloc. -// We must ensure that ll allocations of StringImpl are allocated using +// We must ensure that all allocations of StringImpl are allocated using // fastMalloc so that we don't have mis-matched frees. We accomplish // this by overriding the new and delete operators. void* StringImpl::operator new(size_t size, void* address) @@ -79,10 +79,9 @@ void StringImpl::operator delete(void* address) // This constructor is used only to create the empty string. StringImpl::StringImpl() - : m_length(0) - , m_data(0) + : m_data(0) + , m_length(0) , m_hash(0) - , m_bufferIsInternal(false) { // Ensure that the hash is computed so that AtomicStringHash can call existingHash() // with impunity. The empty string is special because it is never entered into @@ -90,97 +89,20 @@ StringImpl::StringImpl() hash(); } -// This is one of the most common constructors, but it's also used for the copy() -// operation. Because of that, it's the one constructor that doesn't assert the -// length is non-zero, since we support copying the empty string. inline StringImpl::StringImpl(const UChar* characters, unsigned length) - : m_length(length) + : m_data(characters) + , m_length(length) , m_hash(0) - , m_bufferIsInternal(false) -{ - UChar* data = newUCharVector(length); - memcpy(data, characters, length * sizeof(UChar)); - m_data = data; -} - -inline StringImpl::StringImpl(const StringImpl& str, WithTerminatingNullCharacter) - : m_length(str.m_length) - , m_hash(str.m_hash) - , m_bufferIsInternal(false) -{ - m_sharedBufferAndFlags.setFlag(HasTerminatingNullCharacter); - UChar* data = newUCharVector(str.m_length + 1); - memcpy(data, str.m_data, str.m_length * sizeof(UChar)); - data[str.m_length] = 0; - m_data = data; -} - -inline StringImpl::StringImpl(const char* characters, unsigned length) - : m_length(length) - , m_hash(0) - , m_bufferIsInternal(false) -{ - ASSERT(characters); - ASSERT(length); - - UChar* data = newUCharVector(length); - for (unsigned i = 0; i != length; ++i) { - unsigned char c = characters[i]; - data[i] = c; - } - m_data = data; -} - -inline StringImpl::StringImpl(UChar* characters, unsigned length, AdoptBuffer) - : m_length(length) - , m_data(characters) - , m_hash(0) - , m_bufferIsInternal(false) { ASSERT(characters); ASSERT(length); } -// This constructor is only for use by AtomicString. -StringImpl::StringImpl(const UChar* characters, unsigned length, unsigned hash) - : m_length(length) - , m_hash(hash) - , m_bufferIsInternal(false) -{ - ASSERT(hash); - ASSERT(characters); - ASSERT(length); - - setInTable(); - UChar* data = newUCharVector(length); - memcpy(data, characters, length * sizeof(UChar)); - m_data = data; -} - -// This constructor is only for use by AtomicString. -StringImpl::StringImpl(const char* characters, unsigned length, unsigned hash) - : m_length(length) - , m_hash(hash) - , m_bufferIsInternal(false) -{ - ASSERT(hash); - ASSERT(characters); - ASSERT(length); - - setInTable(); - UChar* data = newUCharVector(length); - for (unsigned i = 0; i != length; ++i) { - unsigned char c = characters[i]; - data[i] = c; - } - m_data = data; -} - StringImpl::~StringImpl() { if (inTable()) AtomicString::remove(this); - if (!m_bufferIsInternal) { + if (!bufferIsInternal()) { SharedUChar* sharedBuffer = m_sharedBufferAndFlags.get(); if (sharedBuffer) sharedBuffer->deref(); @@ -218,15 +140,6 @@ PassRefPtr<StringImpl> StringImpl::substring(unsigned start, unsigned length) return create(m_data + start, length); } -PassRefPtr<StringImpl> StringImpl::substringCopy(unsigned start, unsigned length) -{ - start = min(start, m_length); - length = min(length, m_length - start); - if (!length) - return adoptRef(new StringImpl); - return create(m_data + start, length); -} - UChar32 StringImpl::characterStartingAt(unsigned i) { if (U16_IS_SINGLE(m_data[i])) @@ -236,46 +149,38 @@ UChar32 StringImpl::characterStartingAt(unsigned i) return 0; } -bool StringImpl::isLower() +PassRefPtr<StringImpl> StringImpl::lower() { - // Do a faster loop for the case where all the characters are ASCII. - bool allLower = true; + // Note: This is a hot function in the Dromaeo benchmark, specifically the + // no-op code path up through the first 'return' statement. + + // First scan the string for uppercase and non-ASCII characters: UChar ored = 0; - for (unsigned i = 0; i < m_length; i++) { - UChar c = m_data[i]; - allLower = allLower && isASCIILower(c); - ored |= c; + bool noUpper = true; + const UChar *end = m_data + m_length; + for (const UChar* chp = m_data; chp != end; chp++) { + if (UNLIKELY(isASCIIUpper(*chp))) + noUpper = false; + ored |= *chp; } - if (!(ored & ~0x7F)) - return allLower; - - // Do a slower check for cases that include non-ASCII characters. - allLower = true; - unsigned i = 0; - while (i < m_length) { - UChar32 character; - U16_NEXT(m_data, i, m_length, character) - allLower = allLower && Unicode::isLower(character); - } - return allLower; -} + + // Nothing to do if the string is all ASCII with no uppercase. + if (noUpper && !(ored & ~0x7F)) + return this; -PassRefPtr<StringImpl> StringImpl::lower() -{ - UChar* data; - PassRefPtr<StringImpl> newImpl = createUninitialized(m_length, data); int32_t length = m_length; + UChar* data; + RefPtr<StringImpl> newImpl = createUninitialized(m_length, data); - // Do a faster loop for the case where all the characters are ASCII. - UChar ored = 0; - for (int i = 0; i < length; i++) { - UChar c = m_data[i]; - ored |= c; - data[i] = toASCIILower(c); - } - if (!(ored & ~0x7F)) + if (!(ored & ~0x7F)) { + // Do a faster loop for the case where all the characters are ASCII. + for (int i = 0; i < length; i++) { + UChar c = m_data[i]; + data[i] = toASCIILower(c); + } return newImpl; - + } + // Do a slower implementation for cases that include non-ASCII characters. bool error; int32_t realLength = Unicode::toLower(data, length, m_data, m_length, &error); @@ -290,6 +195,9 @@ PassRefPtr<StringImpl> StringImpl::lower() PassRefPtr<StringImpl> StringImpl::upper() { + // This function could be optimized for no-op cases the way lower() is, + // but in empirical testing, few actual calls to upper() are no-ops, so + // it wouldn't be worth the extra time for pre-scanning. UChar* data; PassRefPtr<StringImpl> newImpl = createUninitialized(m_length, data); int32_t length = m_length; @@ -374,6 +282,8 @@ PassRefPtr<StringImpl> StringImpl::stripWhiteSpace() while (end && isSpaceOrNewline(m_data[end])) end--; + if (!start && end == m_length - 1) + return this; return create(m_data + start, end + 1 - start); } @@ -416,12 +326,16 @@ PassRefPtr<StringImpl> StringImpl::simplifyWhiteSpace() const UChar* from = m_data; const UChar* fromend = from + m_length; int outc = 0; + bool changedToSpace = false; UChar* to = data.characters(); while (true) { - while (from != fromend && isSpaceOrNewline(*from)) + while (from != fromend && isSpaceOrNewline(*from)) { + if (*from != ' ') + changedToSpace = true; from++; + } while (from != fromend && !isSpaceOrNewline(*from)) to[outc++] = *from++; if (from != fromend) @@ -433,6 +347,9 @@ PassRefPtr<StringImpl> StringImpl::simplifyWhiteSpace() if (outc > 0 && to[outc - 1] == ' ') outc--; + if (static_cast<unsigned>(outc) == m_length && !changedToSpace) + return this; + data.shrink(outc); return adopt(data); @@ -539,9 +456,8 @@ static bool equal(const UChar* a, const char* b, int length) return true; } -static bool equalIgnoringCase(const UChar* a, const char* b, int length) +bool equalIgnoringCase(const UChar* a, const char* b, unsigned length) { - ASSERT(length >= 0); while (length--) { unsigned char bc = *b++; if (foldCase(*a++) != foldCase(bc)) @@ -929,6 +845,18 @@ bool equalIgnoringCase(StringImpl* a, const char* b) return equal && !b[length]; } +bool equalIgnoringNullity(StringImpl* a, StringImpl* b) +{ + if (StringHash::equal(a, b)) + return true; + if (!a && b && !b->length()) + return true; + if (!b && a && !a->length()) + return true; + + return false; +} + Vector<char> StringImpl::ascii() { Vector<char> buffer(m_length + 1); @@ -974,7 +902,7 @@ PassRefPtr<StringImpl> StringImpl::adopt(StringBuffer& buffer) unsigned length = buffer.length(); if (length == 0) return empty(); - return adoptRef(new StringImpl(buffer.release(), length, AdoptBuffer())); + return adoptRef(new StringImpl(buffer.release(), length)); } PassRefPtr<StringImpl> StringImpl::adopt(Vector<UChar>& vector) @@ -982,7 +910,7 @@ PassRefPtr<StringImpl> StringImpl::adopt(Vector<UChar>& vector) size_t size = vector.size(); if (size == 0) return empty(); - return adoptRef(new StringImpl(vector.releaseBuffer(), size, AdoptBuffer())); + return adoptRef(new StringImpl(vector.releaseBuffer(), size)); } PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, UChar*& data) @@ -996,10 +924,9 @@ PassRefPtr<StringImpl> StringImpl::createUninitialized(unsigned length, UChar*& // struct as well as the data which it contains. This removes one // heap allocation from this call. size_t size = sizeof(StringImpl) + length * sizeof(UChar); - char* buffer = static_cast<char*>(fastMalloc(size)); - data = reinterpret_cast<UChar*>(buffer + sizeof(StringImpl)); - StringImpl* string = new (buffer) StringImpl(data, length, AdoptBuffer()); - string->m_bufferIsInternal = true; + StringImpl* string = static_cast<StringImpl*>(fastMalloc(size)); + data = reinterpret_cast<UChar*>(string + 1); + string = new (string) StringImpl(data, length); return adoptRef(string); } @@ -1040,7 +967,7 @@ PassRefPtr<StringImpl> StringImpl::create(const JSC::UString& str) { SharedUChar* sharedBuffer = const_cast<JSC::UString*>(&str)->rep()->sharedBuffer(); if (sharedBuffer) { - PassRefPtr<StringImpl> impl = adoptRef(new StringImpl(const_cast<UChar*>(str.data()), str.size(), AdoptBuffer())); + PassRefPtr<StringImpl> impl = adoptRef(new StringImpl(str.data(), str.size())); sharedBuffer->ref(); impl->m_sharedBufferAndFlags.set(sharedBuffer); return impl; @@ -1060,18 +987,43 @@ JSC::UString StringImpl::ustring() PassRefPtr<StringImpl> StringImpl::createWithTerminatingNullCharacter(const StringImpl& string) { - return adoptRef(new StringImpl(string, WithTerminatingNullCharacter())); + // Use createUninitialized instead of 'new StringImpl' so that the string and its buffer + // get allocated in a single malloc block. + UChar* data; + int length = string.m_length; + RefPtr<StringImpl> terminatedString = createUninitialized(length + 1, data); + memcpy(data, string.m_data, length * sizeof(UChar)); + data[length] = 0; + terminatedString->m_length--; + terminatedString->m_hash = string.m_hash; + terminatedString->m_sharedBufferAndFlags.setFlag(HasTerminatingNullCharacter); + return terminatedString.release(); +} + +PassRefPtr<StringImpl> StringImpl::threadsafeCopy() const +{ + // Special-case empty strings to make sure that per-thread empty string instance isn't returned. + if (m_length == 0) + return adoptRef(new StringImpl); + return create(m_data, m_length); } -PassRefPtr<StringImpl> StringImpl::copy() +PassRefPtr<StringImpl> StringImpl::crossThreadString() { - // Using the constructor directly to make sure that per-thread empty string instance isn't returned. - return adoptRef(new StringImpl(m_data, m_length)); + SharedUChar* shared = sharedBuffer(); + if (shared) { + RefPtr<StringImpl> impl = adoptRef(new StringImpl(m_data, m_length)); + impl->m_sharedBufferAndFlags.set(shared->crossThreadCopy().releaseRef()); + return impl.release(); + } + + // If no shared buffer is available, create a copy. + return threadsafeCopy(); } StringImpl::SharedUChar* StringImpl::sharedBuffer() { - if (m_length < minLengthToShare || m_bufferIsInternal) + if (m_length < minLengthToShare || bufferIsInternal()) return 0; if (!m_sharedBufferAndFlags.get()) diff --git a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h index 38439edf2..dac25b289 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h +++ b/src/3rdparty/webkit/WebCore/platform/text/StringImpl.h @@ -47,7 +47,6 @@ typedef const struct __CFString * CFStringRef; namespace WebCore { -class AtomicString; class StringBuffer; struct CStringTranslator; @@ -60,26 +59,19 @@ enum TextCaseSensitivity { TextCaseSensitive, TextCaseInsensitive }; typedef bool (*CharacterMatchFunctionPtr)(UChar); class StringImpl : public RefCounted<StringImpl> { - friend class AtomicString; friend struct CStringTranslator; friend struct HashAndCharactersTranslator; friend struct UCharBufferTranslator; private: friend class ThreadGlobalData; StringImpl(); + + // This adopts the UChar* without copying the buffer. StringImpl(const UChar*, unsigned length); - StringImpl(const char*, unsigned length); - - struct AdoptBuffer { }; - StringImpl(UChar*, unsigned length, AdoptBuffer); - - struct WithTerminatingNullCharacter { }; - StringImpl(const StringImpl&, WithTerminatingNullCharacter); - - // For AtomicString. - StringImpl(const UChar*, unsigned length, unsigned hash); - StringImpl(const char*, unsigned length, unsigned hash); + // For use only by AtomicString's XXXTranslator helpers. + void setHash(unsigned hash) { ASSERT(!m_hash); m_hash = hash; } + typedef CrossThreadRefCounted<OwnFastMallocPtr<UChar> > SharedUChar; public: @@ -114,15 +106,12 @@ public: static unsigned computeHash(const UChar*, unsigned len); static unsigned computeHash(const char*); - // Makes a deep copy. Helpful only if you need to use a String on another thread. + // Returns a StringImpl suitable for use on another thread. + PassRefPtr<StringImpl> crossThreadString(); + // Makes a deep copy. Helpful only if you need to use a String on another thread + // (use crossThreadString if the method call doesn't need to be threadsafe). // Since StringImpl objects are immutable, there's no other reason to make a copy. - PassRefPtr<StringImpl> copy(); - - // Makes a deep copy like copy() but only for a substring. - // (This ensures that you always get something suitable for a thread while subtring - // may not. For example, in the empty string case, substring returns empty() which - // is not safe for another thread.) - PassRefPtr<StringImpl> substringCopy(unsigned pos, unsigned len = UINT_MAX); + PassRefPtr<StringImpl> threadsafeCopy() const; PassRefPtr<StringImpl> substring(unsigned pos, unsigned len = UINT_MAX); @@ -146,7 +135,6 @@ public: double toDouble(bool* ok = 0); float toFloat(bool* ok = 0); - bool isLower(); PassRefPtr<StringImpl> lower(); PassRefPtr<StringImpl> upper(); PassRefPtr<StringImpl> secure(UChar aChar); @@ -166,7 +154,7 @@ public: int reverseFind(UChar, int index); int reverseFind(StringImpl*, int index, bool caseSensitive = true); - bool startsWith(StringImpl* m_data, bool caseSensitive = true) { return reverseFind(m_data, 0, caseSensitive) == 0; } + bool startsWith(StringImpl* str, bool caseSensitive = true) { return reverseFind(str, 0, caseSensitive) == 0; } bool endsWith(StringImpl*, bool caseSensitive = true); PassRefPtr<StringImpl> replace(UChar, UChar); @@ -196,21 +184,22 @@ private: void* operator new(size_t size, void* address); static PassRefPtr<StringImpl> createStrippingNullCharactersSlowCase(const UChar*, unsigned length); + + // The StringImpl struct and its data may be allocated within a single heap block. + // In this case, the m_data pointer is an "internal buffer", and does not need to be deallocated. + bool bufferIsInternal() { return m_data == reinterpret_cast<const UChar*>(this + 1); } enum StringImplFlags { HasTerminatingNullCharacter, InTable, }; - unsigned m_length; const UChar* m_data; + unsigned m_length; mutable unsigned m_hash; PtrAndFlags<SharedUChar, StringImplFlags> m_sharedBufferAndFlags; - - // In some cases, we allocate the StringImpl struct and its data - // within a single heap buffer. In this case, the m_data pointer - // is an "internal buffer", and does not need to be deallocated. - bool m_bufferIsInternal; + // There is a fictitious variable-length UChar array at the end, which is used + // as the internal buffer by the createUninitialized and create methods. }; bool equal(StringImpl*, StringImpl*); @@ -220,6 +209,10 @@ inline bool equal(const char* a, StringImpl* b) { return equal(b, a); } bool equalIgnoringCase(StringImpl*, StringImpl*); bool equalIgnoringCase(StringImpl*, const char*); inline bool equalIgnoringCase(const char* a, StringImpl* b) { return equalIgnoringCase(b, a); } +bool equalIgnoringCase(const UChar* a, const char* b, unsigned length); +inline bool equalIgnoringCase(const char* a, const UChar* b, unsigned length) { return equalIgnoringCase(b, a, length); } + +bool equalIgnoringNullity(StringImpl*, StringImpl*); // Golden ratio - arbitrary start value to avoid mapping all 0's to all 0's // or anything like that. diff --git a/src/3rdparty/webkit/WebCore/platform/text/TextEncoding.cpp b/src/3rdparty/webkit/WebCore/platform/text/TextEncoding.cpp index 5fa927be2..c5c8cfdef 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/TextEncoding.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/TextEncoding.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2004, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com> + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -113,6 +114,10 @@ CString TextEncoding::encode(const UChar* characters, size_t length, Unencodable QString str(reinterpret_cast<const QChar*>(characters), length); str = str.normalized(QString::NormalizationForm_C); return newTextCodec(*this)->encode(reinterpret_cast<const UChar *>(str.utf16()), str.length(), handling); +#elif PLATFORM(WINCE) + // normalization will be done by Windows CE API + OwnPtr<TextCodec> textCodec = newTextCodec(*this); + return textCodec.get() ? textCodec->encode(characters, length, handling) : CString(); #endif } @@ -259,6 +264,7 @@ const TextEncoding& UTF32LittleEndianEncoding() const TextEncoding& UTF8Encoding() { static TextEncoding globalUTF8Encoding("UTF-8"); + ASSERT(globalUTF8Encoding.isValid()); return globalUTF8Encoding; } diff --git a/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp b/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp index 3c9d65fa9..d3e2965b9 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/TextEncodingRegistry.cpp @@ -1,5 +1,6 @@ /* * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. + * Copyright (C) 2007-2009 Torch Mobile, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -47,6 +48,9 @@ #if PLATFORM(QT) #include "qt/TextCodecQt.h" #endif +#if PLATFORM(WINCE) && !PLATFORM(QT) +#include "TextCodecWince.h" +#endif using namespace WTF; @@ -125,6 +129,10 @@ static TextEncodingNameMap* textEncodingNameMap; static TextCodecMap* textCodecMap; static bool didExtendTextCodecMaps; +static const char* const textEncodingNameBlacklist[] = { + "UTF-7" +}; + #if ERROR_DISABLED static inline void checkExistingName(const char*, const char*) { } @@ -167,6 +175,30 @@ static void addToTextCodecMap(const char* name, NewTextCodecFunction function, c textCodecMap->add(atomicName, TextCodecFactory(function, additionalData)); } +static void pruneBlacklistedCodecs() +{ + size_t blacklistedCodecListLength = sizeof(textEncodingNameBlacklist) / sizeof(textEncodingNameBlacklist[0]); + for (size_t i = 0; i < blacklistedCodecListLength; ++i) { + const char* atomicName = textEncodingNameMap->get(textEncodingNameBlacklist[i]); + if (!atomicName) + continue; + + Vector<const char*> names; + TextEncodingNameMap::const_iterator it = textEncodingNameMap->begin(); + TextEncodingNameMap::const_iterator end = textEncodingNameMap->end(); + for (; it != end; ++it) { + if (it->second == atomicName) + names.append(it->first); + } + + size_t length = names.size(); + for (size_t j = 0; j < length; ++j) + textEncodingNameMap->remove(names[j]); + + textCodecMap->remove(atomicName); + } +} + static void buildBaseTextCodecMaps() { ASSERT(isMainThread()); @@ -189,6 +221,11 @@ static void buildBaseTextCodecMaps() TextCodecICU::registerBaseEncodingNames(addToTextEncodingNameMap); TextCodecICU::registerBaseCodecs(addToTextCodecMap); #endif + +#if PLATFORM(WINCE) && !PLATFORM(QT) + TextCodecWince::registerBaseEncodingNames(addToTextEncodingNameMap); + TextCodecWince::registerBaseCodecs(addToTextCodecMap); +#endif } static void extendTextCodecMaps() @@ -207,6 +244,13 @@ static void extendTextCodecMaps() TextCodecMac::registerEncodingNames(addToTextEncodingNameMap); TextCodecMac::registerCodecs(addToTextCodecMap); #endif + +#if PLATFORM(WINCE) && !PLATFORM(QT) + TextCodecWince::registerExtendedEncodingNames(addToTextEncodingNameMap); + TextCodecWince::registerExtendedCodecs(addToTextCodecMap); +#endif + + pruneBlacklistedCodecs(); } PassOwnPtr<TextCodec> newTextCodec(const TextEncoding& encoding) diff --git a/src/3rdparty/webkit/WebCore/platform/text/UnicodeRange.h b/src/3rdparty/webkit/WebCore/platform/text/UnicodeRange.h index 7ecf03ff4..2278a0e26 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/UnicodeRange.h +++ b/src/3rdparty/webkit/WebCore/platform/text/UnicodeRange.h @@ -35,6 +35,10 @@ #ifndef UnicodeRange_H #define UnicodeRange_H +#if PLATFORM(HAIKU) +#include "stdint.h" +#endif + #include <wtf/unicode/Unicode.h> namespace WebCore { diff --git a/src/3rdparty/webkit/WebCore/platform/text/cf/StringCF.cpp b/src/3rdparty/webkit/WebCore/platform/text/cf/StringCF.cpp index 5e12ba977..b770d0ef3 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/cf/StringCF.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/cf/StringCF.cpp @@ -45,7 +45,7 @@ String::String(CFStringRef str) CFStringRef String::createCFString() const { if (!m_impl) - return CFSTR(""); + return static_cast<CFStringRef>(CFRetain(CFSTR(""))); return m_impl->createCFString(); } diff --git a/src/3rdparty/webkit/WebCore/platform/text/mac/TextCodecMac.cpp b/src/3rdparty/webkit/WebCore/platform/text/mac/TextCodecMac.cpp index 93b9da275..a1750c9f5 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/mac/TextCodecMac.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/mac/TextCodecMac.cpp @@ -36,7 +36,7 @@ #include <wtf/PassOwnPtr.h> #include <wtf/Threading.h> -using std::min; +using namespace std; namespace WebCore { @@ -141,7 +141,7 @@ OSStatus TextCodecMac::decode(const unsigned char* inputBuffer, int inputBufferL // First, fill the partial character buffer with as many bytes as are available. ASSERT(m_numBufferedBytes < sizeof(m_bufferedBytes)); const int spaceInBuffer = sizeof(m_bufferedBytes) - m_numBufferedBytes; - const int bytesToPutInBuffer = MIN(spaceInBuffer, inputBufferLength); + const int bytesToPutInBuffer = min(spaceInBuffer, inputBufferLength); ASSERT(bytesToPutInBuffer != 0); memcpy(m_bufferedBytes + m_numBufferedBytes, inputBuffer, bytesToPutInBuffer); @@ -283,28 +283,28 @@ CString TextCodecMac::encode(const UChar* characters, size_t length, Unencodable // Encoding will change the yen sign back into a backslash. String copy(characters, length); copy.replace('\\', m_backslashAsCurrencySymbol); - CFStringRef cfs = copy.createCFString(); + RetainPtr<CFStringRef> cfs(AdoptCF, copy.createCFString()); CFIndex startPos = 0; - CFIndex charactersLeft = CFStringGetLength(cfs); + CFIndex charactersLeft = CFStringGetLength(cfs.get()); Vector<char> result; size_t size = 0; UInt8 lossByte = handling == QuestionMarksForUnencodables ? '?' : 0; while (charactersLeft > 0) { CFRange range = CFRangeMake(startPos, charactersLeft); CFIndex bufferLength; - CFStringGetBytes(cfs, range, m_encoding, lossByte, false, NULL, 0x7FFFFFFF, &bufferLength); + CFStringGetBytes(cfs.get(), range, m_encoding, lossByte, false, NULL, 0x7FFFFFFF, &bufferLength); result.grow(size + bufferLength); unsigned char* buffer = reinterpret_cast<unsigned char*>(result.data() + size); - CFIndex charactersConverted = CFStringGetBytes(cfs, range, m_encoding, lossByte, false, buffer, bufferLength, &bufferLength); + CFIndex charactersConverted = CFStringGetBytes(cfs.get(), range, m_encoding, lossByte, false, buffer, bufferLength, &bufferLength); size += bufferLength; if (charactersConverted != charactersLeft) { - unsigned badChar = CFStringGetCharacterAtIndex(cfs, startPos + charactersConverted); + unsigned badChar = CFStringGetCharacterAtIndex(cfs.get(), startPos + charactersConverted); ++charactersConverted; if ((badChar & 0xFC00) == 0xD800 && charactersConverted != charactersLeft) { // is high surrogate - UniChar low = CFStringGetCharacterAtIndex(cfs, startPos + charactersConverted); + UniChar low = CFStringGetCharacterAtIndex(cfs.get(), startPos + charactersConverted); if ((low & 0xFC00) == 0xDC00) { // is low surrogate badChar <<= 10; badChar += low; @@ -322,7 +322,6 @@ CString TextCodecMac::encode(const UChar* characters, size_t length, Unencodable startPos += charactersConverted; charactersLeft -= charactersConverted; } - CFRelease(cfs); return CString(result.data(), size); } diff --git a/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp b/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp index c6c02cfd3..b3f75ccd2 100644 --- a/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp +++ b/src/3rdparty/webkit/WebCore/platform/text/qt/TextCodecQt.cpp @@ -94,7 +94,26 @@ TextCodecQt::~TextCodecQt() String TextCodecQt::decode(const char* bytes, size_t length, bool flush, bool /*stopOnError*/, bool& sawError) { - QString unicode = m_codec->toUnicode(bytes, length, &m_state); + // We chop input buffer to smaller buffers to avoid excessive memory consumption + // when the input buffer is big. This helps reduce peak memory consumption in + // mobile devices where system RAM is limited. +#if PLATFORM(SYMBIAN) + static const int MaxInputChunkSize = 32 * 1024; +#else + static const int MaxInputChunkSize = 1024 * 1024; +#endif + const char* buf = bytes; + const char* end = buf + length; + String unicode(""); // a non-null string is expected + + while (buf < end) { + int size = end - buf; + size = qMin(size, MaxInputChunkSize); + QString decoded = m_codec->toUnicode(buf, size, &m_state); + unicode.append(decoded); + buf += size; + } + sawError = m_state.invalidChars != 0; if (flush) { diff --git a/src/3rdparty/webkit/WebCore/platform/win/BitmapInfo.cpp b/src/3rdparty/webkit/WebCore/platform/win/BitmapInfo.cpp new file mode 100644 index 000000000..9a2312cf2 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/win/BitmapInfo.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2009 Apple Inc. All Rights Reserved. + * Copyright (C) 2009 Brent Fulgham + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "BitmapInfo.h" + +namespace WebCore { + +BitmapInfo bitmapInfoForSize(int width, int height) +{ + BitmapInfo bitmapInfo; + bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bitmapInfo.bmiHeader.biWidth = width; + bitmapInfo.bmiHeader.biHeight = height; + bitmapInfo.bmiHeader.biPlanes = 1; + bitmapInfo.bmiHeader.biBitCount = 32; + bitmapInfo.bmiHeader.biCompression = BI_RGB; + bitmapInfo.bmiHeader.biSizeImage = 0; + bitmapInfo.bmiHeader.biXPelsPerMeter = 0; + bitmapInfo.bmiHeader.biYPelsPerMeter = 0; + bitmapInfo.bmiHeader.biClrUsed = 0; + bitmapInfo.bmiHeader.biClrImportant = 0; + + return bitmapInfo; +} + +BitmapInfo::BitmapInfo() +{ + memset(&bmiHeader, 0, sizeof(bmiHeader)); + bmiHeader.biSize = sizeof(BITMAPINFOHEADER); +} + +BitmapInfo BitmapInfo::create(const IntSize& size) +{ + return bitmapInfoForSize(size.width(), size.height()); +} + +BitmapInfo BitmapInfo::createBottomUp(const IntSize& size) +{ + return bitmapInfoForSize(size.width(), -size.height()); +} + +} // namespace WebCore diff --git a/src/3rdparty/webkit/WebCore/platform/win/BitmapInfo.h b/src/3rdparty/webkit/WebCore/platform/win/BitmapInfo.h new file mode 100644 index 000000000..0127fdba0 --- /dev/null +++ b/src/3rdparty/webkit/WebCore/platform/win/BitmapInfo.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2009 Apple Inc. All Rights Reserved. + * Copyright (C) 2009 Brent Fulgham + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 BitmapInfo_h +#define BitmapInfo_h + +#include <windows.h> +#include "IntSize.h" + +namespace WebCore { + +struct BitmapInfo : public BITMAPINFO { + BitmapInfo (); + static BitmapInfo create(const IntSize&); + static BitmapInfo createBottomUp(const IntSize&); +}; + +} // namespace WebCore + +#endif // BitmapInfo_h |