diff options
Diffstat (limited to 'WebCore/platform/mac')
-rw-r--r-- | WebCore/platform/mac/Language.mm | 106 | ||||
-rw-r--r-- | WebCore/platform/mac/LoggingMac.mm | 1 | ||||
-rw-r--r-- | WebCore/platform/mac/ScrollbarThemeMac.mm | 7 | ||||
-rw-r--r-- | WebCore/platform/mac/SharedTimerMac.mm | 139 | ||||
-rw-r--r-- | WebCore/platform/mac/WebCoreSystemInterface.h | 1 | ||||
-rw-r--r-- | WebCore/platform/mac/WebCoreSystemInterface.mm | 1 |
6 files changed, 204 insertions, 51 deletions
diff --git a/WebCore/platform/mac/Language.mm b/WebCore/platform/mac/Language.mm index 96caaa6..bb51cb5 100644 --- a/WebCore/platform/mac/Language.mm +++ b/WebCore/platform/mac/Language.mm @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. + * Copyright (C) 2003, 2005, 2006, 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,32 +10,106 @@ * 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. + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. */ #import "config.h" #import "Language.h" #import "BlockExceptions.h" -#import "PlatformString.h" -#import "WebCoreViewFactory.h" +#import "WebCoreSystemInterface.h" +#import <wtf/Assertions.h> +#import <wtf/MainThread.h> +#import <wtf/text/WTFString.h> + +using namespace WebCore; + +static NSString *preferredLanguageCode; + +@interface LanguageChangeObserver : NSObject { +} +@end + +@implementation LanguageChangeObserver + ++ (void)_webkit_languagePreferencesDidChange +{ + ASSERT(isMainThread()); + + [preferredLanguageCode release]; + preferredLanguageCode = nil; + + languageDidChange(); +} + +@end namespace WebCore { -String defaultLanguage() +static NSString *createHTTPStyleLanguageCode(NSString *languageCode) { + ASSERT(isMainThread()); + + // Look up the language code using CFBundle. + CFStringRef preferredLanguageCode = wkCopyCFLocalizationPreferredName((CFStringRef)languageCode); + + if (preferredLanguageCode) + languageCode = (NSString *)preferredLanguageCode; + + // Make the string lowercase. + NSString *lowercaseLanguageCode = [languageCode lowercaseString]; + + // Turn a '_' into a '-' if it appears after a 2-letter language code. + if ([lowercaseLanguageCode length] < 3 || [lowercaseLanguageCode characterAtIndex:2] != '_') + return lowercaseLanguageCode; + + NSMutableString *result = [lowercaseLanguageCode mutableCopy]; + [result replaceCharactersInRange:NSMakeRange(2, 1) withString:@"-"]; + + if (preferredLanguageCode) + CFRelease(preferredLanguageCode); + + return result; +} + +String platformDefaultLanguage() +{ + ASSERT(isMainThread()); + BEGIN_BLOCK_OBJC_EXCEPTIONS; - return [[WebCoreViewFactory sharedFactory] defaultLanguageCode]; + + if (!preferredLanguageCode) { + [[NSUserDefaults standardUserDefaults] synchronize]; + NSArray *languages = [[NSUserDefaults standardUserDefaults] stringArrayForKey:@"AppleLanguages"]; + if (![languages count]) + preferredLanguageCode = @"en"; + else + preferredLanguageCode = createHTTPStyleLanguageCode([languages objectAtIndex:0]); + } + + NSString *code = [[preferredLanguageCode retain] autorelease]; + + static bool languageChangeObserverAdded; + if (!languageChangeObserverAdded) { + [[NSDistributedNotificationCenter defaultCenter] addObserver:[LanguageChangeObserver self] + selector:@selector(_webkit_languagePreferencesDidChange) + name:@"AppleLanguagePreferencesChangedNotification" + object:nil]; + languageChangeObserverAdded = true; + } + + return code; + END_BLOCK_OBJC_EXCEPTIONS; return String(); } diff --git a/WebCore/platform/mac/LoggingMac.mm b/WebCore/platform/mac/LoggingMac.mm index 3e83579..ee2f39e 100644 --- a/WebCore/platform/mac/LoggingMac.mm +++ b/WebCore/platform/mac/LoggingMac.mm @@ -62,6 +62,7 @@ void InitializeLoggingChannelsIfNecessary() initializeWithUserDefault(LogHistory); initializeWithUserDefault(LogPageCache); initializeWithUserDefault(LogPlatformLeaks); + initializeWithUserDefault(LogResourceLoading); initializeWithUserDefault(LogNetwork); initializeWithUserDefault(LogFTP); initializeWithUserDefault(LogThreading); diff --git a/WebCore/platform/mac/ScrollbarThemeMac.mm b/WebCore/platform/mac/ScrollbarThemeMac.mm index bfa584a..ce3be1a 100644 --- a/WebCore/platform/mac/ScrollbarThemeMac.mm +++ b/WebCore/platform/mac/ScrollbarThemeMac.mm @@ -378,10 +378,9 @@ bool ScrollbarThemeMac::paint(Scrollbar* scrollbar, GraphicsContext* context, co trackInfo.enableState = kThemeTrackNothingToScroll; trackInfo.trackInfo.scrollbar.pressState = scrollbarPartToHIPressedState(scrollbar->pressedPart()); - CGAffineTransform currentCTM = CGContextGetCTM(context->platformContext()); - // The Aqua scrollbar is buggy when rotated and scaled. We will just draw into a bitmap if we detect a scale or rotation. - bool canDrawDirectly = currentCTM.a == 1.0f && currentCTM.b == 0.0f && currentCTM.c == 0.0f && (currentCTM.d == 1.0f || currentCTM.d == -1.0f); + const AffineTransform& currentCTM = context->getCTM(); + bool canDrawDirectly = currentCTM.isIdentityOrTranslationOrFlipped(); if (canDrawDirectly) HIThemeDrawTrack(&trackInfo, 0, context->platformContext(), kHIThemeOrientationNormal); else { @@ -396,7 +395,7 @@ bool ScrollbarThemeMac::paint(Scrollbar* scrollbar, GraphicsContext* context, co return true; HIThemeDrawTrack(&trackInfo, 0, imageBuffer->context()->platformContext(), kHIThemeOrientationNormal); - context->drawImageBuffer(imageBuffer.get(), DeviceColorSpace, scrollbar->frameRect().location()); + context->drawImageBuffer(imageBuffer.get(), ColorSpaceDeviceRGB, scrollbar->frameRect().location()); } return true; diff --git a/WebCore/platform/mac/SharedTimerMac.mm b/WebCore/platform/mac/SharedTimerMac.mm index b9eaaef..cc9ff17 100644 --- a/WebCore/platform/mac/SharedTimerMac.mm +++ b/WebCore/platform/mac/SharedTimerMac.mm @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006 Apple Inc. All rights reserved. + * Copyright (C) 2006, 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,51 +26,131 @@ #import "config.h" #import "SharedTimer.h" +#import <IOKit/IOMessage.h> +#import <IOKit/pwr_mgt/IOPMLib.h> #import <wtf/Assertions.h> +#import <wtf/Noncopyable.h> +#import <wtf/PassOwnPtr.h> #import <wtf/UnusedParam.h> -@class WebCorePowerNotifier; +#include <stdio.h> + +// On Snow Leopard and newer we'll ask IOKit to deliver notifications on a queue. +#if defined(BUILDING_ON_TIGER) || defined(BUILDING_ON_LEOPARD) +#define IOKIT_WITHOUT_LIBDISPATCH 1 +#endif namespace WebCore { -static WebCorePowerNotifier *powerNotifier; static CFRunLoopTimerRef sharedTimer; static void (*sharedTimerFiredFunction)(); static void timerFired(CFRunLoopTimerRef, void*); +#if !defined(IOKIT_WITHOUT_LIBDISPATCH) && defined(BUILDING_ON_SNOW_LEOPARD) +extern "C" void IONotificationPortSetDispatchQueue(IONotificationPortRef notify, dispatch_queue_t queue); +#endif + +class PowerObserver { + WTF_MAKE_NONCOPYABLE(PowerObserver); + +public: + static PassOwnPtr<PowerObserver> create() + { + return adoptPtr(new PowerObserver); + } + ~PowerObserver(); + +private: + PowerObserver(); + + static void didReceiveSystemPowerNotification(void* context, io_service_t, uint32_t messageType, void* messageArgument); + void didReceiveSystemPowerNotification(io_service_t, uint32_t messageType, void* messageArgument); + + void restartSharedTimer(); + + io_connect_t m_powerConnection; + IONotificationPortRef m_notificationPort; + io_object_t m_notifierReference; +#ifdef IOKIT_WITHOUT_LIBDISPATCH + CFRunLoopSourceRef m_runLoopSource; +#else + dispatch_queue_t m_dispatchQueue; +#endif +}; + +PowerObserver::PowerObserver() + : m_powerConnection(0) + , m_notificationPort(0) + , m_notifierReference(0) +#ifdef IOKIT_WITHOUT_LIBDISPATCH + , m_runLoopSource(0) +#else + , m_dispatchQueue(dispatch_queue_create("com.apple.WebKit.PowerObserver", 0)) +#endif +{ + m_powerConnection = IORegisterForSystemPower(this, &m_notificationPort, didReceiveSystemPowerNotification, &m_notifierReference); + if (!m_powerConnection) + return; + +#ifdef IOKIT_WITHOUT_LIBDISPATCH + m_runLoopSource = IONotificationPortGetRunLoopSource(m_notificationPort); + CFRunLoopAddSource(CFRunLoopGetMain(), m_runLoopSource, kCFRunLoopCommonModes); +#else + IONotificationPortSetDispatchQueue(m_notificationPort, m_dispatchQueue); +#endif } -@interface WebCorePowerNotifier : NSObject -@end +PowerObserver::~PowerObserver() +{ + if (!m_powerConnection) + return; + +#ifdef IOKIT_WITHOUT_LIBDISPATCH + CFRunLoopRemoveSource(CFRunLoopGetMain(), m_runLoopSource, kCFRunLoopCommonModes); +#else + dispatch_release(m_dispatchQueue); +#endif + + IODeregisterForSystemPower(&m_notifierReference); + IOServiceClose(m_powerConnection); + IONotificationPortDestroy(m_notificationPort); +} -@implementation WebCorePowerNotifier +void PowerObserver::didReceiveSystemPowerNotification(void* context, io_service_t service, uint32_t messageType, void* messageArgument) +{ + static_cast<PowerObserver*>(context)->didReceiveSystemPowerNotification(service, messageType, messageArgument); +} -- (id)init +void PowerObserver::didReceiveSystemPowerNotification(io_service_t, uint32_t messageType, void* messageArgument) { - self = [super init]; - - if (self) - [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self - selector:@selector(didWake:) - name:NSWorkspaceDidWakeNotification - object:nil]; - - return self; + IOAllowPowerChange(m_powerConnection, reinterpret_cast<long>(messageArgument)); + + // We only care about the "wake from sleep" message. + if (messageType != kIOMessageSystemWillPowerOn) + return; + +#ifdef IOKIT_WITHOUT_LIBDISPATCH + restartSharedTimer(); +#else + // We need to restart the timer on the main thread. + CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, ^() { + restartSharedTimer(); + }); +#endif } -- (void)didWake:(NSNotification *)unusedNotification +void PowerObserver::restartSharedTimer() { - UNUSED_PARAM(unusedNotification); + ASSERT(CFRunLoopGetCurrent() == CFRunLoopGetMain()); - if (WebCore::sharedTimer) { - WebCore::stopSharedTimer(); - WebCore::timerFired(0, 0); - } -} + if (!sharedTimer) + return; -@end + stopSharedTimer(); + timerFired(0, 0); +} -namespace WebCore { +static PowerObserver* PowerObserver; void setSharedTimerFiredFunction(void (*f)()) { @@ -100,11 +180,8 @@ void setSharedTimerFireTime(double fireTime) sharedTimer = CFRunLoopTimerCreate(0, fireDate, 0, 0, 0, timerFired, 0); CFRunLoopAddTimer(CFRunLoopGetCurrent(), sharedTimer, kCFRunLoopCommonModes); - if (!powerNotifier) { - powerNotifier = [[WebCorePowerNotifier alloc] init]; - CFRetain(powerNotifier); - [powerNotifier release]; - } + if (!PowerObserver) + PowerObserver = PowerObserver::create().leakPtr(); } void stopSharedTimer() @@ -116,4 +193,4 @@ void stopSharedTimer() } } -} +} // namespace WebCore diff --git a/WebCore/platform/mac/WebCoreSystemInterface.h b/WebCore/platform/mac/WebCoreSystemInterface.h index 0cc7fd5..7cac443 100644 --- a/WebCore/platform/mac/WebCoreSystemInterface.h +++ b/WebCore/platform/mac/WebCoreSystemInterface.h @@ -94,6 +94,7 @@ extern CFReadStreamRef (*wkCreateCustomCFReadStream)(void *(*formCreate)(CFReadS void (*formSchedule)(CFReadStreamRef, CFRunLoopRef, CFStringRef, void *), void (*formUnschedule)(CFReadStreamRef, CFRunLoopRef, CFStringRef, void *), void *context); +extern CFStringRef (*wkCopyCFLocalizationPreferredName)(CFStringRef); extern NSString* (*wkCopyNSURLResponseStatusLine)(NSURLResponse*); extern id (*wkCreateNSURLConnectionDelegateProxy)(void); extern void (*wkDrawBezeledTextFieldCell)(NSRect, BOOL enabled); diff --git a/WebCore/platform/mac/WebCoreSystemInterface.mm b/WebCore/platform/mac/WebCoreSystemInterface.mm index 309a8fb..52e0064 100644 --- a/WebCore/platform/mac/WebCoreSystemInterface.mm +++ b/WebCore/platform/mac/WebCoreSystemInterface.mm @@ -29,6 +29,7 @@ void (*wkAdvanceDefaultButtonPulseAnimation)(NSButtonCell *); BOOL (*wkCGContextGetShouldSmoothFonts)(CGContextRef); +CFStringRef (*wkCopyCFLocalizationPreferredName)(CFStringRef); NSString* (*wkCopyNSURLResponseStatusLine)(NSURLResponse*); NSString* (*wkCreateURLPasteboardFlavorTypeName)(void); NSString* (*wkCreateURLNPasteboardFlavorTypeName)(void); |