165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2010, 2011 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "config.h" 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKView.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import "AttributedString.h" 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "ChunkedUpdateDrawingAreaProxy.h" 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "DataReference.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "DrawingAreaProxyImpl.h" 332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import "EditorState.h" 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "FindIndicator.h" 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "FindIndicatorWindow.h" 362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "LayerTreeContext.h" 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "Logging.h" 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "NativeWebKeyboardEvent.h" 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import "NativeWebMouseEvent.h" 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "PDFViewController.h" 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "PageClientImpl.h" 42ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#import "PasteboardTypes.h" 43ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#import "Region.h" 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "RunLoop.h" 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "TextChecker.h" 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "TextCheckerState.h" 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKAPICast.h" 482bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WKFullScreenWindowController.h" 492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WKPrintingView.h" 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKStringCF.h" 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKTextInputWindowController.h" 522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WKViewInternal.h" 532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WKViewPrivate.h" 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebContext.h" 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebEventFactory.h" 562bde8e466a4451c7319e3a072d118917957d6554Steve Block#import "WebFullScreenManagerProxy.h" 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebPage.h" 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebPageProxy.h" 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebProcessProxy.h" 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebSystemInterface.h" 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <QuartzCore/QuartzCore.h> 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/ColorMac.h> 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/DragController.h> 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/DragData.h> 652bde8e466a4451c7319e3a072d118917957d6554Steve Block#import <WebCore/LocalizedStrings.h> 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/FloatRect.h> 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/IntRect.h> 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/KeyboardEvent.h> 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/PlatformMouseEvent.h> 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/PlatformScreen.h> 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebKitSystemInterface.h> 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/RefPtr.h> 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/RetainPtr.h> 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@interface NSApplication (WKNSApplicationDetails) 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)speakString:(NSString *)string; 772bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)_setCurrentEvent:(NSEvent *)event; 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@interface NSObject (WKNSTextInputContextDetails) 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (BOOL)wantsToHandleMouseEvents; 822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (BOOL)handleMouseEvent:(NSEvent *)event; 832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@end 842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@interface NSWindow (WKNSWindowDetails) 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)_growBoxRect; 872bde8e466a4451c7319e3a072d118917957d6554Steve Block- (id)_growBoxOwner; 882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_setShowOpaqueGrowBoxForOwner:(id)owner; 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_updateGrowBoxForWindowFrameChange; 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebKit; 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore; 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef id <NSValidatedUserInterfaceItem> ValidationItem; 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef Vector<RetainPtr<ValidationItem> > ValidationVector; 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<String, ValidationVector> ValidationMap; 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstruct WKViewInterpretKeyEventsParameters { 1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool eventInterpretationHadSideEffects; 1052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool consumedByIM; 1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool executingSavedKeypressCommands; 1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Vector<KeypressCommand>* commands; 1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}; 1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@interface WKViewData : NSObject { 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@public 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OwnPtr<PageClientImpl> _pageClient; 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<WebPageProxy> _page; 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // For ToolTips. 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSToolTipTag _lastToolTipTag; 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch id _trackingRectOwner; 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void* _trackingRectUserData; 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<NSView> _layerHostingView; 1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RetainPtr<id> _remoteAccessibilityChild; 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // For asynchronous validation. 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ValidationMap _validationMap; 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OwnPtr<PDFViewController> _pdfViewController; 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OwnPtr<FindIndicatorWindow> _findIndicatorWindow; 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We keep here the event when resending it to 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // the application to distinguish the case of a new event from one 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // that has been already sent to WebCore. 1332bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<NSEvent> _keyDownEventBeingResent; 1342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* _interpretKeyEventsParameters; 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NSSize _resizeScrollOffset; 1372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The identifier of the plug-in we want to send complex text input to, or 0 if there is none. 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t _pluginComplexTextInputIdentifier; 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool _inBecomeFirstResponder; 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool _inResignFirstResponder; 143ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch NSEvent *_mouseDownEvent; 144ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch BOOL _ignoringMouseDraggedEvents; 145ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch BOOL _dragHasStarted; 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(GESTURE_EVENTS) 1482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block id _endGestureMonitor; 1492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 1502bde8e466a4451c7319e3a072d118917957d6554Steve Block 1512bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(FULLSCREEN_API) 1522bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<WKFullScreenWindowController> _fullScreenWindowController; 1532bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 1542bde8e466a4451c7319e3a072d118917957d6554Steve Block 1552bde8e466a4451c7319e3a072d118917957d6554Steve Block BOOL _hasSpellCheckerDocumentTag; 1562bde8e466a4451c7319e3a072d118917957d6554Steve Block NSInteger _spellCheckerDocumentTag; 1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BOOL _inSecureInputState; 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@interface WKResponderChainSink : NSResponder { 1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSResponder *_lastResponderInChain; 1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool _didReceiveUnhandledCommand; 1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (id)initWithResponderChain:(NSResponder *)chain; 1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)detach; 1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (bool)didReceiveUnhandledCommand; 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@implementation WKViewData 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@implementation WKView 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithFrame:(NSRect)frame 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [self initWithFrame:frame contextRef:toAPI(WebContext::sharedProcessContext())]; 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [self initWithFrame:frame contextRef:contextRef pageGroupRef:nil]; 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_registerDraggedTypes 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 188ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch NSMutableSet *types = [[NSMutableSet alloc] initWithArray:PasteboardTypes::forEditing()]; 189ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch [types addObjectsFromArray:PasteboardTypes::forURL()]; 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self registerForDraggedTypes:[types allObjects]]; 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [types release]; 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_updateRemoteAccessibilityRegistration:(BOOL)registerProcess 1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_SNOW_LEOPARD) 1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // When the tree is connected/disconnected, the remote accessibility registration 1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // needs to be updated with the pid of the remote process. If the process is going 1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // away, that information is not present in WebProcess 2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block pid_t pid = 0; 2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (registerProcess && _data->_page->process()) 2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block pid = _data->_page->process()->processIdentifier(); 2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block else if (!registerProcess) { 2042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block pid = WKAXRemoteProcessIdentifier(_data->_remoteAccessibilityChild.get()); 2052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_remoteAccessibilityChild = nil; 2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 2072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (pid) 2082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WKAXRegisterRemoteProcess(registerProcess, pid); 2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 2102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef pageGroupRef:(WKPageGroupRef)pageGroupRef 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch self = [super initWithFrame:frame]; 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!self) 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return nil; 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [NSApp registerServicesMenuSendTypes:PasteboardTypes::forSelection() returnTypes:PasteboardTypes::forEditing()]; 21981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch InitWebCoreSystemInterface(); 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RunLoop::initializeMainRunLoop(); 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:frame 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch options:(NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect) 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch owner:self 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch userInfo:nil]; 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self addTrackingArea:trackingArea]; 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [trackingArea release]; 22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data = [[WKViewData alloc] init]; 23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_pageClient = PageClientImpl::create(self); 23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page = toImpl(contextRef)->createWebPage(_data->_pageClient.get(), toImpl(pageGroupRef)); 23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->initializeWebPage(); 2352bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(FULLSCREEN_API) 2362bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_page->fullScreenManager()->setWebView(self); 2372bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 238ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_mouseDownEvent = nil; 239ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_ignoringMouseDraggedEvents = NO; 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _registerDraggedTypes]; 24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebContext::statistics().wkViewCount++; 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return self; 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)dealloc 24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->close(); 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!_data->_inSecureInputState); 2532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [_data release]; 2552bde8e466a4451c7319e3a072d118917957d6554Steve Block _data = nil; 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebContext::statistics().wkViewCount--; 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [super dealloc]; 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (WKPageRef)pageRef 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return toAPI(_data->_page.get()); 26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setDrawsBackground:(BOOL)drawsBackground 26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->setDrawsBackground(drawsBackground); 27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)drawsBackground 27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return _data->_page->drawsBackground(); 27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setDrawsTransparentBackground:(BOOL)drawsTransparentBackground 27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->setDrawsTransparentBackground(drawsTransparentBackground); 28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)drawsTransparentBackground 28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return _data->_page->drawsTransparentBackground(); 28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)acceptsFirstResponder 28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)becomeFirstResponder 29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSSelectionDirection direction = [[self window] keyViewSelectionDirection]; 29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_inBecomeFirstResponder = true; 2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _updateSecureInputState]; 29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsFocused); 3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_inBecomeFirstResponder = false; 30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (direction != NSDirectSelection) 30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->setInitialFocus(direction == NSSelectingNext); 30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)resignFirstResponder 31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_inResignFirstResponder = true; 3122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (_data->_inSecureInputState) { 3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch DisableSecureEventInput(); 3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_inSecureInputState = NO; 3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsFocused); 3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_inResignFirstResponder = false; 32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)viewWillStartLiveResize 3252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 3262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_page->viewWillStartLiveResize(); 3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 3282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)viewDidEndLiveResize 3302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 3312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_page->viewWillEndLiveResize(); 3322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 3332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isFlipped 33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)setFrame:(NSRect)rect andScrollBy:(NSSize)offset 3402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 3412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(NSEqualSizes(_data->_resizeScrollOffset, NSZeroSize)); 3422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 3432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_resizeScrollOffset = offset; 3442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self setFrame:rect]; 3452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 3462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setFrameSize:(NSSize)size 34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [super setFrameSize:size]; 35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (![self frameSizeUpdatesDisabled]) 3522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self _setDrawingAreaSize:size]; 35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_updateWindowAndViewFrames 35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow *window = [self window]; 35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(window); 35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRect windowFrameInScreenCoordinates = [window frame]; 36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRect viewFrameInWindowCoordinates = [self convertRect:[self frame] toView:nil]; 36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSPoint accessibilityPosition = [[self accessibilityAttributeValue:NSAccessibilityPositionAttribute] pointValue]; 36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->windowAndViewFramesChanged(enclosingIntRect(windowFrameInScreenCoordinates), enclosingIntRect(viewFrameInWindowCoordinates), IntPoint(accessibilityPosition)); 36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)renewGState 36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Hide the find indicator. 37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_findIndicatorWindow = nullptr; 37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Update the view frame. 37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([self window]) 37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _updateWindowAndViewFrames]; 37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [super renewGState]; 37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<SEL, String> SelectorNameMap; 38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Map selectors into Editor command names. 38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// This is not needed for any selectors that have the same name as the Editor command. 38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const SelectorNameMap* createSelectorExceptionMap() 38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch SelectorNameMap* map = new HashMap<SEL, String>; 38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map->add(@selector(insertNewlineIgnoringFieldEditor:), "InsertNewline"); 38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map->add(@selector(insertParagraphSeparator:), "InsertNewline"); 38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map->add(@selector(insertTabIgnoringFieldEditor:), "InsertTab"); 39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map->add(@selector(pageDown:), "MovePageDown"); 39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map->add(@selector(pageDownAndModifySelection:), "MovePageDownAndModifySelection"); 39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map->add(@selector(pageUp:), "MovePageUp"); 39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch map->add(@selector(pageUpAndModifySelection:), "MovePageUpAndModifySelection"); 3942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block map->add(@selector(scrollPageDown:), "ScrollPageForward"); 3952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block map->add(@selector(scrollPageUp:), "ScrollPageBackward"); 39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return map; 39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic String commandNameForSelector(SEL selector) 40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Check the exception map first. 40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static const SelectorNameMap* exceptionMap = createSelectorExceptionMap(); 40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch SelectorNameMap::const_iterator it = exceptionMap->find(selector); 40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (it != exceptionMap->end()) 40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return it->second; 40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Remove the trailing colon. 40965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // No need to capitalize the command name since Editor command names are 41065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // not case sensitive. 41165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const char* selectorName = sel_getName(selector); 41265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t selectorNameLength = strlen(selectorName); 41365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (selectorNameLength < 2 || selectorName[selectorNameLength - 1] != ':') 41465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return String(); 41565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return String(selectorName, selectorNameLength - 1); 41665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 41865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Editing commands 41965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 42065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define WEBCORE_COMMAND(command) - (void)command:(id)sender { _data->_page->executeEditCommand(commandNameForSelector(_cmd)); } 42165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4222fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignCenter) 4232fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignJustified) 4242fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignLeft) 4252fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignRight) 42665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(copy) 42765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(cut) 42865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(delete) 4292fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteBackward) 4302fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteBackwardByDecomposingPreviousCharacter) 4312fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteForward) 4322fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToBeginningOfLine) 4332fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToBeginningOfParagraph) 4342fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToEndOfLine) 4352fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToEndOfParagraph) 4362fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToMark) 4372fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteWordBackward) 4382fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteWordForward) 4392fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(ignoreSpelling) 4402fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(indent) 4412fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertBacktab) 4422fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertLineBreak) 4432fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertNewline) 4442fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertNewlineIgnoringFieldEditor) 4452fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertParagraphSeparator) 4462fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertTab) 4472fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertTabIgnoringFieldEditor) 4482fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(makeTextWritingDirectionLeftToRight) 4492fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(makeTextWritingDirectionNatural) 4502fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(makeTextWritingDirectionRightToLeft) 4512fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveBackward) 4522fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveBackwardAndModifySelection) 4532fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveDown) 4542fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveDownAndModifySelection) 4552fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveForward) 4562fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveForwardAndModifySelection) 4572fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveLeft) 4582fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveLeftAndModifySelection) 4592fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveParagraphBackwardAndModifySelection) 4602fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveParagraphForwardAndModifySelection) 4612fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveRight) 4622fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveRightAndModifySelection) 4632fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfDocument) 4642fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfDocumentAndModifySelection) 4652fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfLine) 4662fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfLineAndModifySelection) 4672fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfParagraph) 4682fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfParagraphAndModifySelection) 4692fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfSentence) 4702fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfSentenceAndModifySelection) 4712fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfDocument) 4722fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfDocumentAndModifySelection) 4732fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfLine) 4742fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfLineAndModifySelection) 4752fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfParagraph) 4762fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfParagraphAndModifySelection) 4772fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfSentence) 4782fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfSentenceAndModifySelection) 4792fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToLeftEndOfLine) 4802fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToLeftEndOfLineAndModifySelection) 4812fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToRightEndOfLine) 4822fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToRightEndOfLineAndModifySelection) 4832fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveUp) 4842fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveUpAndModifySelection) 4852fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordBackward) 4862fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordBackwardAndModifySelection) 4872fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordForward) 4882fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordForwardAndModifySelection) 4892fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordLeft) 4902fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordLeftAndModifySelection) 4912fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordRight) 4922fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordRightAndModifySelection) 4932fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(outdent) 4942fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageDown) 4952fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageDownAndModifySelection) 4962fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageUp) 4972fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageUpAndModifySelection) 4982fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(paste) 49965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(pasteAsPlainText) 5002fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollPageDown) 5012fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollPageUp) 5022fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollToBeginningOfDocument) 5032fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollToEndOfDocument) 50465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(selectAll) 5052fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectLine) 5062fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectParagraph) 5072fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectSentence) 5082fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectToMark) 5092fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectWord) 5102fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(setMark) 5112fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(subscript) 5122fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(superscript) 5132fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(swapWithMark) 51465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(takeFindStringFromSelection) 5152fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(transpose) 5162fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(underline) 5172fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(unscript) 5182fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(yank) 5192fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(yankAndSelect) 52065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 52165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#undef WEBCORE_COMMAND 52265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5232bde8e466a4451c7319e3a072d118917957d6554Steve Block// This method is needed to support Mac OS X services. 5242bde8e466a4451c7319e3a072d118917957d6554Steve Block 52581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pasteboard types:(NSArray *)types 52681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 52781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Vector<String> pasteboardTypes; 52881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch size_t numTypes = [types count]; 52981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (size_t i = 0; i < numTypes; ++i) 53081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch pasteboardTypes.append([types objectAtIndex:i]); 53181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return _data->_page->writeSelectionToPasteboard([pasteboard name], pasteboardTypes); 53281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 53381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5342bde8e466a4451c7319e3a072d118917957d6554Steve Block// This method is needed to support Mac OS X services. 5352bde8e466a4451c7319e3a072d118917957d6554Steve Block 53681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType 53781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 5382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BOOL isValidSendType = !sendType || ([PasteboardTypes::forSelection() containsObject:sendType] && !_data->_page->editorState().selectionIsNone); 53981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch BOOL isValidReturnType = NO; 54081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!returnType) 54181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch isValidReturnType = YES; 5422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else if ([PasteboardTypes::forEditing() containsObject:returnType] && _data->_page->editorState().isContentEditable) { 54381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // We can insert strings in any editable context. We can insert other types, like images, only in rich edit contexts. 5442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch isValidReturnType = _data->_page->editorState().isContentRichlyEditable || [returnType isEqualToString:NSStringPboardType]; 54581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 54681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (isValidSendType && isValidReturnType) 54781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return self; 54881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return [[self nextResponder] validRequestorForSendType:sendType returnType:returnType]; 54981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 55081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5512bde8e466a4451c7319e3a072d118917957d6554Steve Block// This method is needed to support Mac OS X services. 5522bde8e466a4451c7319e3a072d118917957d6554Steve Block 5532bde8e466a4451c7319e3a072d118917957d6554Steve Block- (BOOL)readSelectionFromPasteboard:(NSPasteboard *)pasteboard 5542bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 5552bde8e466a4451c7319e3a072d118917957d6554Steve Block return _data->_page->readSelectionFromPasteboard([pasteboard name]); 5562bde8e466a4451c7319e3a072d118917957d6554Steve Block} 5572bde8e466a4451c7319e3a072d118917957d6554Steve Block 5582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block/* 5592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5602fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWhen possible, editing-related methods should be implemented in WebCore with the 5612fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockEditorCommand mechanism and invoked via WEBCORE_COMMAND, rather than implementing 5622fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockindividual methods here with Mac-specific code. 5632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5642fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockEditing-related methods still unimplemented that are implemented in WebKit1: 5652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)capitalizeWord:(id)sender; 5672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)centerSelectionInVisibleArea:(id)sender; 5682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)changeFont:(id)sender; 5692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)complete:(id)sender; 5702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)copyFont:(id)sender; 5712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)lowercaseWord:(id)sender; 5722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)makeBaseWritingDirectionLeftToRight:(id)sender; 5732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)makeBaseWritingDirectionNatural:(id)sender; 5742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)makeBaseWritingDirectionRightToLeft:(id)sender; 5752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)pasteFont:(id)sender; 5762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)scrollLineDown:(id)sender; 5772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)scrollLineUp:(id)sender; 5782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)showGuessPanel:(id)sender; 5792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)uppercaseWord:(id)sender; 5802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5812fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSome other editing-related methods still unimplemented: 5822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)changeCaseOfLetter:(id)sender; 5842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)copyRuler:(id)sender; 5852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)insertContainerBreak:(id)sender; 5862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)insertDoubleQuoteIgnoringSubstitution:(id)sender; 5872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)insertSingleQuoteIgnoringSubstitution:(id)sender; 5882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)pasteRuler:(id)sender; 5892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)toggleRuler:(id)sender; 5902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)transposeWords:(id)sender; 5912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 5922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block*/ 5932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 59465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Menu items validation 59565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 59665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NSMenuItem *menuItem(id <NSValidatedUserInterfaceItem> item) 59765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 59865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (![(NSObject *)item isKindOfClass:[NSMenuItem class]]) 59965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return nil; 60065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return (NSMenuItem *)item; 60165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 60265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 60365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NSToolbarItem *toolbarItem(id <NSValidatedUserInterfaceItem> item) 60465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 60565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (![(NSObject *)item isKindOfClass:[NSToolbarItem class]]) 60665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return nil; 60765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return (NSToolbarItem *)item; 60865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 61081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic void validateCommandCallback(WKStringRef commandName, bool isEnabled, int32_t state, WKErrorRef error, void* context) 61181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 61281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // If the process exits before the command can be validated, we'll be called back with an error. 61381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (error) 61481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 61581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 61681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WKView* wkView = static_cast<WKView*>(context); 61781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(wkView); 61881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 61981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [wkView _setUserInterfaceItemState:nsStringFromWebCoreString(toImpl(commandName)->string()) enabled:isEnabled state:state]; 62081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 62181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item 62365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch SEL action = [item action]; 62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(showGuessPanel:)) { 6272bde8e466a4451c7319e3a072d118917957d6554Steve Block if (NSMenuItem *menuItem = ::menuItem(item)) 6282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [menuItem setTitle:contextMenuItemTagShowSpellingPanel(![[[NSSpellChecker sharedSpellChecker] spellingPanel] isVisible])]; 6292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 63065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 63165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 63265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(checkSpelling:) || action == @selector(changeSpelling:)) 6332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleContinuousSpellChecking:)) { 63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool enabled = TextChecker::isContinuousSpellCheckingAllowed(); 63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = enabled && TextChecker::state().isContinuousSpellCheckingEnabled; 63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return enabled; 64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleGrammarChecking:)) { 64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = TextChecker::state().isGrammarCheckingEnabled; 64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 64765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 64865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleAutomaticSpellingCorrection:)) { 64965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = TextChecker::state().isAutomaticSpellingCorrectionEnabled; 65065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 6512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 65265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(orderFrontSubstitutionsPanel:)) { 6552bde8e466a4451c7319e3a072d118917957d6554Steve Block if (NSMenuItem *menuItem = ::menuItem(item)) 6562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [menuItem setTitle:contextMenuItemTagShowSubstitutions(![[[NSSpellChecker sharedSpellChecker] substitutionsPanel] isVisible])]; 6572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 66065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleSmartInsertDelete:)) { 66165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = _data->_page->isSmartInsertDeleteEnabled(); 66265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 6632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 66465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 66565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 66665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleAutomaticQuoteSubstitution:)) { 66765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = TextChecker::state().isAutomaticQuoteSubstitutionEnabled; 66865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 6692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 67065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 67265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleAutomaticDashSubstitution:)) { 67365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = TextChecker::state().isAutomaticDashSubstitutionEnabled; 67465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 6752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 67665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 67765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 67865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleAutomaticLinkDetection:)) { 67965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = TextChecker::state().isAutomaticLinkDetectionEnabled; 68065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 6812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 68265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 68365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 68465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(toggleAutomaticTextReplacement:)) { 68565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool checked = TextChecker::state().isAutomaticTextReplacementEnabled; 68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:checked ? NSOnState : NSOffState]; 6872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().isContentEditable; 68865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 68965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 69065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(uppercaseWord:) || action == @selector(lowercaseWord:) || action == @selector(capitalizeWord:)) 6912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _data->_page->editorState().selectionIsRange && _data->_page->editorState().isContentEditable; 69265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 69365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (action == @selector(stopSpeaking:)) 69465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [NSApp isSpeaking]; 69565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 69665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Next, handle editor commands. Start by returning YES for anything that is not an editor command. 69765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Returning YES is the default thing to do in an AppKit validate method for any selector that is not recognized. 69865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String commandName = commandNameForSelector([item action]); 69965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!Editor::commandIsSupportedFromMenuOrKeyBinding(commandName)) 70065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 70165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 70265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Add this item to the vector of items for a given command that are awaiting validation. 70365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch pair<ValidationMap::iterator, bool> addResult = _data->_validationMap.add(commandName, ValidationVector()); 70465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch addResult.first->second.append(item); 70565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (addResult.second) { 70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If we are not already awaiting validation for this command, start the asynchronous validation process. 70765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: Theoretically, there is a race here; when we get the answer it might be old, from a previous time 70865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // we asked for the same command; there is no guarantee the answer is still valid. 70981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _data->_page->validateCommand(commandName, ValidateCommandCallback::create(self, validateCommandCallback)); 71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Treat as enabled until we get the result back from the web process and _setUserInterfaceItemState is called. 71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME <rdar://problem/8803459>: This means disabled items will flash enabled at first for a moment. 71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // But returning NO here would be worse; that would make keyboard commands such as command-C fail. 71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void speakString(WKStringRef string, WKErrorRef error, void*) 71965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 72065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (error) 72165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 72265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!string) 72365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSString *convertedString = toImpl(string)->string(); 72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [NSApp speakString:convertedString]; 72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)startSpeaking:(id)sender 73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->getSelectionOrContentsAsString(StringCallback::create(0, speakString)); 73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)stopSpeaking:(id)sender 73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 73665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [NSApp stopSpeaking:sender]; 73765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 73865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 73965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)showGuessPanel:(id)sender 74065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 74165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker]; 74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!checker) { 74365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG_ERROR("No NSSpellChecker"); 74465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 74565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 74665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 74765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSPanel *spellingPanel = [checker spellingPanel]; 74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([spellingPanel isVisible]) { 74965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [spellingPanel orderOut:sender]; 75065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 75265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->advanceToNextMisspelling(true); 75465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [spellingPanel orderFront:sender]; 75565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 75665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 75765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)checkSpelling:(id)sender 75865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 75965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->advanceToNextMisspelling(false); 76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 76165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)changeSpelling:(id)sender 76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSString *word = [[sender selectedCell] stringValue]; 76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 76665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->changeSpellingToWord(word); 76765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 76865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 76965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleContinuousSpellChecking:(id)sender 77065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 77165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool spellCheckingEnabled = !TextChecker::state().isContinuousSpellCheckingEnabled; 77265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setContinuousSpellCheckingEnabled(spellCheckingEnabled); 77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 77465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 77565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 77781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (BOOL)isGrammarCheckingEnabled 77881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 77981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return TextChecker::state().isGrammarCheckingEnabled; 78081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 78181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 78281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (void)setGrammarCheckingEnabled:(BOOL)flag 78381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 78481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (static_cast<bool>(flag) == TextChecker::state().isGrammarCheckingEnabled) 78581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 78681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 78781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch TextChecker::setGrammarCheckingEnabled(flag); 78881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _data->_page->process()->updateTextCheckerState(); 78981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 79081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleGrammarChecking:(id)sender 79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool grammarCheckingEnabled = !TextChecker::state().isGrammarCheckingEnabled; 79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setGrammarCheckingEnabled(grammarCheckingEnabled); 79565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 79665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 79765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleAutomaticSpellingCorrection:(id)sender 80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticSpellingCorrectionEnabled(!TextChecker::state().isAutomaticSpellingCorrectionEnabled); 80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)orderFrontSubstitutionsPanel:(id)sender 80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker]; 80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!checker) { 81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG_ERROR("No NSSpellChecker"); 81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSPanel *substitutionsPanel = [checker substitutionsPanel]; 81565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([substitutionsPanel isVisible]) { 81665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [substitutionsPanel orderOut:sender]; 81765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 81965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [substitutionsPanel orderFront:sender]; 82065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 82265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleSmartInsertDelete:(id)sender 82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->setSmartInsertDeleteEnabled(!_data->_page->isSmartInsertDeleteEnabled()); 82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticQuoteSubstitutionEnabled 82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return TextChecker::state().isAutomaticQuoteSubstitutionEnabled; 83065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 83165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticQuoteSubstitutionEnabled:(BOOL)flag 83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 83465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (static_cast<bool>(flag) == TextChecker::state().isAutomaticQuoteSubstitutionEnabled) 83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticQuoteSubstitutionEnabled(flag); 83865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 84165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticQuoteSubstitution:(id)sender 84265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 84365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticQuoteSubstitutionEnabled(!TextChecker::state().isAutomaticQuoteSubstitutionEnabled); 84465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 84565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 84665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 84765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticDashSubstitutionEnabled 84865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 84965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return TextChecker::state().isAutomaticDashSubstitutionEnabled; 85065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 85165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 85265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticDashSubstitutionEnabled:(BOOL)flag 85365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 85465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (static_cast<bool>(flag) == TextChecker::state().isAutomaticDashSubstitutionEnabled) 85565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 85665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticDashSubstitutionEnabled(flag); 85865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 85965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 86165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticDashSubstitution:(id)sender 86265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 86365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticDashSubstitutionEnabled(!TextChecker::state().isAutomaticDashSubstitutionEnabled); 86465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 86565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 86665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 86765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticLinkDetectionEnabled 86865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 86965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return TextChecker::state().isAutomaticLinkDetectionEnabled; 87065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 87165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 87265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticLinkDetectionEnabled:(BOOL)flag 87365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 87465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (static_cast<bool>(flag) == TextChecker::state().isAutomaticLinkDetectionEnabled) 87565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 87665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 87765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticLinkDetectionEnabled(flag); 87865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 87965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 88065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 88165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticLinkDetection:(id)sender 88265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 88365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticLinkDetectionEnabled(!TextChecker::state().isAutomaticLinkDetectionEnabled); 88465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 88565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 88665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 88765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticTextReplacementEnabled 88865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 88965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return TextChecker::state().isAutomaticTextReplacementEnabled; 89065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 89165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 89265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticTextReplacementEnabled:(BOOL)flag 89365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 89465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (static_cast<bool>(flag) == TextChecker::state().isAutomaticTextReplacementEnabled) 89565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 89665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 89765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticTextReplacementEnabled(flag); 89865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 89965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 90065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 90165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticTextReplacement:(id)sender 90265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 90365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch TextChecker::setAutomaticTextReplacementEnabled(!TextChecker::state().isAutomaticTextReplacementEnabled); 90465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->process()->updateTextCheckerState(); 90565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 90665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 90765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)uppercaseWord:(id)sender 90865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 90965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->uppercaseWord(); 91065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 91165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 91265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)lowercaseWord:(id)sender 91365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 91465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->lowercaseWord(); 91565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 91665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 91765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)capitalizeWord:(id)sender 91865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 91965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->capitalizeWord(); 92065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 92165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 92265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Events 92365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 92465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Override this so that AppKit will send us arrow keys as key down events so we can 92565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// support them via the key bindings mechanism. 92665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_wantsKeyDownForEvent:(NSEvent *)event 92765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 92865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 92965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 93065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 931ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)_setMouseDownEvent:(NSEvent *)event 932ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 933ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch ASSERT(!event || [event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown); 934ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 935ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (event == _data->_mouseDownEvent) 936ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return; 937ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 938ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch [_data->_mouseDownEvent release]; 939ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_mouseDownEvent = [event retain]; 940ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 941ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 9422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define NATIVE_MOUSE_EVENT_HANDLER(Selector) \ 9432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch - (void)Selector:(NSEvent *)theEvent \ 9442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { \ 9452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ([[self inputContext] handleEvent:theEvent]) { \ 9462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "%s was handled by text input context", String(#Selector).substring(0, String(#Selector).find("Internal")).ascii().data()); \ 9472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; \ 9482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } \ 9492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NativeWebMouseEvent webEvent(theEvent, self); \ 9502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->handleMouseEvent(webEvent); \ 9512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 9522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 9532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(mouseEntered) 9542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(mouseExited) 9552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(mouseMovedInternal) 9562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(mouseDownInternal) 9572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(mouseUpInternal) 9582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(mouseDraggedInternal) 9592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(otherMouseDown) 9602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(otherMouseDragged) 9612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(otherMouseMoved) 9622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(otherMouseUp) 9632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(rightMouseDown) 9642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(rightMouseDragged) 9652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNATIVE_MOUSE_EVENT_HANDLER(rightMouseUp) 9662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 9672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#undef NATIVE_MOUSE_EVENT_HANDLER 9682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 96965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define EVENT_HANDLER(Selector, Type) \ 97065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch - (void)Selector:(NSEvent *)theEvent \ 97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { \ 97265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Web##Type##Event webEvent = WebEventFactory::createWeb##Type##Event(theEvent, self); \ 97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->handle##Type##Event(webEvent); \ 97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 97565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 97665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(scrollWheel, Wheel) 97765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#undef EVENT_HANDLER 97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)mouseMoved:(NSEvent *)event 981ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 9822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // When a view is first responder, it gets mouse moved events even when the mouse is outside its visible rect. 9832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (self == [[self window] firstResponder] && !NSPointInRect([self convertPoint:[event locationInWindow] fromView:nil], [self visibleRect])) 984ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return; 9852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 9862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self mouseMovedInternal:event]; 987ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 98865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 989ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)mouseDown:(NSEvent *)event 990ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 991ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch [self _setMouseDownEvent:event]; 992ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_ignoringMouseDraggedEvents = NO; 993ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_dragHasStarted = NO; 9942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self mouseDownInternal:event]; 995ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 99665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 997ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)mouseUp:(NSEvent *)event 998ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 999ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch [self _setMouseDownEvent:nil]; 10002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self mouseUpInternal:event]; 1001ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 1002ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 1003ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)mouseDragged:(NSEvent *)event 1004ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 1005ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (_data->_ignoringMouseDraggedEvents) 1006ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return; 10072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self mouseDraggedInternal:event]; 10082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 10092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (BOOL)acceptsFirstMouse:(NSEvent *)event 10112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 10122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // There's a chance that responding to this event will run a nested event loop, and 10132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // fetching a new event might release the old one. Retaining and then autoreleasing 10142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // the current event prevents that from causing a problem inside WebKit or AppKit code. 10152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[event retain] autorelease]; 10162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (![self hitTest:[event locationInWindow]]) 10182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return NO; 10192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _setMouseDownEvent:event]; 10212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool result = _data->_page->acceptsFirstMouse([event eventNumber], WebEventFactory::createWebMouseEvent(event, self)); 10222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _setMouseDownEvent:nil]; 10232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return result; 10242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 10252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent *)event 10272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 10282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // If this is the active window or we don't have a range selection, there is no need to perform additional checks 10292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // and we can avoid making a synchronous call to the WebProcess. 10302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ([[self window] isKeyWindow] || _data->_page->editorState().selectionIsNone || !_data->_page->editorState().selectionIsRange) 10312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return NO; 10322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // There's a chance that responding to this event will run a nested event loop, and 10342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // fetching a new event might release the old one. Retaining and then autoreleasing 10352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // the current event prevents that from causing a problem inside WebKit or AppKit code. 10362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[event retain] autorelease]; 10372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (![self hitTest:[event locationInWindow]]) 10392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return NO; 10402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _setMouseDownEvent:event]; 10422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool result = _data->_page->shouldDelayWindowOrderingForEvent(WebEventFactory::createWebMouseEvent(event, self)); 10432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _setMouseDownEvent:nil]; 10442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return result; 1045ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 104665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(GESTURE_EVENTS) 10482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10492fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const short kIOHIDEventTypeScroll = 6; 10502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)shortCircuitedEndGestureWithEvent:(NSEvent *)event 10522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 10532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if ([event subtype] != kIOHIDEventTypeScroll) 10542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 10552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebGestureEvent webEvent = WebEventFactory::createWebGestureEvent(event, self); 10572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_page->handleGestureEvent(webEvent); 10582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (_data->_endGestureMonitor) { 10602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [NSEvent removeMonitor:_data->_endGestureMonitor]; 10612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_endGestureMonitor = nil; 10622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 10632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 10642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)beginGestureWithEvent:(NSEvent *)event 10662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 10672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if ([event subtype] != kIOHIDEventTypeScroll) 10682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 10692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebGestureEvent webEvent = WebEventFactory::createWebGestureEvent(event, self); 10712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_page->handleGestureEvent(webEvent); 10722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 10732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!_data->_endGestureMonitor) { 10742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_endGestureMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskEndGesture handler:^(NSEvent *blockEvent) { 10752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self shortCircuitedEndGestureWithEvent:blockEvent]; 10762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return blockEvent; 10772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }]; 10782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 10792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 10802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 10812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 108265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)doCommandBySelector:(SEL)selector 108365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 10842bde8e466a4451c7319e3a072d118917957d6554Steve Block LOG(TextInput, "doCommandBySelector:\"%s\"", sel_getName(selector)); 10852bde8e466a4451c7319e3a072d118917957d6554Steve Block 10862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* parameters = _data->_interpretKeyEventsParameters; 10872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters) 10882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->consumedByIM = false; 10892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // As in insertText:replacementRange:, we assume that the call comes from an input method if there is marked text. 10912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool isFromInputMethod = _data->_page->editorState().hasComposition; 10922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 10932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters && !isFromInputMethod) 10942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->commands->append(KeypressCommand(NSStringFromSelector(selector))); 10952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else { 10962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: Send the command to Editor synchronously and only send it along the 10972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // responder chain if it's a selector that does not correspond to an editing command. 10982bde8e466a4451c7319e3a072d118917957d6554Steve Block [super doCommandBySelector:selector]; 10992bde8e466a4451c7319e3a072d118917957d6554Steve Block } 110065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 110165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 110265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)insertText:(id)string 110365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 11042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Unlike and NSTextInputClient variant with replacementRange, this NSResponder method is called when there is no input context, 11052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // so text input processing isn't performed. We are not going to actually insert any text in that case, but saving an insertText 11062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // command ensures that a keypress event is dispatched as appropriate. 11072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self insertText:string replacementRange:NSMakeRange(NSNotFound, 0)]; 11082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 11092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 11102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)insertText:(id)string replacementRange:(NSRange)replacementRange 11112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 11122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BOOL isAttributedString = [string isKindOfClass:[NSAttributedString class]]; 11132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isAttributedString || [string isKindOfClass:[NSString class]]); 11142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 11152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (replacementRange.location != NSNotFound) 11162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "insertText:\"%@\" replacementRange:(%u, %u)", isAttributedString ? [string string] : string, replacementRange.location, replacementRange.length); 11172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else 11182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "insertText:\"%@\"", isAttributedString ? [string string] : string); 11192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* parameters = _data->_interpretKeyEventsParameters; 11202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters) 11212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->consumedByIM = false; 11222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 112365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSString *text; 11242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool isFromInputMethod = _data->_page->editorState().hasComposition; 112565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 112665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (isAttributedString) { 11272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: We ignore most attributes from the string, so for example inserting from Character Palette loses font and glyph variation data. 112865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch text = [string string]; 112965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else 113065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch text = string; 11312bde8e466a4451c7319e3a072d118917957d6554Steve Block 11322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // insertText can be called for several reasons: 11332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // - If it's from normal key event processing (including key bindings), we may need to save the action to perform it later. 11342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // - If it's from an input method, then we should go ahead and insert the text now. We assume it's from the input method if we have marked text. 11352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: In theory, this could be wrong for some input methods, so we should try to find another way to determine if the call is from the input method. 11362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // - If it's sent outside of keyboard event processing (e.g. from Character Viewer, or when confirming an inline input area with a mouse), 11372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // then we also execute it immediately, as there will be no other chance. 11382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters && !isFromInputMethod) { 11392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(replacementRange.location == NSNotFound); 11402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->commands->append(KeypressCommand("insertText:", text)); 11412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 11422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 11432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 114465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String eventText = text; 11452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch eventText.replace(NSBackTabCharacter, NSTabCharacter); // same thing is done in KeyEventMac.mm in WebCore 11462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool eventHandled = _data->_page->insertText(eventText, replacementRange.location, NSMaxRange(replacementRange)); 11472bde8e466a4451c7319e3a072d118917957d6554Steve Block 11482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters) 11492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->eventInterpretationHadSideEffects |= eventHandled; 115065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 115165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 115265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_handleStyleKeyEquivalent:(NSEvent *)event 115365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 11542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!_data->_page->editorState().isContentEditable) 11552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return NO; 11562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 115765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) != NSCommandKeyMask) 115865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 115965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 116065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Here we special case cmd+b and cmd+i but not cmd+u, for historic reason. 116165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // This should not be changed, since it could break some Mac applications that 116265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // rely on this inherent behavior. 116365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // See https://bugs.webkit.org/show_bug.cgi?id=24943 116465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 116565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSString *string = [event characters]; 116665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([string caseInsensitiveCompare:@"b"] == NSOrderedSame) { 116765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->executeEditCommand("ToggleBold"); 116865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 116965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 117065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([string caseInsensitiveCompare:@"i"] == NSOrderedSame) { 117165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->executeEditCommand("ToggleItalic"); 117265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 117365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 117465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 117565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 117665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 117765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 117865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)performKeyEquivalent:(NSEvent *)event 117965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 118065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // There's a chance that responding to this event will run a nested event loop, and 118165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // fetching a new event might release the old one. Retaining and then autoreleasing 118265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // the current event prevents that from causing a problem inside WebKit or AppKit code. 118365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[event retain] autorelease]; 118465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 118565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch BOOL eventWasSentToWebCore = (_data->_keyDownEventBeingResent == event); 118665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 118765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Pass key combos through WebCore if there is a key binding available for 118865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // this event. This lets web pages have a crack at intercepting key-modified keypresses. 118965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // But don't do it if we have already handled the event. 119065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Pressing Esc results in a fake event being sent - don't pass it to WebCore. 119165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!eventWasSentToWebCore && event == [NSApp currentEvent] && self == [[self window] firstResponder]) { 119265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->handleKeyboardEvent(NativeWebKeyboardEvent(event, self)); 119365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 119465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 119565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 119665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [self _handleStyleKeyEquivalent:event] || [super performKeyEquivalent:event]; 119765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 119865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 119965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)keyUp:(NSEvent *)theEvent 120065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 120165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->handleKeyboardEvent(NativeWebKeyboardEvent(theEvent, self)); 120265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 120365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 120465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)keyDown:(NSEvent *)theEvent 120565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12062bde8e466a4451c7319e3a072d118917957d6554Steve Block // There's a chance that responding to this event will run a nested event loop, and 12072bde8e466a4451c7319e3a072d118917957d6554Steve Block // fetching a new event might release the old one. Retaining and then autoreleasing 12082bde8e466a4451c7319e3a072d118917957d6554Steve Block // the current event prevents that from causing a problem inside WebKit or AppKit code. 12092bde8e466a4451c7319e3a072d118917957d6554Steve Block [[theEvent retain] autorelease]; 12102bde8e466a4451c7319e3a072d118917957d6554Steve Block 121165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (_data->_pluginComplexTextInputIdentifier) { 121265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Try feeding the keyboard event directly to the plug-in. 121365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSString *string = nil; 121465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([[WKTextInputWindowController sharedTextInputWindowController] interpretKeyEvent:theEvent string:&string]) { 121565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (string) 121665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->sendComplexTextInputToPlugin(_data->_pluginComplexTextInputIdentifier, string); 121765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 121865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 121965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 122065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 122165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We could be receiving a key down from AppKit if we have re-sent an event 122265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // that maps to an action that is currently unavailable (for example a copy when 122365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // there is no range selection). 122465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If this is the case we should ignore the key down. 122565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (_data->_keyDownEventBeingResent == theEvent) { 122665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [super keyDown:theEvent]; 122765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 122865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 122965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->handleKeyboardEvent(NativeWebKeyboardEvent(theEvent, self)); 123065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 123165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)flagsChanged:(NSEvent *)theEvent 12332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 12342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // There's a chance that responding to this event will run a nested event loop, and 12352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // fetching a new event might release the old one. Retaining and then autoreleasing 12362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // the current event prevents that from causing a problem inside WebKit or AppKit code. 12372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[theEvent retain] autorelease]; 12382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch unsigned short keyCode = [theEvent keyCode]; 12402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Don't make an event from the num lock and function keys 12422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!keyCode || keyCode == 10 || keyCode == 63) 12432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 12442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->handleKeyboardEvent(NativeWebKeyboardEvent(theEvent, self)); 12462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 12472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)_executeSavedKeypressCommands 12492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 12502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* parameters = _data->_interpretKeyEventsParameters; 12512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!parameters || parameters->commands->isEmpty()) 12522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 12532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // We could be called again if the execution of one command triggers a call to selectedRange. 12552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // In this case, the state is up to date, and we don't need to execute any more saved commands to return a result. 12562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters->executingSavedKeypressCommands) 12572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 12582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->executingSavedKeypressCommands = true; 12602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->eventInterpretationHadSideEffects |= _data->_page->executeKeypressCommands(*parameters->commands); 12612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->commands->clear(); 12622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->executingSavedKeypressCommands = false; 12632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 12642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (NSTextInputContext *)inputContext 12662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 12672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* parameters = _data->_interpretKeyEventsParameters; 12682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (_data->_pluginComplexTextInputIdentifier && !parameters) 127065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [[WKTextInputWindowController sharedTextInputWindowController] inputContext]; 127165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 12722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Disable text input machinery when in non-editable content. An invisible inline input area affects performance, and can prevent Expose from working. 12732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!_data->_page->editorState().isContentEditable) 12742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return nil; 12752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 127665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [super inputContext]; 127765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 127865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 127965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRange)selectedRange 128065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 12822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch uint64_t selectionStart; 12842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch uint64_t selectionLength; 12852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->getSelectedRange(selectionStart, selectionLength); 12862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSRange result = NSMakeRange(selectionStart, selectionLength); 12882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (result.location == NSNotFound) 12892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "selectedRange -> (NSNotFound, %u)", result.length); 12902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else 12912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "selectedRange -> (%u, %u)", result.location, result.length); 12922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 12932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return result; 129465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 129565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 129665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)hasMarkedText 129765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 12982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* parameters = _data->_interpretKeyEventsParameters; 12992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 13002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BOOL result; 13012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters) { 13022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch result = _data->_page->editorState().hasComposition; 13032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (result) { 13042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // A saved command can confirm a composition, but it cannot start a new one. 13052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 13062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch result = _data->_page->editorState().hasComposition; 13072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 13082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else { 13092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch uint64_t location; 13102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch uint64_t length; 13112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->getMarkedRange(location, length); 13122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch result = location != NSNotFound; 13132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 13142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 13152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "hasMarkedText -> %u", result); 13162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return result; 131765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 131865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 131965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)unmarkText 132065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 13212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 13222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 132365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(TextInput, "unmarkText"); 13242bde8e466a4451c7319e3a072d118917957d6554Steve Block 13252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Use pointer to get parameters passed to us by the caller of interpretKeyEvents. 13262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* parameters = _data->_interpretKeyEventsParameters; 13272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 13282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters) { 13292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->eventInterpretationHadSideEffects = true; 13302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->consumedByIM = false; 13312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 13322bde8e466a4451c7319e3a072d118917957d6554Steve Block 13332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->confirmComposition(); 133465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 133565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 133665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSArray *)validAttributesForMarkedText 133765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 133865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static NSArray *validAttributes; 133965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!validAttributes) { 134065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch validAttributes = [[NSArray alloc] initWithObjects: 134165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSUnderlineStyleAttributeName, NSUnderlineColorAttributeName, 13422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSMarkedClauseSegmentAttributeName, nil]; 134365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // NSText also supports the following attributes, but it's 134465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // hard to tell which are really required for text input to 134565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // work well; I have not seen any input method make use of them yet. 134665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // NSFontAttributeName, NSForegroundColorAttributeName, 134765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // NSBackgroundColorAttributeName, NSLanguageAttributeName. 134865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CFRetain(validAttributes); 134965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 135065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(TextInput, "validAttributesForMarkedText -> (...)"); 135165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return validAttributes; 135265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 135365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 135465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void extractUnderlines(NSAttributedString *string, Vector<CompositionUnderline>& result) 135565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 135665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int length = [[string string] length]; 135765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 135865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int i = 0; 135965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch while (i < length) { 136065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRange range; 136165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSDictionary *attrs = [string attributesAtIndex:i longestEffectiveRange:&range inRange:NSMakeRange(i, length - i)]; 136265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 136365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (NSNumber *style = [attrs objectForKey:NSUnderlineStyleAttributeName]) { 136465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Color color = Color::black; 136565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (NSColor *colorAttr = [attrs objectForKey:NSUnderlineColorAttributeName]) 136665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch color = colorFromNSColor([colorAttr colorUsingColorSpaceName:NSDeviceRGBColorSpace]); 136765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch result.append(CompositionUnderline(range.location, NSMaxRange(range), color, [style intValue] > 1)); 136865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 136965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 137065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch i = range.location + range.length; 137165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 137265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 137365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)setMarkedText:(id)string selectedRange:(NSRange)newSelRange replacementRange:(NSRange)replacementRange 137565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 13762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 13772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 13782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BOOL isAttributedString = [string isKindOfClass:[NSAttributedString class]]; 13792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(isAttributedString || [string isKindOfClass:[NSString class]]); 13802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 138165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(TextInput, "setMarkedText:\"%@\" selectedRange:(%u, %u)", isAttributedString ? [string string] : string, newSelRange.location, newSelRange.length); 13822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 13832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Use pointer to get parameters passed to us by the caller of interpretKeyEvents. 13842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters* parameters = _data->_interpretKeyEventsParameters; 13852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 13862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters) { 13872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->eventInterpretationHadSideEffects = true; 13882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters->consumedByIM = false; 13892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 139065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch Vector<CompositionUnderline> underlines; 13922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSString *text; 13932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 139465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (isAttributedString) { 13952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // FIXME: We ignore most attributes from the string, so an input method cannot specify e.g. a font or a glyph variation. 139665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch text = [string string]; 13972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch extractUnderlines(string, underlines); 13982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else 13992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch text = string; 14002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (_data->_page->editorState().isInPasswordField) { 14022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // In password fields, we only allow ASCII dead keys, and don't allow inline input, matching NSSecureTextInputField. 14032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Allowing ASCII dead keys is necessary to enable full Roman input when using a Vietnamese keyboard. 14042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!_data->_page->editorState().hasComposition); 14052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[super inputContext] discardMarkedText]; // Inform the input method that we won't have an inline input area despite having been asked to. 14062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ([text length] == 1 && [[text decomposedStringWithCanonicalMapping] characterAtIndex:0] < 0x80) { 14072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->insertText(text, replacementRange.location, NSMaxRange(replacementRange)); 14082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else 14092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSBeep(); 14102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 141165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 14122bde8e466a4451c7319e3a072d118917957d6554Steve Block 14132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->setComposition(text, underlines, newSelRange.location, NSMaxRange(newSelRange), replacementRange.location, NSMaxRange(replacementRange)); 141465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 141565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 141665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRange)markedRange 141765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 14192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 142065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t location; 142165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t length; 142265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->getMarkedRange(location, length); 14232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 142465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(TextInput, "markedRange -> (%u, %u)", location, length); 142565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NSMakeRange(location, length); 142665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 142765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (NSAttributedString *)attributedSubstringForProposedRange:(NSRange)nsRange actualRange:(NSRangePointer)actualRange 142965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 14312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!_data->_page->editorState().isContentEditable) { 14332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "attributedSubstringFromRange:(%u, %u) -> nil", nsRange.location, nsRange.length); 14342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return nil; 14352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 14362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (_data->_page->editorState().isInPasswordField) 14382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return nil; 14392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch AttributedString result; 14412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->getAttributedSubstringFromRange(nsRange.location, NSMaxRange(nsRange), result); 14422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (actualRange) 14442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *actualRange = nsRange; 14452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch LOG(TextInput, "attributedSubstringFromRange:(%u, %u) -> \"%@\"", nsRange.location, nsRange.length, [result.string.get() string]); 14472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return [[result.string.get() retain] autorelease]; 144865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 144965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 145065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSUInteger)characterIndexForPoint:(NSPoint)thePoint 145165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 14532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 145465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow *window = [self window]; 145565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 145665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (window) 145765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch thePoint = [window convertScreenToBase:thePoint]; 145865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch thePoint = [self convertPoint:thePoint fromView:nil]; // the point is relative to the main frame 145965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 146065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t result = _data->_page->characterIndexForPoint(IntPoint(thePoint)); 146165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(TextInput, "characterIndexForPoint:(%f, %f) -> %u", thePoint.x, thePoint.y, result); 146265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return result; 146365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 146465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (NSRect)firstRectForCharacterRange:(NSRange)theRange actualRange:(NSRangePointer)actualRange 146665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 14672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _executeSavedKeypressCommands]; 14682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 146965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Just to match NSTextView's behavior. Regression tests cannot detect this; 147065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // to reproduce, use a test application from http://bugs.webkit.org/show_bug.cgi?id=4682 147165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // (type something; try ranges (1, -1) and (2, -1). 147265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ((theRange.location + theRange.length < theRange.location) && (theRange.location + theRange.length != 0)) 147365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch theRange.length = 0; 147465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 147565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRect resultRect = _data->_page->firstRectForCharacterRange(theRange.location, theRange.length); 147665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch resultRect = [self convertRect:resultRect toView:nil]; 147765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 147865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow *window = [self window]; 147965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (window) 148065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch resultRect.origin = [window convertBaseToScreen:resultRect.origin]; 14812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (actualRange) 14832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *actualRange = theRange; 14842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 148565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(TextInput, "firstRectForCharacterRange:(%u, %u) -> (%f, %f, %f, %f)", theRange.location, theRange.length, resultRect.origin.x, resultRect.origin.y, resultRect.size.width, resultRect.size.height); 148665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return resultRect; 148765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 148865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1489ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation 1490ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 1491ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch NSPoint windowImageLoc = [[self window] convertScreenToBase:aPoint]; 1492ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch NSPoint windowMouseLoc = windowImageLoc; 1493ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 1494ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // Prevent queued mouseDragged events from coming after the drag and fake mouseUp event. 1495ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_ignoringMouseDraggedEvents = YES; 1496ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 1497ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_page->dragEnded(IntPoint(windowMouseLoc), globalPoint(windowMouseLoc, [self window]), operation); 1498ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 1499ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 150065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (DragApplicationFlags)applicationFlags:(id <NSDraggingInfo>)draggingInfo 150165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 150265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint32_t flags = 0; 150365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([NSApp modalWindow]) 150465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch flags = DragApplicationIsModal; 150565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([[self window] attachedSheet]) 150665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch flags |= DragApplicationHasAttachedSheet; 150765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([draggingInfo draggingSource] == self) 150865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch flags |= DragApplicationIsSource; 150965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) 151065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch flags |= DragApplicationIsCopyKeyDown; 151165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return static_cast<DragApplicationFlags>(flags); 151265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 151365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 151465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)draggingInfo 151565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 151665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]); 151765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint global(globalPoint([draggingInfo draggingLocation], [self window])); 151865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]); 1519ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 1520ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_page->resetDragOperation(); 15212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->dragEntered(&dragData, [[draggingInfo draggingPasteboard] name]); 152265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NSDragOperationCopy; 152365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 152465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 152565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)draggingInfo 152665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 152765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]); 152865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint global(globalPoint([draggingInfo draggingLocation], [self window])); 152965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]); 15302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->dragUpdated(&dragData, [[draggingInfo draggingPasteboard] name]); 153165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return _data->_page->dragOperation(); 153265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 153365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 153465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)draggingExited:(id <NSDraggingInfo>)draggingInfo 153565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 153665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]); 153765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint global(globalPoint([draggingInfo draggingLocation], [self window])); 153865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]); 15392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->dragExited(&dragData, [[draggingInfo draggingPasteboard] name]); 154065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->resetDragOperation(); 154165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 154265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 154365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)draggingInfo 154465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 154565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 154665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 154765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// FIXME: This code is more or less copied from Pasteboard::getBestURL. 15492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// It would be nice to be able to share the code somehow. 15502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic void maybeCreateSandboxExtensionFromPasteboard(NSPasteboard *pasteboard, SandboxExtension::Handle& sandboxExtensionHandle) 15512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 15522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSArray *types = [pasteboard types]; 15532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (![types containsObject:NSFilenamesPboardType]) 15542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 15552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 15562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSArray *files = [pasteboard propertyListForType:NSFilenamesPboardType]; 15572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ([files count] != 1) 15582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 15592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 15602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSString *file = [files objectAtIndex:0]; 15612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BOOL isDirectory; 15622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (![[NSFileManager defaultManager] fileExistsAtPath:file isDirectory:&isDirectory]) 15632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 15642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 15652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isDirectory) 15662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 15672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 15682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch SandboxExtension::createHandle("/", SandboxExtension::ReadOnly, sandboxExtensionHandle); 15692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 15702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 157165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)performDragOperation:(id <NSDraggingInfo>)draggingInfo 157265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 157365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]); 157465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch IntPoint global(globalPoint([draggingInfo draggingLocation], [self window])); 157565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]); 15762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 15772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch SandboxExtension::Handle sandboxExtensionHandle; 15782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch maybeCreateSandboxExtensionFromPasteboard([draggingInfo draggingPasteboard], sandboxExtensionHandle); 15792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 15802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->performDrag(&dragData, [[draggingInfo draggingPasteboard] name], sandboxExtensionHandle); 15812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 158265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 158365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 158465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// This code is needed to support drag and drop when the drag types cannot be matched. 15862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// This is the case for elements that do not place content 15872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// in the drag pasteboard automatically when the drag start (i.e. dragging a DIV element). 15882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (NSView *)_hitTest:(NSPoint *)point dragTypes:(NSSet *)types 15892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 15902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ([[self superview] mouse:*point inRect:[self frame]]) 15912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return self; 15922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return nil; 15932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 15942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 159565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_updateWindowVisibility 159665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 159765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->updateWindowIsVisible(![[self window] isMiniaturized]); 159865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 159965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 160065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_ownsWindowGrowBox 160165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 160265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow* window = [self window]; 160365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!window) 160465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 160565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 160665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSView *superview = [self superview]; 160765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!superview) 160865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 160965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 161065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRect growBoxRect = [window _growBoxRect]; 161165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (NSIsEmptyRect(growBoxRect)) 161265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 161365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 161465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRect visibleRect = [self visibleRect]; 161565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (NSIsEmptyRect(visibleRect)) 161665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 161765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 161865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRect visibleRectInWindowCoords = [self convertRect:visibleRect toView:nil]; 161965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!NSIntersectsRect(growBoxRect, visibleRectInWindowCoords)) 162065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 162165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 162265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 162365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 162465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 162565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_updateGrowBoxForWindowFrameChange 162665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 162765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Temporarily enable the resize indicator to make a the _ownsWindowGrowBox calculation work. 162865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch BOOL wasShowingIndicator = [[self window] showsResizeIndicator]; 16292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!wasShowingIndicator) 16302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [[self window] setShowsResizeIndicator:YES]; 163165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 163265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch BOOL ownsGrowBox = [self _ownsWindowGrowBox]; 163365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->setWindowResizerSize(ownsGrowBox ? enclosingIntRect([[self window] _growBoxRect]).size() : IntSize()); 16342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 16352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (ownsGrowBox) 16362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [[self window] _setShowOpaqueGrowBoxForOwner:(_data->_page->hasHorizontalScrollbar() || _data->_page->hasVerticalScrollbar() ? self : nil)]; 16372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block else 16382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [[self window] _setShowOpaqueGrowBoxForOwner:nil]; 16392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 164065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Once WebCore can draw the window resizer, this should read: 164165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // if (wasShowingIndicator) 164265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // [[self window] setShowsResizeIndicator:!ownsGrowBox]; 16432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!wasShowingIndicator) 16442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [[self window] setShowsResizeIndicator:NO]; 164565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 164665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return ownsGrowBox; 164765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 164865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 164965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)addWindowObserversForWindow:(NSWindow *)window 165065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 165165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (window) { 165265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidBecomeKey:) 165365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch name:NSWindowDidBecomeKeyNotification object:nil]; 165465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidResignKey:) 165565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch name:NSWindowDidResignKeyNotification object:nil]; 165665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidMiniaturize:) 165765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch name:NSWindowDidMiniaturizeNotification object:window]; 165865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidDeminiaturize:) 165965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch name:NSWindowDidDeminiaturizeNotification object:window]; 166065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowFrameDidChange:) 166165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch name:NSWindowDidMoveNotification object:window]; 166265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowFrameDidChange:) 166365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch name:NSWindowDidResizeNotification object:window]; 16642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidOrderOffScreen:) 16652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch name:@"NSWindowDidOrderOffScreenNotification" object:window]; 16662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidOrderOnScreen:) 16672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch name:@"_NSWindowDidBecomeVisible" object:window]; 166865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 166965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 167065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 167165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)removeWindowObservers 167265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 167365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow *window = [self window]; 167465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!window) 167565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 167665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 167765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidBecomeKeyNotification object:nil]; 167865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResignKeyNotification object:nil]; 167965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidMiniaturizeNotification object:window]; 168065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidDeminiaturizeNotification object:window]; 168165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidMoveNotification object:window]; 168265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResizeNotification object:window]; 16832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:@"NSWindowDidOrderOffScreenNotification" object:window]; 16842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [[NSNotificationCenter defaultCenter] removeObserver:self name:@"_NSWindowDidBecomeVisible" object:window]; 168565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 168665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 168765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewWillMoveToWindow:(NSWindow *)window 168865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 16892bde8e466a4451c7319e3a072d118917957d6554Steve Block NSWindow *currentWindow = [self window]; 16902bde8e466a4451c7319e3a072d118917957d6554Steve Block if (window == currentWindow) 16912bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 16922bde8e466a4451c7319e3a072d118917957d6554Steve Block 16932bde8e466a4451c7319e3a072d118917957d6554Steve Block [self removeWindowObservers]; 16942bde8e466a4451c7319e3a072d118917957d6554Steve Block [self addWindowObserversForWindow:window]; 16952bde8e466a4451c7319e3a072d118917957d6554Steve Block 16962bde8e466a4451c7319e3a072d118917957d6554Steve Block if ([currentWindow _growBoxOwner] == self) 16972bde8e466a4451c7319e3a072d118917957d6554Steve Block [currentWindow _setShowOpaqueGrowBoxForOwner:nil]; 169865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 169965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 170065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewDidMoveToWindow 170165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 170265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We want to make sure to update the active state while hidden, so if the view is about to become visible, we 170365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // update the active state first and then make it visible. If the view is about to be hidden, we hide it first and then 170465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // update the active state. 170565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([self window]) { 170665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive); 170765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible | WebPageProxy::ViewIsInWindow); 170865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _updateWindowVisibility]; 170965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _updateWindowAndViewFrames]; 17102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Initialize remote accessibility when the window connection has been established. 17122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_SNOW_LEOPARD) 17132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NSData *remoteElementToken = WKAXRemoteTokenForElement(self); 17142bde8e466a4451c7319e3a072d118917957d6554Steve Block NSData *remoteWindowToken = WKAXRemoteTokenForElement([self accessibilityAttributeValue:NSAccessibilityWindowAttribute]); 17152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CoreIPC::DataReference elementToken = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>([remoteElementToken bytes]), [remoteElementToken length]); 17162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CoreIPC::DataReference windowToken = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>([remoteWindowToken bytes]), [remoteWindowToken length]); 17172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_page->registerUIProcessAccessibilityTokens(elementToken, windowToken); 17182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 17192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 172065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else { 172165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible); 172265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive | WebPageProxy::ViewIsInWindow); 172365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(GESTURE_EVENTS) 17252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (_data->_endGestureMonitor) { 17262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [NSEvent removeMonitor:_data->_endGestureMonitor]; 17272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_endGestureMonitor = nil; 17282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 17292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 17302bde8e466a4451c7319e3a072d118917957d6554Steve Block#if !defined(BUILDING_ON_SNOW_LEOPARD) 17312bde8e466a4451c7319e3a072d118917957d6554Steve Block WKHideWordDefinitionWindow(); 17322bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 17332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 173465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 173565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 173665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidBecomeKey:(NSNotification *)notification 173765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 173865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow *keyWindow = [notification object]; 17392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (keyWindow == [self window] || keyWindow == [[self window] attachedSheet]) { 17402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _updateSecureInputState]; 174165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive); 17422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 174365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 174465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 174565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidResignKey:(NSNotification *)notification 174665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 174765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSWindow *formerKeyWindow = [notification object]; 17482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (formerKeyWindow == [self window] || formerKeyWindow == [[self window] attachedSheet]) { 17492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self _updateSecureInputState]; 175065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive); 17512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 175265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 175365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 175465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidMiniaturize:(NSNotification *)notification 175565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 175665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _updateWindowVisibility]; 175765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 175865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 175965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidDeminiaturize:(NSNotification *)notification 176065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 176165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _updateWindowVisibility]; 176265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 176365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 176465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowFrameDidChange:(NSNotification *)notification 176565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 176665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _updateWindowAndViewFrames]; 176765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 176865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)_windowDidOrderOffScreen:(NSNotification *)notification 17702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 17712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible); 17722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 17732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 17742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)_windowDidOrderOnScreen:(NSNotification *)notification 17752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 17762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible); 17772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 17782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 17792fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawPageBackground(CGContextRef context, WebPageProxy* page, const IntRect& rect) 17802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 17812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!page->drawsBackground()) 17822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 17832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CGContextSaveGState(context); 17852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CGContextSetBlendMode(context, kCGBlendModeCopy); 17862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CGColorRef backgroundColor; 17882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (page->drawsTransparentBackground()) 17892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block backgroundColor = CGColorGetConstantColor(kCGColorClear); 17902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block else 17912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block backgroundColor = CGColorGetConstantColor(kCGColorWhite); 17922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CGContextSetFillColorWithColor(context, backgroundColor); 17942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CGContextFillRect(context, rect); 17952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CGContextRestoreGState(context); 17972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 17982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 179965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)drawRect:(NSRect)rect 180065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 180165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(View, "drawRect: x:%g, y:%g, width:%g, height:%g", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); 18022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_page->endPrinting(); 18032bde8e466a4451c7319e3a072d118917957d6554Steve Block CGContextRef context = static_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]); 18042bde8e466a4451c7319e3a072d118917957d6554Steve Block 18052bde8e466a4451c7319e3a072d118917957d6554Steve Block if (DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(_data->_page->drawingArea())) { 18062bde8e466a4451c7319e3a072d118917957d6554Steve Block const NSRect *rectsBeingDrawn; 18072bde8e466a4451c7319e3a072d118917957d6554Steve Block NSInteger numRectsBeingDrawn; 18082bde8e466a4451c7319e3a072d118917957d6554Steve Block [self getRectsBeingDrawn:&rectsBeingDrawn count:&numRectsBeingDrawn]; 18092bde8e466a4451c7319e3a072d118917957d6554Steve Block for (NSInteger i = 0; i < numRectsBeingDrawn; ++i) { 18102bde8e466a4451c7319e3a072d118917957d6554Steve Block Region unpaintedRegion; 18112bde8e466a4451c7319e3a072d118917957d6554Steve Block IntRect rect = enclosingIntRect(rectsBeingDrawn[i]); 18122bde8e466a4451c7319e3a072d118917957d6554Steve Block drawingArea->paint(context, rect, unpaintedRegion); 18132bde8e466a4451c7319e3a072d118917957d6554Steve Block 18142bde8e466a4451c7319e3a072d118917957d6554Steve Block Vector<IntRect> unpaintedRects = unpaintedRegion.rects(); 18152bde8e466a4451c7319e3a072d118917957d6554Steve Block for (size_t i = 0; i < unpaintedRects.size(); ++i) 18162bde8e466a4451c7319e3a072d118917957d6554Steve Block drawPageBackground(context, _data->_page.get(), unpaintedRects[i]); 18172bde8e466a4451c7319e3a072d118917957d6554Steve Block } 18182bde8e466a4451c7319e3a072d118917957d6554Steve Block } else 18192bde8e466a4451c7319e3a072d118917957d6554Steve Block drawPageBackground(context, _data->_page.get(), enclosingIntRect(rect)); 182065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18212bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_page->didDraw(); 182265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 182365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 182465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isOpaque 182565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 182665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return _data->_page->drawsBackground(); 182765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 182865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 182981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (BOOL)mouseDownCanMoveWindow 183081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 183181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // -[NSView mouseDownCanMoveWindow] returns YES when the NSView is transparent, 183281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // but we don't want a drag in the NSView to move the window, even if it's transparent. 183381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return NO; 183481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 183581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 183665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewDidHide 183765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 183865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible); 183965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 184065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 184165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewDidUnhide 184265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 184365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible); 184465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 184565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 184681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (id)accessibilityFocusedUIElement 184781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 18482bde8e466a4451c7319e3a072d118917957d6554Steve Block if (_data->_pdfViewController) 18492bde8e466a4451c7319e3a072d118917957d6554Steve Block return NSAccessibilityUnignoredDescendant(_data->_pdfViewController->pdfView()); 18502bde8e466a4451c7319e3a072d118917957d6554Steve Block 185181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return _data->_remoteAccessibilityChild.get(); 185281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 185381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 185465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)accessibilityIsIgnored 185565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 185665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 185765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 185865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 185965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)accessibilityHitTest:(NSPoint)point 186065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 18612bde8e466a4451c7319e3a072d118917957d6554Steve Block if (_data->_pdfViewController) 18622bde8e466a4451c7319e3a072d118917957d6554Steve Block return [_data->_pdfViewController->pdfView() accessibilityHitTest:point]; 18632bde8e466a4451c7319e3a072d118917957d6554Steve Block 186465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return _data->_remoteAccessibilityChild.get(); 186565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 186665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 186765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)accessibilityAttributeValue:(NSString*)attribute 186865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 186965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) { 18702bde8e466a4451c7319e3a072d118917957d6554Steve Block 18712bde8e466a4451c7319e3a072d118917957d6554Steve Block id child = nil; 18722bde8e466a4451c7319e3a072d118917957d6554Steve Block if (_data->_pdfViewController) 18732bde8e466a4451c7319e3a072d118917957d6554Steve Block child = NSAccessibilityUnignoredDescendant(_data->_pdfViewController->pdfView()); 18742bde8e466a4451c7319e3a072d118917957d6554Steve Block else if (_data->_remoteAccessibilityChild) 18752bde8e466a4451c7319e3a072d118917957d6554Steve Block child = _data->_remoteAccessibilityChild.get(); 18762bde8e466a4451c7319e3a072d118917957d6554Steve Block 18772bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!child) 187865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return nil; 18792bde8e466a4451c7319e3a072d118917957d6554Steve Block return [NSArray arrayWithObject:child]; 188065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 188165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([attribute isEqualToString:NSAccessibilityRoleAttribute]) 188265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NSAccessibilityGroupRole; 188365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) 188465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, nil); 188565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([attribute isEqualToString:NSAccessibilityParentAttribute]) 188665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NSAccessibilityUnignoredAncestor([self superview]); 188765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([attribute isEqualToString:NSAccessibilityEnabledAttribute]) 188865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [NSNumber numberWithBool:YES]; 188965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 189065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [super accessibilityAttributeValue:attribute]; 189165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 189265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 189365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSView *)hitTest:(NSPoint)point 189465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 189565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSView *hitView = [super hitTest:point]; 189665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (hitView && _data && hitView == _data->_layerHostingView) 189765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch hitView = self; 18982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 189965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return hitView; 190065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 190165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 190265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSInteger)conversationIdentifier 190365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 190465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return (NSInteger)self; 190565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 190665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 190765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (BOOL)canChangeFrameLayout:(WKFrameRef)frameRef 1909ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 19102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // PDF documents are already paginated, so we can't change them to add headers and footers. 19112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return !toImpl(frameRef)->isMainFrame() || !_data->_pdfViewController; 1912ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 1913ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 191465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSPrintOperation *)printOperationWithPrintInfo:(NSPrintInfo *)printInfo forFrame:(WKFrameRef)frameRef 191565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 191665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch LOG(View, "Creating an NSPrintOperation for frame '%s'", toImpl(frameRef)->url().utf8().data()); 191765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 191865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Only the top frame can currently contain a PDF view. 191965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (_data->_pdfViewController) { 19202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!toImpl(frameRef)->isMainFrame()) 19212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return 0; 19222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return _data->_pdfViewController->makePrintOperation(printInfo); 19232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } else { 19242bde8e466a4451c7319e3a072d118917957d6554Steve Block RetainPtr<WKPrintingView> printingView(AdoptNS, [[WKPrintingView alloc] initWithFrameProxy:toImpl(frameRef) view:self]); 19252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // NSPrintOperation takes ownership of the view. 19262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:printingView.get()]; 19272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [printOperation setCanSpawnSeparateThread:YES]; 19282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [printOperation setJobTitle:toImpl(frameRef)->title()]; 19292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block printingView->_printOperation = printOperation; 19302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return printOperation; 193165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 193265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 193365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 193465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 193565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 193665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@implementation WKView (Internal) 193765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 193865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (PassOwnPtr<WebKit::DrawingAreaProxy>)_createDrawingAreaProxy 193965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 19402bde8e466a4451c7319e3a072d118917957d6554Steve Block return DrawingAreaProxyImpl::create(_data->_page.get()); 194165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 194265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 194365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_isFocused 194465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 194565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (_data->_inBecomeFirstResponder) 194665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return YES; 194765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (_data->_inResignFirstResponder) 194865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return NO; 194965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return [[self window] firstResponder] == self; 195065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 195165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 195265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_processDidCrash 195365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 195465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self setNeedsDisplay:YES]; 19552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self _updateRemoteAccessibilityRegistration:NO]; 19562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 19572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 19582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_pageClosed 19592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 19602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self _updateRemoteAccessibilityRegistration:NO]; 196165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 196265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 196365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_didRelaunchProcess 196465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 196565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self setNeedsDisplay:YES]; 196665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 196765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 196865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setCursor:(NSCursor *)cursor 196965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 197065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if ([NSCursor currentCursor] == cursor) 197165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 197265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [cursor set]; 197365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 197465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 197565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setUserInterfaceItemState:(NSString *)commandName enabled:(BOOL)isEnabled state:(int)newState 197665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 197765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ValidationVector items = _data->_validationMap.take(commandName); 197865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t size = items.size(); 197965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < size; ++i) { 198065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ValidationItem item = items[i].get(); 198165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setState:newState]; 198265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [menuItem(item) setEnabled:isEnabled]; 198365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [toolbarItem(item) setEnabled:isEnabled]; 198465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME <rdar://problem/8803392>: If the item is neither a menu nor toolbar item, it will be left enabled. 198565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 198665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 198765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19882bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)_resendKeyDownEvent:(NSEvent *)event 19892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 19902bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!_data->_keyDownEventBeingResent); 19912bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_keyDownEventBeingResent = event; 19922bde8e466a4451c7319e3a072d118917957d6554Steve Block [NSApp _setCurrentEvent:event]; 19932bde8e466a4451c7319e3a072d118917957d6554Steve Block [NSApp sendEvent:event]; 19942bde8e466a4451c7319e3a072d118917957d6554Steve Block 19952bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_keyDownEventBeingResent = nullptr; 19962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 19972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 19982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (BOOL)_interpretKeyEvent:(NSEvent *)event savingCommandsTo:(Vector<WebCore::KeypressCommand>&)commands 19992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 20002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!_data->_interpretKeyEventsParameters); 20012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(commands.isEmpty()); 20022bde8e466a4451c7319e3a072d118917957d6554Steve Block 20032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if ([event type] == NSFlagsChanged) 20042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return NO; 20052bde8e466a4451c7319e3a072d118917957d6554Steve Block 20062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WKViewInterpretKeyEventsParameters parameters; 20072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters.eventInterpretationHadSideEffects = false; 20082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters.executingSavedKeypressCommands = false; 20092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // We assume that an input method has consumed the event, and only change this assumption if one of the NSTextInput methods is called. 20102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // We assume the IM will *not* consume hotkey sequences. 20112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters.consumedByIM = !([event modifierFlags] & NSCommandKeyMask); 20122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch parameters.commands = &commands; 20132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_interpretKeyEventsParameters = ¶meters; 20142bde8e466a4451c7319e3a072d118917957d6554Steve Block 20152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [self interpretKeyEvents:[NSArray arrayWithObject:event]]; 20162bde8e466a4451c7319e3a072d118917957d6554Steve Block 20172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_interpretKeyEventsParameters = 0; 20182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 20192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // An input method may consume an event and not tell us (e.g. when displaying a candidate window), 20202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // in which case we should not bubble the event up the DOM. 20212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (parameters.consumedByIM) 20222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return YES; 20232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 20242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // If we have already executed all or some of the commands, the event is "handled". Note that there are additional checks on web process side. 20252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return parameters.eventInterpretationHadSideEffects; 20262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 20272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 202865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)_convertToDeviceSpace:(NSRect)rect 202965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 203065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return toDeviceSpace(rect, [self window]); 203165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 203265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 203365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)_convertToUserSpace:(NSRect)rect 203465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 203565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return toUserSpace(rect, [self window]); 203665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 203765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 203865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Any non-zero value will do, but using something recognizable might help us debug some day. 203965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define TRACKING_RECT_TAG 0xBADFACE 204065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 204165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSTrackingRectTag)addTrackingRect:(NSRect)rect owner:(id)owner userData:(void *)data assumeInside:(BOOL)assumeInside 204265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 204365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(_data->_trackingRectOwner == nil); 204465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectOwner = owner; 204565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectUserData = data; 204665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return TRACKING_RECT_TAG; 204765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 204865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 204965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSTrackingRectTag)_addTrackingRect:(NSRect)rect owner:(id)owner userData:(void *)data assumeInside:(BOOL)assumeInside useTrackingNum:(int)tag 205065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 205165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(tag == 0 || tag == TRACKING_RECT_TAG); 205265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(_data->_trackingRectOwner == nil); 205365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectOwner = owner; 205465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectUserData = data; 205565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return TRACKING_RECT_TAG; 205665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 205765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 205865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_addTrackingRects:(NSRect *)rects owner:(id)owner userDataList:(void **)userDataList assumeInsideList:(BOOL *)assumeInsideList trackingNums:(NSTrackingRectTag *)trackingNums count:(int)count 205965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 206065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(count == 1); 206165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(trackingNums[0] == 0 || trackingNums[0] == TRACKING_RECT_TAG); 206265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(_data->_trackingRectOwner == nil); 206365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectOwner = owner; 206465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectUserData = userDataList[0]; 206565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch trackingNums[0] = TRACKING_RECT_TAG; 206665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 206765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 206865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)removeTrackingRect:(NSTrackingRectTag)tag 206965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 20702bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!_data) 20712bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 20722bde8e466a4451c7319e3a072d118917957d6554Steve Block 207365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (tag == 0) 207465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 207565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20762bde8e466a4451c7319e3a072d118917957d6554Steve Block if (tag == TRACKING_RECT_TAG) { 207765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectOwner = nil; 207865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 207965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 208065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20812bde8e466a4451c7319e3a072d118917957d6554Steve Block if (tag == _data->_lastToolTipTag) { 208265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [super removeTrackingRect:tag]; 208365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_lastToolTipTag = 0; 208465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 208565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 20862bde8e466a4451c7319e3a072d118917957d6554Steve Block 208765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If any other tracking rect is being removed, we don't know how it was created 208865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // and it's possible there's a leak involved (see 3500217) 208965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT_NOT_REACHED(); 209065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 209165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 209265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_removeTrackingRects:(NSTrackingRectTag *)tags count:(int)count 209365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 209465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int i; 209565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (i = 0; i < count; ++i) { 209665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch int tag = tags[i]; 209765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (tag == 0) 209865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch continue; 209965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(tag == TRACKING_RECT_TAG); 210065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (_data != nil) { 210165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_trackingRectOwner = nil; 210265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 210365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 210465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 210565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 210665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_sendToolTipMouseExited 210765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 210865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Nothing matters except window, trackingNumber, and userData. 210965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSEvent *fakeEvent = [NSEvent enterExitEventWithType:NSMouseExited 211065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch location:NSMakePoint(0, 0) 211165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifierFlags:0 211265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch timestamp:0 211365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch windowNumber:[[self window] windowNumber] 211465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch context:NULL 211565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch eventNumber:0 211665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch trackingNumber:TRACKING_RECT_TAG 211765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch userData:_data->_trackingRectUserData]; 211865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [_data->_trackingRectOwner mouseExited:fakeEvent]; 211965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 212065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 212165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_sendToolTipMouseEntered 212265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 212365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Nothing matters except window, trackingNumber, and userData. 212465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSEvent *fakeEvent = [NSEvent enterExitEventWithType:NSMouseEntered 212565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch location:NSMakePoint(0, 0) 212665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch modifierFlags:0 212765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch timestamp:0 212865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch windowNumber:[[self window] windowNumber] 212965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch context:NULL 213065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch eventNumber:0 213165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch trackingNumber:TRACKING_RECT_TAG 213265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch userData:_data->_trackingRectUserData]; 213365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [_data->_trackingRectOwner mouseEntered:fakeEvent]; 213465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 213565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 213665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(NSPoint)point userData:(void *)data 213765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 213865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return nsStringFromWebCoreString(_data->_page->toolTip()); 213965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 214065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 214165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_toolTipChangedFrom:(NSString *)oldToolTip to:(NSString *)newToolTip 214265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 214365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (oldToolTip) 214465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _sendToolTipMouseExited]; 214565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 214665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (newToolTip && [newToolTip length] > 0) { 214765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // See radar 3500217 for why we remove all tooltips rather than just the single one we created. 214865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self removeAllToolTips]; 214965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch NSRect wideOpenRect = NSMakeRect(-100000, -100000, 200000, 200000); 215065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_lastToolTipTag = [self addToolTipRect:wideOpenRect owner:self userData:NULL]; 215165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [self _sendToolTipMouseEntered]; 215265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 215365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 215465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 215565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setFindIndicator:(PassRefPtr<FindIndicator>)findIndicator fadeOut:(BOOL)fadeOut 215665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 215765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!findIndicator) { 215865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_findIndicatorWindow = 0; 215965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 216065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 216165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 216265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!_data->_findIndicatorWindow) 216365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_findIndicatorWindow = FindIndicatorWindow::create(self); 216465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 216565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_findIndicatorWindow->setFindIndicator(findIndicator, fadeOut); 216665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 216765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_enterAcceleratedCompositingMode:(const LayerTreeContext&)layerTreeContext 21692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 21702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(!_data->_layerHostingView); 21712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(!layerTreeContext.isEmpty()); 21722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Create an NSView that will host our layer tree. 21742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_layerHostingView.adoptNS([[NSView alloc] initWithFrame:[self bounds]]); 21752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [_data->_layerHostingView.get() setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; 217681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 217781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [CATransaction begin]; 217881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [CATransaction setDisableActions:YES]; 21792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self addSubview:_data->_layerHostingView.get()]; 21802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Create a root layer that will back the NSView. 21822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<CALayer> rootLayer(AdoptNS, [[CALayer alloc] init]); 21832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#ifndef NDEBUG 21842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [rootLayer.get() setName:@"Hosting root layer"]; 21852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 21862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CALayer *renderLayer = WKMakeRenderLayer(layerTreeContext.contextID); 21882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [rootLayer.get() addSublayer:renderLayer]; 21892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [_data->_layerHostingView.get() setLayer:rootLayer.get()]; 21912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [_data->_layerHostingView.get() setWantsLayer:YES]; 219281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 219381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [CATransaction commit]; 21942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 21952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_exitAcceleratedCompositingMode 21972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 21982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ASSERT(_data->_layerHostingView); 21992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 220081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch [_data->_layerHostingView.get() removeFromSuperview]; 22012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [_data->_layerHostingView.get() setLayer:nil]; 22022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [_data->_layerHostingView.get() setWantsLayer:NO]; 22032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 22042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_layerHostingView = nullptr; 22052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 22062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 22072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_setAccessibilityWebProcessToken:(NSData *)data 22082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 22092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_SNOW_LEOPARD) 22102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_remoteAccessibilityChild = WKAXRemoteElementForToken(data); 22112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self _updateRemoteAccessibilityRegistration:YES]; 22122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 22132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 22142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 221565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setComplexTextInputEnabled:(BOOL)complexTextInputEnabled pluginComplexTextInputIdentifier:(uint64_t)pluginComplexTextInputIdentifier 221665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 221765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch BOOL inputSourceChanged = _data->_pluginComplexTextInputIdentifier; 221865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 221965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (complexTextInputEnabled) { 222065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Check if we're already allowing text input for this plug-in. 222165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (pluginComplexTextInputIdentifier == _data->_pluginComplexTextInputIdentifier) 222265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 222365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 222465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_pluginComplexTextInputIdentifier = pluginComplexTextInputIdentifier; 222565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 222665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else { 222765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Check if we got a request to disable complex text input for a plug-in that is not the current plug-in. 222865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (pluginComplexTextInputIdentifier != _data->_pluginComplexTextInputIdentifier) 222965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 223065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 223165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_pluginComplexTextInputIdentifier = 0; 223265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 223365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 223465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (inputSourceChanged) { 223565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Inform the out of line window that the input source changed. 223665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch [[WKTextInputWindowController sharedTextInputWindowController] keyboardInputSourceChanged]; 223765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 223865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 223965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 224065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setPageHasCustomRepresentation:(BOOL)pageHasCustomRepresentation 224165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 224265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_pdfViewController = nullptr; 224365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 224465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (pageHasCustomRepresentation) 224565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_pdfViewController = PDFViewController::create(self); 224665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 224765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 224881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (void)_didFinishLoadingDataForCustomRepresentationWithSuggestedFilename:(const String&)suggestedFilename dataReference:(const CoreIPC::DataReference&)dataReference 224965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 225065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(_data->_pdfViewController); 225165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 225281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _data->_pdfViewController->setPDFDocumentData(_data->_page->mainFrame()->mimeType(), suggestedFilename, dataReference); 225365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 225465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 225565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (double)_customRepresentationZoomFactor 225665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 225765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!_data->_pdfViewController) 225865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return 1; 225965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 226065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return _data->_pdfViewController->zoomFactor(); 226165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 226265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 226365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setCustomRepresentationZoomFactor:(double)zoomFactor 226465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 226565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!_data->_pdfViewController) 226665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; 226765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 226865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _data->_pdfViewController->setZoomFactor(zoomFactor); 226965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 227065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)_findStringInCustomRepresentation:(NSString *)string withFindOptions:(WebKit::FindOptions)options maxMatchCount:(NSUInteger)count 22722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 22732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!_data->_pdfViewController) 22742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 22752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 22762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_pdfViewController->findString(string, options, count); 22772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 22782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 22792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)_countStringMatchesInCustomRepresentation:(NSString *)string withFindOptions:(WebKit::FindOptions)options maxMatchCount:(NSUInteger)count 22802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 22812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!_data->_pdfViewController) 22822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 22832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 22842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_pdfViewController->countStringMatches(string, options, count); 22852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 22862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2287ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)_setDragImage:(NSImage *)image at:(NSPoint)clientPoint linkDrag:(BOOL)linkDrag 2288ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 2289ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // We need to prevent re-entering this call to avoid crashing in AppKit. 2290ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // Given the asynchronous nature of WebKit2 this can now happen. 2291ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (_data->_dragHasStarted) 2292ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return; 2293ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 2294ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_dragHasStarted = YES; 2295ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch [super dragImage:image 2296ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch at:clientPoint 2297ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch offset:NSZeroSize 2298ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch event:(linkDrag) ? [NSApp currentEvent] :_data->_mouseDownEvent 2299ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard] 2300ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch source:self 2301ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch slideBack:YES]; 2302ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch _data->_dragHasStarted = NO; 2303ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 2304ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 23052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)_updateSecureInputState 23062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 23072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (![[self window] isKeyWindow] || ([[self window] firstResponder] != self && !_data->_inBecomeFirstResponder)) { 23082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (_data->_inSecureInputState) { 23092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch DisableSecureEventInput(); 23102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_inSecureInputState = NO; 23112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 23122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 23132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 23142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // WKView has a single input context for all editable areas (except for plug-ins). 23152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NSTextInputContext *context = [super inputContext]; 23162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool isInPasswordField = _data->_page->editorState().isInPasswordField; 23172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 23182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (isInPasswordField) { 23192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!_data->_inSecureInputState) 23202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch EnableSecureEventInput(); 23212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static NSArray *romanInputSources = [[NSArray alloc] initWithObjects:&NSAllRomanInputSourcesLocaleIdentifier count:1]; 23222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [context setAllowedInputSourceLocales:romanInputSources]; 23232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else { 23242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (_data->_inSecureInputState) 23252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch DisableSecureEventInput(); 23262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [context setAllowedInputSourceLocales:nil]; 23272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 23282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _data->_inSecureInputState = isInPasswordField; 23292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 23302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 23312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_setDrawingAreaSize:(NSSize)size 23322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 23332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!_data->_page->drawingArea()) 23342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 23352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_page->drawingArea()->setSize(IntSize(size), IntSize(_data->_resizeScrollOffset)); 23372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _data->_resizeScrollOffset = NSZeroSize; 23382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 23392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_didChangeScrollbarsForMainFrame 23412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 23422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self _updateGrowBoxForWindowFrameChange]; 23432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 23442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23452bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(FULLSCREEN_API) 23462bde8e466a4451c7319e3a072d118917957d6554Steve Block- (WKFullScreenWindowController*)fullScreenWindowController 23472bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 23482bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!_data->_fullScreenWindowController) { 23492bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_fullScreenWindowController.adoptNS([[WKFullScreenWindowController alloc] init]); 23502bde8e466a4451c7319e3a072d118917957d6554Steve Block [_data->_fullScreenWindowController.get() setWebView:self]; 23512bde8e466a4451c7319e3a072d118917957d6554Steve Block } 23522bde8e466a4451c7319e3a072d118917957d6554Steve Block return _data->_fullScreenWindowController.get(); 23532bde8e466a4451c7319e3a072d118917957d6554Steve Block} 23542bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 23552bde8e466a4451c7319e3a072d118917957d6554Steve Block 23562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (bool)_executeSavedCommandBySelector:(SEL)selector 23572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 23582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // The sink does two things: 1) Tells us if the responder went unhandled, and 23592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // 2) prevents any NSBeep; we don't ever want to beep here. 23602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch RetainPtr<WKResponderChainSink> sink(AdoptNS, [[WKResponderChainSink alloc] initWithResponderChain:self]); 23612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [super doCommandBySelector:selector]; 23622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [sink.get() detach]; 23632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return ![sink.get() didReceiveUnhandledCommand]; 23642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 23652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 23662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block@end 23672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block@implementation WKView (Private) 23692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)disableFrameSizeUpdates 23712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 23722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block _frameSizeUpdatesDisabledCount++; 23732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 23742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)enableFrameSizeUpdates 23762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 23772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!_frameSizeUpdatesDisabledCount) 23782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 23792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!(--_frameSizeUpdatesDisabledCount)) 23812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block [self _setDrawingAreaSize:[self frame].size]; 23822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 23832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (BOOL)frameSizeUpdatesDisabled 23852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 23862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return _frameSizeUpdatesDisabledCount > 0; 23872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 23882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 238981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch- (void)performDictionaryLookupAtCurrentMouseLocation 239081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 239181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch NSPoint thePoint = [NSEvent mouseLocation]; 239281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch thePoint = [[self window] convertScreenToBase:thePoint]; 239381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch thePoint = [self convertPoint:thePoint fromView:nil]; 239481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 239581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch _data->_page->performDictionaryLookupAtLocation(FloatPoint(thePoint.x, thePoint.y)); 239681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 239781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 23982bde8e466a4451c7319e3a072d118917957d6554Steve Block- (NSInteger)spellCheckerDocumentTag 23992bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 24002bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!_data->_hasSpellCheckerDocumentTag) { 24012bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_spellCheckerDocumentTag = [NSSpellChecker uniqueSpellDocumentTag]; 24022bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_hasSpellCheckerDocumentTag = YES; 24032bde8e466a4451c7319e3a072d118917957d6554Steve Block } 24042bde8e466a4451c7319e3a072d118917957d6554Steve Block return _data->_spellCheckerDocumentTag; 24052bde8e466a4451c7319e3a072d118917957d6554Steve Block} 24062bde8e466a4451c7319e3a072d118917957d6554Steve Block 24072bde8e466a4451c7319e3a072d118917957d6554Steve Block- (void)handleCorrectionPanelResult:(NSString*)result 24082bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 24092bde8e466a4451c7319e3a072d118917957d6554Steve Block _data->_page->handleCorrectionPanelResult(result); 24102bde8e466a4451c7319e3a072d118917957d6554Steve Block} 24112bde8e466a4451c7319e3a072d118917957d6554Steve Block 241265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end 24132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 24142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@implementation WKResponderChainSink 24152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (id)initWithResponderChain:(NSResponder *)chain 24172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 24182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch self = [super init]; 24192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!self) 24202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return nil; 24212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _lastResponderInChain = chain; 24222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch while (NSResponder *next = [_lastResponderInChain nextResponder]) 24232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _lastResponderInChain = next; 24242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [_lastResponderInChain setNextResponder:self]; 24252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return self; 24262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 24272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)detach 24292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 24302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch [_lastResponderInChain setNextResponder:nil]; 24312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _lastResponderInChain = nil; 24322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 24332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (bool)didReceiveUnhandledCommand 24352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 24362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return _didReceiveUnhandledCommand; 24372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 24382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)noResponderFor:(SEL)selector 24402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 24412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _didReceiveUnhandledCommand = true; 24422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 24432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (void)doCommandBySelector:(SEL)selector 24452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 24462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _didReceiveUnhandledCommand = true; 24472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 24482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch- (BOOL)tryToPerform:(SEL)action with:(id)object 24502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 24512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _didReceiveUnhandledCommand = true; 24522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return YES; 24532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 24542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch@end 2456