WKView.mm revision 2fc2651226baac27029e38c9d6ef883fa32084db
165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 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
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "ChunkedUpdateDrawingAreaProxy.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "DataReference.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "DrawingAreaProxyImpl.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "FindIndicator.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "FindIndicatorWindow.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "LayerBackedDrawingAreaProxy.h"
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "LayerTreeContext.h"
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "Logging.h"
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "NativeWebKeyboardEvent.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "PDFViewController.h"
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "PageClientImpl.h"
40ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#import "PasteboardTypes.h"
41ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#import "Region.h"
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "RunLoop.h"
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "TextChecker.h"
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "TextCheckerState.h"
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKAPICast.h"
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WKPrintingView.h"
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKStringCF.h"
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WKTextInputWindowController.h"
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WKViewInternal.h"
502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#import "WKViewPrivate.h"
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebContext.h"
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebEventFactory.h"
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebPage.h"
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebPageProxy.h"
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebProcessManager.h"
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebProcessProxy.h"
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import "WebSystemInterface.h"
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <QuartzCore/QuartzCore.h>
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/ColorMac.h>
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/DragController.h>
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/DragData.h>
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/FloatRect.h>
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/IntRect.h>
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/KeyboardEvent.h>
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/PlatformMouseEvent.h>
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebCore/PlatformScreen.h>
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <WebKitSystemInterface.h>
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/RefPtr.h>
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#import <wtf/RetainPtr.h>
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// FIXME (WebKit2) <rdar://problem/8728860> WebKit2 needs to be localized
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define UI_STRING(__str, __desc) [NSString stringWithUTF8String:__str]
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@interface NSApplication (Details)
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)speakString:(NSString *)string;
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@interface NSWindow (Details)
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)_growBoxRect;
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_setShowOpaqueGrowBoxForOwner:(id)owner;
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_updateGrowBoxForWindowFrameChange;
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochextern "C" {
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Need to declare this attribute name because AppKit exports it but does not make it available in API or SPI headers.
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // <rdar://problem/8631468> tracks the request to make it available. This code should be removed when the bug is closed.
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    extern NSString *NSTextInputReplacementRangeAttributeName;
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebKit;
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef id <NSValidatedUserInterfaceItem> ValidationItem;
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef Vector<RetainPtr<ValidationItem> > ValidationVector;
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<String, ValidationVector> ValidationMap;
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@interface WKViewData : NSObject {
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@public
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<PageClientImpl> _pageClient;
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RefPtr<WebPageProxy> _page;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // For ToolTips.
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSToolTipTag _lastToolTipTag;
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    id _trackingRectOwner;
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void* _trackingRectUserData;
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RetainPtr<NSView> _layerHostingView;
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // FIXME: Remove _oldLayerHostingView.
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
1152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    NSView *_oldLayerHostingView;
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RetainPtr<id> _remoteAccessibilityChild;
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // For asynchronous validation.
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ValidationMap _validationMap;
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<PDFViewController> _pdfViewController;
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<FindIndicatorWindow> _findIndicatorWindow;
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We keep here the event when resending it to
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // the application to distinguish the case of a new event from one
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // that has been already sent to WebCore.
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSEvent *_keyDownEventBeingResent;
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<KeypressCommand> _commandsList;
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    NSSize _resizeScrollOffset;
1332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // The identifier of the plug-in we want to send complex text input to, or 0 if there is none.
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t _pluginComplexTextInputIdentifier;
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Vector<CompositionUnderline> _underlines;
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned _selectionStart;
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned _selectionEnd;
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
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block@implementation WKViewData
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@interface NSObject (NSTextInputContextDetails)
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)wantsToHandleMouseEvents;
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)handleMouseEvent:(NSEvent *)event;
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@implementation WKView
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block// FIXME: Remove this once we no longer want to be able to go back to the old drawing area.
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic bool useNewDrawingArea()
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return true;
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithFrame:(NSRect)frame
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [self initWithFrame:frame contextRef:toAPI(WebContext::sharedProcessContext())];
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [self initWithFrame:frame contextRef:contextRef pageGroupRef:nil];
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_registerDraggedTypes
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
181ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    NSMutableSet *types = [[NSMutableSet alloc] initWithArray:PasteboardTypes::forEditing()];
182ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [types addObjectsFromArray:PasteboardTypes::forURL()];
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self registerForDraggedTypes:[types allObjects]];
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [types release];
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_updateRemoteAccessibilityRegistration:(BOOL)registerProcess
1882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_SNOW_LEOPARD)
1902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // When the tree is connected/disconnected, the remote accessibility registration
1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // needs to be updated with the pid of the remote process. If the process is going
1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // away, that information is not present in WebProcess
1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    pid_t pid = 0;
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (registerProcess && _data->_page->process())
1952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        pid = _data->_page->process()->processIdentifier();
1962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else if (!registerProcess) {
1972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        pid = WKAXRemoteProcessIdentifier(_data->_remoteAccessibilityChild.get());
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        _data->_remoteAccessibilityChild = nil;
1992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
2002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (pid)
2012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        WKAXRegisterRemoteProcess(registerProcess, pid);
2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
2042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef pageGroupRef:(WKPageGroupRef)pageGroupRef
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    self = [super initWithFrame:frame];
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!self)
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return nil;
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    InitWebCoreSystemInterface();
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RunLoop::initializeMainRunLoop();
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:frame
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                                options:(NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect)
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                                  owner:self
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                               userInfo:nil];
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self addTrackingArea:trackingArea];
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [trackingArea release];
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data = [[WKViewData alloc] init];
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_pageClient = PageClientImpl::create(self);
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page = toImpl(contextRef)->createWebPage(_data->_pageClient.get(), toImpl(pageGroupRef));
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->initializeWebPage();
226ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_mouseDownEvent = nil;
227ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_ignoringMouseDraggedEvents = NO;
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self _registerDraggedTypes];
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebContext::statistics().wkViewCount++;
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return self;
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)dealloc
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->close();
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [_data release];
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebContext::statistics().wkViewCount--;
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [super dealloc];
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (WKPageRef)pageRef
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toAPI(_data->_page.get());
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setDrawsBackground:(BOOL)drawsBackground
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->setDrawsBackground(drawsBackground);
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)drawsBackground
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return _data->_page->drawsBackground();
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setDrawsTransparentBackground:(BOOL)drawsTransparentBackground
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->setDrawsTransparentBackground(drawsTransparentBackground);
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)drawsTransparentBackground
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return _data->_page->drawsTransparentBackground();
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)acceptsFirstResponder
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)becomeFirstResponder
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSSelectionDirection direction = [[self window] keyViewSelectionDirection];
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_inBecomeFirstResponder = true;
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->viewStateDidChange(WebPageProxy::ViewIsFocused);
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_inBecomeFirstResponder = false;
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (direction != NSDirectSelection)
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->setInitialFocus(direction == NSSelectingNext);
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)resignFirstResponder
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_inResignFirstResponder = true;
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->viewStateDidChange(WebPageProxy::ViewIsFocused);
29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_inResignFirstResponder = false;
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)viewWillStartLiveResize
3012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_page->viewWillStartLiveResize();
3032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)viewDidEndLiveResize
3062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_page->viewWillEndLiveResize();
3082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isFlipped
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)setFrame:(NSRect)rect andScrollBy:(NSSize)offset
3162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
3172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(NSEqualSizes(_data->_resizeScrollOffset, NSZeroSize));
3182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
3192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_resizeScrollOffset = offset;
3202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [self setFrame:rect];
3212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
3222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setFrameSize:(NSSize)size
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [super setFrameSize:size];
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (![self frameSizeUpdatesDisabled])
3282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [self _setDrawingAreaSize:size];
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_updateWindowAndViewFrames
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSWindow *window = [self window];
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(window);
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect windowFrameInScreenCoordinates = [window frame];
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect viewFrameInWindowCoordinates = [self convertRect:[self frame] toView:nil];
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSPoint accessibilityPosition = [[self accessibilityAttributeValue:NSAccessibilityPositionAttribute] pointValue];
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->windowAndViewFramesChanged(enclosingIntRect(windowFrameInScreenCoordinates), enclosingIntRect(viewFrameInWindowCoordinates), IntPoint(accessibilityPosition));
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)renewGState
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Hide the find indicator.
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_findIndicatorWindow = nullptr;
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Update the view frame.
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([self window])
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self _updateWindowAndViewFrames];
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [super renewGState];
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtypedef HashMap<SEL, String> SelectorNameMap;
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Map selectors into Editor command names.
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// This is not needed for any selectors that have the same name as the Editor command.
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const SelectorNameMap* createSelectorExceptionMap()
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SelectorNameMap* map = new HashMap<SEL, String>;
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map->add(@selector(insertNewlineIgnoringFieldEditor:), "InsertNewline");
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map->add(@selector(insertParagraphSeparator:), "InsertNewline");
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map->add(@selector(insertTabIgnoringFieldEditor:), "InsertTab");
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map->add(@selector(pageDown:), "MovePageDown");
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map->add(@selector(pageDownAndModifySelection:), "MovePageDownAndModifySelection");
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map->add(@selector(pageUp:), "MovePageUp");
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    map->add(@selector(pageUpAndModifySelection:), "MovePageUpAndModifySelection");
3702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    map->add(@selector(scrollPageDown:), "ScrollPageForward");
3712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    map->add(@selector(scrollPageUp:), "ScrollPageBackward");
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return map;
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic String commandNameForSelector(SEL selector)
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Check the exception map first.
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static const SelectorNameMap* exceptionMap = createSelectorExceptionMap();
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SelectorNameMap::const_iterator it = exceptionMap->find(selector);
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (it != exceptionMap->end())
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return it->second;
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Remove the trailing colon.
38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // No need to capitalize the command name since Editor command names are
38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // not case sensitive.
38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    const char* selectorName = sel_getName(selector);
38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    size_t selectorNameLength = strlen(selectorName);
38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (selectorNameLength < 2 || selectorName[selectorNameLength - 1] != ':')
39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return String();
39165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return String(selectorName, selectorNameLength - 1);
39265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Editing commands
39565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define WEBCORE_COMMAND(command) - (void)command:(id)sender { _data->_page->executeEditCommand(commandNameForSelector(_cmd)); }
39765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3982fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignCenter)
3992fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignJustified)
4002fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignLeft)
4012fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(alignRight)
40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(copy)
40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(cut)
40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(delete)
4052fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteBackward)
4062fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteBackwardByDecomposingPreviousCharacter)
4072fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteForward)
4082fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToBeginningOfLine)
4092fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToBeginningOfParagraph)
4102fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToEndOfLine)
4112fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToEndOfParagraph)
4122fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteToMark)
4132fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteWordBackward)
4142fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(deleteWordForward)
4152fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(ignoreSpelling)
4162fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(indent)
4172fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertBacktab)
4182fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertLineBreak)
4192fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertNewline)
4202fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertNewlineIgnoringFieldEditor)
4212fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertParagraphSeparator)
4222fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertTab)
4232fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(insertTabIgnoringFieldEditor)
4242fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(makeTextWritingDirectionLeftToRight)
4252fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(makeTextWritingDirectionNatural)
4262fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(makeTextWritingDirectionRightToLeft)
4272fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveBackward)
4282fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveBackwardAndModifySelection)
4292fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveDown)
4302fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveDownAndModifySelection)
4312fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveForward)
4322fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveForwardAndModifySelection)
4332fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveLeft)
4342fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveLeftAndModifySelection)
4352fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveParagraphBackwardAndModifySelection)
4362fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveParagraphForwardAndModifySelection)
4372fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveRight)
4382fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveRightAndModifySelection)
4392fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfDocument)
4402fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfDocumentAndModifySelection)
4412fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfLine)
4422fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfLineAndModifySelection)
4432fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfParagraph)
4442fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfParagraphAndModifySelection)
4452fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfSentence)
4462fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToBeginningOfSentenceAndModifySelection)
4472fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfDocument)
4482fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfDocumentAndModifySelection)
4492fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfLine)
4502fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfLineAndModifySelection)
4512fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfParagraph)
4522fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfParagraphAndModifySelection)
4532fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfSentence)
4542fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToEndOfSentenceAndModifySelection)
4552fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToLeftEndOfLine)
4562fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToLeftEndOfLineAndModifySelection)
4572fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToRightEndOfLine)
4582fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveToRightEndOfLineAndModifySelection)
4592fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveUp)
4602fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveUpAndModifySelection)
4612fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordBackward)
4622fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordBackwardAndModifySelection)
4632fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordForward)
4642fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordForwardAndModifySelection)
4652fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordLeft)
4662fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordLeftAndModifySelection)
4672fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordRight)
4682fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(moveWordRightAndModifySelection)
4692fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(outdent)
4702fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageDown)
4712fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageDownAndModifySelection)
4722fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageUp)
4732fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(pageUpAndModifySelection)
4742fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(paste)
47565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(pasteAsPlainText)
4762fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollPageDown)
4772fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollPageUp)
4782fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollToBeginningOfDocument)
4792fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(scrollToEndOfDocument)
48065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(selectAll)
4812fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectLine)
4822fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectParagraph)
4832fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectSentence)
4842fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectToMark)
4852fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(selectWord)
4862fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(setMark)
4872fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(subscript)
4882fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(superscript)
4892fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(swapWithMark)
49065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWEBCORE_COMMAND(takeFindStringFromSelection)
4912fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(transpose)
4922fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(underline)
4932fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(unscript)
4942fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(yank)
4952fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWEBCORE_COMMAND(yankAndSelect)
49665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
49765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#undef WEBCORE_COMMAND
49865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block/*
5002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5012fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockWhen possible, editing-related methods should be implemented in WebCore with the
5022fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockEditorCommand mechanism and invoked via WEBCORE_COMMAND, rather than implementing
5032fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockindividual methods here with Mac-specific code.
5042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5052fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockEditing-related methods still unimplemented that are implemented in WebKit1:
5062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)capitalizeWord:(id)sender;
5082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)centerSelectionInVisibleArea:(id)sender;
5092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)changeFont:(id)sender;
5102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)complete:(id)sender;
5112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)copyFont:(id)sender;
5122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)lowercaseWord:(id)sender;
5132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)makeBaseWritingDirectionLeftToRight:(id)sender;
5142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)makeBaseWritingDirectionNatural:(id)sender;
5152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)makeBaseWritingDirectionRightToLeft:(id)sender;
5162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)pasteFont:(id)sender;
5172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)scrollLineDown:(id)sender;
5182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)scrollLineUp:(id)sender;
5192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)showGuessPanel:(id)sender;
5202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)uppercaseWord:(id)sender;
5212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5222fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockSome other editing-related methods still unimplemented:
5232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)changeCaseOfLetter:(id)sender;
5252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)copyRuler:(id)sender;
5262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)insertContainerBreak:(id)sender;
5272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)insertDoubleQuoteIgnoringSubstitution:(id)sender;
5282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)insertSingleQuoteIgnoringSubstitution:(id)sender;
5292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)pasteRuler:(id)sender;
5302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)toggleRuler:(id)sender;
5312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)transposeWords:(id)sender;
5322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block*/
5342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
53565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Menu items validation
53665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
53765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NSMenuItem *menuItem(id <NSValidatedUserInterfaceItem> item)
53865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
53965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (![(NSObject *)item isKindOfClass:[NSMenuItem class]])
54065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return nil;
54165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return (NSMenuItem *)item;
54265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
54365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
54465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic NSToolbarItem *toolbarItem(id <NSValidatedUserInterfaceItem> item)
54565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
54665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (![(NSObject *)item isKindOfClass:[NSToolbarItem class]])
54765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return nil;
54865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return (NSToolbarItem *)item;
54965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
55065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item
55265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
55365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    SEL action = [item action];
55465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
55565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(showGuessPanel:)) {
55665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (NSMenuItem *menuItem = ::menuItem(item)) {
55765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            BOOL panelShowing = [[[NSSpellChecker sharedSpellChecker] spellingPanel] isVisible];
55865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            [menuItem setTitle:panelShowing
55965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ? UI_STRING("Hide Spelling and Grammar", "menu item title")
56065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                : UI_STRING("Show Spelling and Grammar", "menu item title")];
56165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
56265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
56365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
56465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(checkSpelling:) || action == @selector(changeSpelling:))
56665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
56765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
56865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleContinuousSpellChecking:)) {
56965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool enabled = TextChecker::isContinuousSpellCheckingAllowed();
57065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = enabled && TextChecker::state().isContinuousSpellCheckingEnabled;
57165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
57265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return enabled;
57365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
57465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
57565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleGrammarChecking:)) {
57665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = TextChecker::state().isGrammarCheckingEnabled;
57765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
57865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return YES;
57965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
58065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleAutomaticSpellingCorrection:)) {
58265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = TextChecker::state().isAutomaticSpellingCorrectionEnabled;
58365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
58465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
58565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
58665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
58765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(orderFrontSubstitutionsPanel:)) {
58865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (NSMenuItem *menuItem = ::menuItem(item)) {
58965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            BOOL panelShowing = [[[NSSpellChecker sharedSpellChecker] substitutionsPanel] isVisible];
59065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            [menuItem setTitle:panelShowing
59165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                ? UI_STRING("Hide Substitutions", "menu item title")
59265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                : UI_STRING("Show Substitutions", "menu item title")];
59365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
59465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
59565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
59665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
59765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleSmartInsertDelete:)) {
59865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = _data->_page->isSmartInsertDeleteEnabled();
59965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
60065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
60165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
60265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleAutomaticQuoteSubstitution:)) {
60465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = TextChecker::state().isAutomaticQuoteSubstitutionEnabled;
60565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
60665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
60765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
60865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
60965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleAutomaticDashSubstitution:)) {
61065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = TextChecker::state().isAutomaticDashSubstitutionEnabled;
61165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
61265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
61365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
61465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
61565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleAutomaticLinkDetection:)) {
61665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = TextChecker::state().isAutomaticLinkDetectionEnabled;
61765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
61865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
61965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
62065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(toggleAutomaticTextReplacement:)) {
62265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        bool checked = TextChecker::state().isAutomaticTextReplacementEnabled;
62365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:checked ? NSOnState : NSOffState];
62465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().isContentEditable;
62565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
62665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
62765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(uppercaseWord:) || action == @selector(lowercaseWord:) || action == @selector(capitalizeWord:))
62865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return _data->_page->selectionState().selectedRangeLength && _data->_page->selectionState().isContentEditable;
62965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (action == @selector(stopSpeaking:))
63165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return [NSApp isSpeaking];
63265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Next, handle editor commands. Start by returning YES for anything that is not an editor command.
63465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Returning YES is the default thing to do in an AppKit validate method for any selector that is not recognized.
63565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String commandName = commandNameForSelector([item action]);
63665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!Editor::commandIsSupportedFromMenuOrKeyBinding(commandName))
63765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return YES;
63865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
63965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Add this item to the vector of items for a given command that are awaiting validation.
64065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    pair<ValidationMap::iterator, bool> addResult = _data->_validationMap.add(commandName, ValidationVector());
64165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    addResult.first->second.append(item);
64265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (addResult.second) {
64365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // If we are not already awaiting validation for this command, start the asynchronous validation process.
64465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: Theoretically, there is a race here; when we get the answer it might be old, from a previous time
64565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // we asked for the same command; there is no guarantee the answer is still valid.
64665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME: The function called here should be renamed validateCommand because it is not specific to menu items.
64765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->validateMenuItem(commandName);
64865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
64965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Treat as enabled until we get the result back from the web process and _setUserInterfaceItemState is called.
65165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME <rdar://problem/8803459>: This means disabled items will flash enabled at first for a moment.
65265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // But returning NO here would be worse; that would make keyboard commands such as command-C fail.
65365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
65465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
65565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
65665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void speakString(WKStringRef string, WKErrorRef error, void*)
65765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
65865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (error)
65965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
66065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!string)
66165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
66265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
66365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString *convertedString = toImpl(string)->string();
66465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [NSApp speakString:convertedString];
66565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
66665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
66765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)startSpeaking:(id)sender
66865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
66965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->getSelectionOrContentsAsString(StringCallback::create(0, speakString));
67065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
67165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)stopSpeaking:(id)sender
67365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
67465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [NSApp stopSpeaking:sender];
67565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
67665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
67765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)showGuessPanel:(id)sender
67865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
67965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];
68065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!checker) {
68165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        LOG_ERROR("No NSSpellChecker");
68265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
68365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
68465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
68565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSPanel *spellingPanel = [checker spellingPanel];
68665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([spellingPanel isVisible]) {
68765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [spellingPanel orderOut:sender];
68865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
68965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
69065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->advanceToNextMisspelling(true);
69265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [spellingPanel orderFront:sender];
69365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
69465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
69565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)checkSpelling:(id)sender
69665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
69765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->advanceToNextMisspelling(false);
69865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
69965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)changeSpelling:(id)sender
70165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
70265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString *word = [[sender selectedCell] stringValue];
70365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->changeSpellingToWord(word);
70565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
70665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
70765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleContinuousSpellChecking:(id)sender
70865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
70965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool spellCheckingEnabled = !TextChecker::state().isContinuousSpellCheckingEnabled;
71065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setContinuousSpellCheckingEnabled(spellCheckingEnabled);
71165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
71365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!spellCheckingEnabled)
71565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->unmarkAllMisspellings();
71665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
71765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
71865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleGrammarChecking:(id)sender
71965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
72065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool grammarCheckingEnabled = !TextChecker::state().isGrammarCheckingEnabled;
72165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setGrammarCheckingEnabled(grammarCheckingEnabled);
72265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
72465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!grammarCheckingEnabled)
72665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->unmarkAllBadGrammar();
72765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
72865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
72965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleAutomaticSpellingCorrection:(id)sender
73065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
73165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticSpellingCorrectionEnabled(!TextChecker::state().isAutomaticSpellingCorrectionEnabled);
73265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
73465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
73565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
73665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)orderFrontSubstitutionsPanel:(id)sender
73765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
73865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];
73965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!checker) {
74065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        LOG_ERROR("No NSSpellChecker");
74165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
74265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
74365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
74465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSPanel *substitutionsPanel = [checker substitutionsPanel];
74565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([substitutionsPanel isVisible]) {
74665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [substitutionsPanel orderOut:sender];
74765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
74865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
74965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [substitutionsPanel orderFront:sender];
75065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
75165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (IBAction)toggleSmartInsertDelete:(id)sender
75365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
75465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->setSmartInsertDeleteEnabled(!_data->_page->isSmartInsertDeleteEnabled());
75565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
75665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
75765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticQuoteSubstitutionEnabled
75865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
75965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return TextChecker::state().isAutomaticQuoteSubstitutionEnabled;
76065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
76165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticQuoteSubstitutionEnabled:(BOOL)flag
76365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
76465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (static_cast<bool>(flag) == TextChecker::state().isAutomaticQuoteSubstitutionEnabled)
76565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
76665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
76765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticQuoteSubstitutionEnabled(flag);
76865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
76965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
77065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticQuoteSubstitution:(id)sender
77265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
77365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticQuoteSubstitutionEnabled(!TextChecker::state().isAutomaticQuoteSubstitutionEnabled);
77465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
77565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
77665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
77765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticDashSubstitutionEnabled
77865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
77965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return TextChecker::state().isAutomaticDashSubstitutionEnabled;
78065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
78165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticDashSubstitutionEnabled:(BOOL)flag
78365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
78465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (static_cast<bool>(flag) == TextChecker::state().isAutomaticDashSubstitutionEnabled)
78565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
78665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
78765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticDashSubstitutionEnabled(flag);
78865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
78965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
79065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticDashSubstitution:(id)sender
79265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
79365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticDashSubstitutionEnabled(!TextChecker::state().isAutomaticDashSubstitutionEnabled);
79465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
79565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
79665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
79765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticLinkDetectionEnabled
79865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
79965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return TextChecker::state().isAutomaticLinkDetectionEnabled;
80065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
80165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticLinkDetectionEnabled:(BOOL)flag
80365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
80465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (static_cast<bool>(flag) == TextChecker::state().isAutomaticLinkDetectionEnabled)
80565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
80665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
80765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticLinkDetectionEnabled(flag);
80865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
80965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
81065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticLinkDetection:(id)sender
81265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
81365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticLinkDetectionEnabled(!TextChecker::state().isAutomaticLinkDetectionEnabled);
81465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
81565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
81665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
81765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isAutomaticTextReplacementEnabled
81865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
81965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return TextChecker::state().isAutomaticTextReplacementEnabled;
82065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
82165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setAutomaticTextReplacementEnabled:(BOOL)flag
82365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
82465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (static_cast<bool>(flag) == TextChecker::state().isAutomaticTextReplacementEnabled)
82565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
82665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
82765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticTextReplacementEnabled(flag);
82865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
82965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
83065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)toggleAutomaticTextReplacement:(id)sender
83265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
83365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    TextChecker::setAutomaticTextReplacementEnabled(!TextChecker::state().isAutomaticTextReplacementEnabled);
83465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->process()->updateTextCheckerState();
83565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
83665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
83765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)uppercaseWord:(id)sender
83865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
83965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->uppercaseWord();
84065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
84165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)lowercaseWord:(id)sender
84365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
84465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->lowercaseWord();
84565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
84665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
84765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)capitalizeWord:(id)sender
84865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
84965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->capitalizeWord();
85065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
85165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Events
85365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
85465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Override this so that AppKit will send us arrow keys as key down events so we can
85565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// support them via the key bindings mechanism.
85665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_wantsKeyDownForEvent:(NSEvent *)event
85765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
85865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
85965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
86065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
861ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)_setMouseDownEvent:(NSEvent *)event
862ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
863ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ASSERT(!event || [event type] == NSLeftMouseDown || [event type] == NSRightMouseDown || [event type] == NSOtherMouseDown);
864ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
865ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (event == _data->_mouseDownEvent)
866ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
867ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
868ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [_data->_mouseDownEvent release];
869ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_mouseDownEvent = [event retain];
870ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
871ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
87265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define EVENT_HANDLER(Selector, Type) \
87365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    - (void)Selector:(NSEvent *)theEvent \
87465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    { \
87565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Web##Type##Event webEvent = WebEventFactory::createWeb##Type##Event(theEvent, self); \
87665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->handle##Type##Event(webEvent); \
87765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
87865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
87965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(mouseEntered, Mouse)
88065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(mouseExited, Mouse)
88165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(mouseMoved, Mouse)
88265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(otherMouseDown, Mouse)
88365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(otherMouseDragged, Mouse)
88465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(otherMouseMoved, Mouse)
88565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(otherMouseUp, Mouse)
88665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(rightMouseDown, Mouse)
88765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(rightMouseDragged, Mouse)
88865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(rightMouseMoved, Mouse)
88965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(rightMouseUp, Mouse)
89065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochEVENT_HANDLER(scrollWheel, Wheel)
89165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
89265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#undef EVENT_HANDLER
89365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
894ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)_mouseHandler:(NSEvent *)event
895ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
896ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    NSInputManager *currentInputManager = [NSInputManager currentInputManager];
897ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if ([currentInputManager wantsToHandleMouseEvents] && [currentInputManager handleMouseEvent:event])
898ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
899ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WebMouseEvent webEvent = WebEventFactory::createWebMouseEvent(event, self);
900ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_page->handleMouseEvent(webEvent);
901ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
90265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
903ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)mouseDown:(NSEvent *)event
904ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
905ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [self _setMouseDownEvent:event];
906ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_ignoringMouseDraggedEvents = NO;
907ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_dragHasStarted = NO;
908ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [self _mouseHandler:event];
909ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
91065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
911ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)mouseUp:(NSEvent *)event
912ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
913ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [self _setMouseDownEvent:nil];
914ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [self _mouseHandler:event];
915ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
916ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
917ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)mouseDragged:(NSEvent *)event
918ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
919ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (_data->_ignoringMouseDraggedEvents)
920ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
921ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [self _mouseHandler:event];
922ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
92365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(GESTURE_EVENTS)
9252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9262fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic const short kIOHIDEventTypeScroll = 6;
9272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)shortCircuitedEndGestureWithEvent:(NSEvent *)event
9292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if ([event subtype] != kIOHIDEventTypeScroll)
9312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
9322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WebGestureEvent webEvent = WebEventFactory::createWebGestureEvent(event, self);
9342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_page->handleGestureEvent(webEvent);
9352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (_data->_endGestureMonitor) {
9372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [NSEvent removeMonitor:_data->_endGestureMonitor];
9382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        _data->_endGestureMonitor = nil;
9392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
9402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)beginGestureWithEvent:(NSEvent *)event
9432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
9442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if ([event subtype] != kIOHIDEventTypeScroll)
9452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
9462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WebGestureEvent webEvent = WebEventFactory::createWebGestureEvent(event, self);
9482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_page->handleGestureEvent(webEvent);
9492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
9502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!_data->_endGestureMonitor) {
9512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        _data->_endGestureMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskEndGesture handler:^(NSEvent *blockEvent) {
9522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            [self shortCircuitedEndGestureWithEvent:blockEvent];
9532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return blockEvent;
9542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }];
9552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
9562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
9572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
9582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
95965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)doCommandBySelector:(SEL)selector
96065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
96165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (selector != @selector(noop:))
96265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_commandsList.append(KeypressCommand(commandNameForSelector(selector)));
96365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
96465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)insertText:(id)string
96665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
96765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BOOL isAttributedString = [string isKindOfClass:[NSAttributedString class]]; // Otherwise, NSString
96865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
96965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "insertText:\"%@\"", isAttributedString ? [string string] : string);
97065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString *text;
97165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool isFromInputMethod = _data->_page->selectionState().hasComposition;
97265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
97365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (isAttributedString) {
97465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        text = [string string];
97565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // We deal with the NSTextInputReplacementRangeAttributeName attribute from NSAttributedString here
97665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // simply because it is used by at least one Input Method -- it corresonds to the kEventParamTextInputSendReplaceRange
97765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // event in TSM.  This behaviour matches that of -[WebHTMLView setMarkedText:selectedRange:] when it receives an
97865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // NSAttributedString
97965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSString *rangeString = [string attribute:NSTextInputReplacementRangeAttributeName atIndex:0 longestEffectiveRange:NULL inRange:NSMakeRange(0, [text length])];
98065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        LOG(TextInput, "ReplacementRange: %@", rangeString);
98165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (rangeString)
98265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            isFromInputMethod = YES;
98365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else
98465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        text = string;
98565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
98665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    String eventText = text;
98765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
98865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!isFromInputMethod)
98965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_commandsList.append(KeypressCommand("insertText", text));
99065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    else {
99165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventText.replace(NSBackTabCharacter, NSTabCharacter); // same thing is done in KeyEventMac.mm in WebCore
99265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_commandsList.append(KeypressCommand("insertText", eventText));
99365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
99465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
99565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
99665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_handleStyleKeyEquivalent:(NSEvent *)event
99765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!_data->_page->selectionState().isContentEditable)
9992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return NO;
10002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
100165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) != NSCommandKeyMask)
100265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
100365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
100465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Here we special case cmd+b and cmd+i but not cmd+u, for historic reason.
100565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This should not be changed, since it could break some Mac applications that
100665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // rely on this inherent behavior.
100765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // See https://bugs.webkit.org/show_bug.cgi?id=24943
100865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
100965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString *string = [event characters];
101065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([string caseInsensitiveCompare:@"b"] == NSOrderedSame) {
101165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->executeEditCommand("ToggleBold");
101265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return YES;
101365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
101465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([string caseInsensitiveCompare:@"i"] == NSOrderedSame) {
101565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->executeEditCommand("ToggleItalic");
101665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return YES;
101765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
101865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
101965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NO;
102065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
102165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
102265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)performKeyEquivalent:(NSEvent *)event
102365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
102465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // There's a chance that responding to this event will run a nested event loop, and
102565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // fetching a new event might release the old one. Retaining and then autoreleasing
102665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // the current event prevents that from causing a problem inside WebKit or AppKit code.
102765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[event retain] autorelease];
102865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
102965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BOOL eventWasSentToWebCore = (_data->_keyDownEventBeingResent == event);
103065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
103165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Pass key combos through WebCore if there is a key binding available for
103265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // this event. This lets web pages have a crack at intercepting key-modified keypresses.
103365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // But don't do it if we have already handled the event.
103465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Pressing Esc results in a fake event being sent - don't pass it to WebCore.
103565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!eventWasSentToWebCore && event == [NSApp currentEvent] && self == [[self window] firstResponder]) {
103665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [_data->_keyDownEventBeingResent release];
103765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_keyDownEventBeingResent = nil;
103865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
103965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->handleKeyboardEvent(NativeWebKeyboardEvent(event, self));
104065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return YES;
104165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
104265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
104365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [self _handleStyleKeyEquivalent:event] || [super performKeyEquivalent:event];
104465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
104565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
104665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)keyUp:(NSEvent *)theEvent
104765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
104865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->handleKeyboardEvent(NativeWebKeyboardEvent(theEvent, self));
104965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
105065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
105165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)keyDown:(NSEvent *)theEvent
105265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
105365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_pluginComplexTextInputIdentifier) {
105465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Try feeding the keyboard event directly to the plug-in.
105565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSString *string = nil;
105665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if ([[WKTextInputWindowController sharedTextInputWindowController] interpretKeyEvent:theEvent string:&string]) {
105765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (string)
105865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                _data->_page->sendComplexTextInputToPlugin(_data->_pluginComplexTextInputIdentifier, string);
105965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
106065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
106165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
106265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
106365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_underlines.clear();
106465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_selectionStart = 0;
106565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_selectionEnd = 0;
106665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We could be receiving a key down from AppKit if we have re-sent an event
106765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // that maps to an action that is currently unavailable (for example a copy when
106865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // there is no range selection).
106965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If this is the case we should ignore the key down.
107065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_keyDownEventBeingResent == theEvent) {
107165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [_data->_keyDownEventBeingResent release];
107265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_keyDownEventBeingResent = nil;
107365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [super keyDown:theEvent];
107465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
107565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
107665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->handleKeyboardEvent(NativeWebKeyboardEvent(theEvent, self));
107765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
107865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
107965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSTextInputContext *)inputContext {
108065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_pluginComplexTextInputIdentifier)
108165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return [[WKTextInputWindowController sharedTextInputWindowController] inputContext];
108265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
108365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [super inputContext];
108465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
108565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
108665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRange)selectedRange
108765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
108865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_page->selectionState().isNone || !_data->_page->selectionState().isContentEditable)
108965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NSMakeRange(NSNotFound, 0);
109065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
109165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "selectedRange -> (%u, %u)", _data->_page->selectionState().selectedRangeStart, _data->_page->selectionState().selectedRangeLength);
109265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NSMakeRange(_data->_page->selectionState().selectedRangeStart, _data->_page->selectionState().selectedRangeLength);
109365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
109465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
109565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)hasMarkedText
109665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
109765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "hasMarkedText -> %u", _data->_page->selectionState().hasComposition);
109865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return _data->_page->selectionState().hasComposition;
109965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
110065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
110165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)unmarkText
110265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
110365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "unmarkText");
110465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
110565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_commandsList.append(KeypressCommand("unmarkText"));
110665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
110765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
110865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSArray *)validAttributesForMarkedText
110965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
111065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static NSArray *validAttributes;
111165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!validAttributes) {
111265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        validAttributes = [[NSArray alloc] initWithObjects:
111365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                           NSUnderlineStyleAttributeName, NSUnderlineColorAttributeName,
111465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                           NSMarkedClauseSegmentAttributeName, NSTextInputReplacementRangeAttributeName, nil];
111565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // NSText also supports the following attributes, but it's
111665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // hard to tell which are really required for text input to
111765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // work well; I have not seen any input method make use of them yet.
111865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        //     NSFontAttributeName, NSForegroundColorAttributeName,
111965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        //     NSBackgroundColorAttributeName, NSLanguageAttributeName.
112065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CFRetain(validAttributes);
112165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
112265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "validAttributesForMarkedText -> (...)");
112365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return validAttributes;
112465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
112565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
112665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic void extractUnderlines(NSAttributedString *string, Vector<CompositionUnderline>& result)
112765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
112865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int length = [[string string] length];
112965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
113065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int i = 0;
113165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    while (i < length) {
113265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSRange range;
113365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSDictionary *attrs = [string attributesAtIndex:i longestEffectiveRange:&range inRange:NSMakeRange(i, length - i)];
113465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
113565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (NSNumber *style = [attrs objectForKey:NSUnderlineStyleAttributeName]) {
113665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            Color color = Color::black;
113765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (NSColor *colorAttr = [attrs objectForKey:NSUnderlineColorAttributeName])
113865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                color = colorFromNSColor([colorAttr colorUsingColorSpaceName:NSDeviceRGBColorSpace]);
113965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            result.append(CompositionUnderline(range.location, NSMaxRange(range), color, [style intValue] > 1));
114065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
114165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
114265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        i = range.location + range.length;
114365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
114465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
114565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
114665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)setMarkedText:(id)string selectedRange:(NSRange)newSelRange
114765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
114865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BOOL isAttributedString = [string isKindOfClass:[NSAttributedString class]]; // Otherwise, NSString
114965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
115065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "setMarkedText:\"%@\" selectedRange:(%u, %u)", isAttributedString ? [string string] : string, newSelRange.location, newSelRange.length);
115165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
115265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSString *text = string;
115365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
115465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (isAttributedString) {
115565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        text = [string string];
115665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        extractUnderlines(string, _data->_underlines);
115765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
115865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
115965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_commandsList.append(KeypressCommand("setMarkedText", text));
116065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_selectionStart = newSelRange.location;
116165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_selectionEnd = NSMaxRange(newSelRange);
116265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
116365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
116465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRange)markedRange
116565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
116665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t location;
116765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t length;
116865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
116965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->getMarkedRange(location, length);
117065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "markedRange -> (%u, %u)", location, length);
117165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NSMakeRange(location, length);
117265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
117365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
117465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSAttributedString *)attributedSubstringFromRange:(NSRange)nsRange
117565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
117665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // This is not implemented for now. Need to figure out how to serialize the attributed string across processes.
117765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "attributedSubstringFromRange");
117865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return nil;
117965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
118065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
118165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSUInteger)characterIndexForPoint:(NSPoint)thePoint
118265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
118365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSWindow *window = [self window];
118465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
118565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (window)
118665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        thePoint = [window convertScreenToBase:thePoint];
118765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    thePoint = [self convertPoint:thePoint fromView:nil];  // the point is relative to the main frame
118865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
118965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint64_t result = _data->_page->characterIndexForPoint(IntPoint(thePoint));
119065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(TextInput, "characterIndexForPoint:(%f, %f) -> %u", thePoint.x, thePoint.y, result);
119165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return result;
119265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
119365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
119465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)firstRectForCharacterRange:(NSRange)theRange
119565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
119665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Just to match NSTextView's behavior. Regression tests cannot detect this;
119765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // to reproduce, use a test application from http://bugs.webkit.org/show_bug.cgi?id=4682
119865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // (type something; try ranges (1, -1) and (2, -1).
119965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ((theRange.location + theRange.length < theRange.location) && (theRange.location + theRange.length != 0))
120065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        theRange.length = 0;
120165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
120265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect resultRect = _data->_page->firstRectForCharacterRange(theRange.location, theRange.length);
120365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    resultRect = [self convertRect:resultRect toView:nil];
120465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
120565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSWindow *window = [self window];
120665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (window)
120765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        resultRect.origin = [window convertBaseToScreen:resultRect.origin];
120865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
120965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben 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);
121065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return resultRect;
121165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
121265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1213ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
1214ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
1215ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    NSPoint windowImageLoc = [[self window] convertScreenToBase:aPoint];
1216ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    NSPoint windowMouseLoc = windowImageLoc;
1217ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1218ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Prevent queued mouseDragged events from coming after the drag and fake mouseUp event.
1219ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_ignoringMouseDraggedEvents = YES;
1220ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1221ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_page->dragEnded(IntPoint(windowMouseLoc), globalPoint(windowMouseLoc, [self window]), operation);
1222ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
1223ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
122465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (DragApplicationFlags)applicationFlags:(id <NSDraggingInfo>)draggingInfo
122565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
122665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    uint32_t flags = 0;
122765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([NSApp modalWindow])
122865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags = DragApplicationIsModal;
122965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([[self window] attachedSheet])
123065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags |= DragApplicationHasAttachedSheet;
123165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([draggingInfo draggingSource] == self)
123265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags |= DragApplicationIsSource;
123365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask)
123465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        flags |= DragApplicationIsCopyKeyDown;
123565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return static_cast<DragApplicationFlags>(flags);
123665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
123765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
123865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)draggingInfo
123965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
124065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]);
124165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
124265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
1243ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
1244ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_page->resetDragOperation();
124565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->performDragControllerAction(DragControllerActionEntered, &dragData, [[draggingInfo draggingPasteboard] name]);
124665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NSDragOperationCopy;
124765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
124865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
124965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)draggingInfo
125065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
125165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]);
125265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
125365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
125465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->performDragControllerAction(DragControllerActionUpdated, &dragData, [[draggingInfo draggingPasteboard] name]);
125565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return _data->_page->dragOperation();
125665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
125765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
125865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)draggingExited:(id <NSDraggingInfo>)draggingInfo
125965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
126065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]);
126165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
126265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
126365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->performDragControllerAction(DragControllerActionExited, &dragData, [[draggingInfo draggingPasteboard] name]);
126465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->resetDragOperation();
126565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
126665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
126765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)draggingInfo
126865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
126965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
127065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
127165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
127265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)performDragOperation:(id <NSDraggingInfo>)draggingInfo
127365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
127465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint client([self convertPoint:[draggingInfo draggingLocation] fromView:nil]);
127565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IntPoint global(globalPoint([draggingInfo draggingLocation], [self window]));
127665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DragData dragData(draggingInfo, client, global, static_cast<DragOperation>([draggingInfo draggingSourceOperationMask]), [self applicationFlags:draggingInfo]);
127765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->performDragControllerAction(DragControllerActionPerformDrag, &dragData, [[draggingInfo draggingPasteboard] name]);
127865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
127965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
128065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
128165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_updateWindowVisibility
128265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
128365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->updateWindowIsVisible(![[self window] isMiniaturized]);
128465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
128565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
128665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_ownsWindowGrowBox
128765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
128865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSWindow* window = [self window];
128965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!window)
129065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
129165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
129265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *superview = [self superview];
129365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!superview)
129465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
129565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
129665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect growBoxRect = [window _growBoxRect];
129765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (NSIsEmptyRect(growBoxRect))
129865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
129965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
130065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect visibleRect = [self visibleRect];
130165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (NSIsEmptyRect(visibleRect))
130265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
130365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
130465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSRect visibleRectInWindowCoords = [self convertRect:visibleRect toView:nil];
130565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!NSIntersectsRect(growBoxRect, visibleRectInWindowCoords))
130665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
130765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
130865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return YES;
130965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
131065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
131165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_updateGrowBoxForWindowFrameChange
131265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
131365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Temporarily enable the resize indicator to make a the _ownsWindowGrowBox calculation work.
131465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BOOL wasShowingIndicator = [[self window] showsResizeIndicator];
13152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!wasShowingIndicator)
13162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [[self window] setShowsResizeIndicator:YES];
131765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
131865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BOOL ownsGrowBox = [self _ownsWindowGrowBox];
131965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->setWindowResizerSize(ownsGrowBox ? enclosingIntRect([[self window] _growBoxRect]).size() : IntSize());
13202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (ownsGrowBox)
13222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [[self window] _setShowOpaqueGrowBoxForOwner:(_data->_page->hasHorizontalScrollbar() || _data->_page->hasVerticalScrollbar() ? self : nil)];
13232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
13242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [[self window] _setShowOpaqueGrowBoxForOwner:nil];
13252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
132665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Once WebCore can draw the window resizer, this should read:
132765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // if (wasShowingIndicator)
132865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    //     [[self window] setShowsResizeIndicator:!ownsGrowBox];
13292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!wasShowingIndicator)
13302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [[self window] setShowsResizeIndicator:NO];
133165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
133265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ownsGrowBox;
133365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
133465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
133565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)addWindowObserversForWindow:(NSWindow *)window
133665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
133765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (window) {
133865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidBecomeKey:)
133965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                     name:NSWindowDidBecomeKeyNotification object:nil];
134065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidResignKey:)
134165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                     name:NSWindowDidResignKeyNotification object:nil];
134265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidMiniaturize:)
134365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                     name:NSWindowDidMiniaturizeNotification object:window];
134465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowDidDeminiaturize:)
134565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                     name:NSWindowDidDeminiaturizeNotification object:window];
134665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowFrameDidChange:)
134765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                     name:NSWindowDidMoveNotification object:window];
134865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_windowFrameDidChange:)
134965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                                     name:NSWindowDidResizeNotification object:window];
135065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
135165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
135265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
135365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)removeWindowObservers
135465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
135565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSWindow *window = [self window];
135665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!window)
135765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
135865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
135965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidBecomeKeyNotification object:nil];
136065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResignKeyNotification object:nil];
136165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidMiniaturizeNotification object:window];
136265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidDeminiaturizeNotification object:window];
136365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidMoveNotification object:window];
136465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSWindowDidResizeNotification object:window];
136565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
136665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
136765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewWillMoveToWindow:(NSWindow *)window
136865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
136965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (window != [self window]) {
137065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self removeWindowObservers];
137165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self addWindowObserversForWindow:window];
137265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
137365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
137465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
137565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewDidMoveToWindow
137665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
137765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We want to make sure to update the active state while hidden, so if the view is about to become visible, we
137865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben 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
137965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // update the active state.
138065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([self window]) {
138165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
138265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible | WebPageProxy::ViewIsInWindow);
138365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self _updateWindowVisibility];
138465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self _updateWindowAndViewFrames];
13852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
13862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // Initialize remote accessibility when the window connection has been established.
13872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_SNOW_LEOPARD)
13882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        NSData *remoteElementToken = WKAXRemoteTokenForElement(self);
13892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        NSData *remoteWindowToken = WKAXRemoteTokenForElement([self window]);
13902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CoreIPC::DataReference elementToken = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>([remoteElementToken bytes]), [remoteElementToken length]);
13912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CoreIPC::DataReference windowToken = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>([remoteWindowToken bytes]), [remoteWindowToken length]);
13922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        _data->_page->registerUIProcessAccessibilityTokens(elementToken, windowToken);
13932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
13942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
139565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else {
139665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
139765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive | WebPageProxy::ViewIsInWindow);
139865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if ENABLE(GESTURE_EVENTS)
14002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (_data->_endGestureMonitor) {
14012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            [NSEvent removeMonitor:_data->_endGestureMonitor];
14022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            _data->_endGestureMonitor = nil;
14032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
14042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
14052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
140665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
140765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
140865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidBecomeKey:(NSNotification *)notification
140965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
141065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSWindow *keyWindow = [notification object];
141165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (keyWindow == [self window] || keyWindow == [[self window] attachedSheet])
141265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
141365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
141465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
141565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidResignKey:(NSNotification *)notification
141665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
141765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSWindow *formerKeyWindow = [notification object];
141865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (formerKeyWindow == [self window] || formerKeyWindow == [[self window] attachedSheet])
141965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->viewStateDidChange(WebPageProxy::ViewWindowIsActive);
142065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
142165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
142265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidMiniaturize:(NSNotification *)notification
142365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
142465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self _updateWindowVisibility];
142565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
142665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
142765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowDidDeminiaturize:(NSNotification *)notification
142865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
142965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self _updateWindowVisibility];
143065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
143165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
143265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_windowFrameDidChange:(NSNotification *)notification
143365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
143465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self _updateWindowAndViewFrames];
143565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
143665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14372fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic void drawPageBackground(CGContextRef context, WebPageProxy* page, const IntRect& rect)
14382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
14392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!page->drawsBackground())
14402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
14412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CGContextSaveGState(context);
14432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CGContextSetBlendMode(context, kCGBlendModeCopy);
14442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CGColorRef backgroundColor;
14462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (page->drawsTransparentBackground())
14472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        backgroundColor = CGColorGetConstantColor(kCGColorClear);
14482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    else
14492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        backgroundColor = CGColorGetConstantColor(kCGColorWhite);
14502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CGContextSetFillColorWithColor(context, backgroundColor);
14522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CGContextFillRect(context, rect);
14532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CGContextRestoreGState(context);
14552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
14562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
145765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)drawRect:(NSRect)rect
145865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
145965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(View, "drawRect: x:%g, y:%g, width:%g, height:%g", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
14602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_page->endPrinting();
146165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (useNewDrawingArea()) {
14622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        CGContextRef context = static_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]);
1463ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
14642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (DrawingAreaProxyImpl* drawingArea = static_cast<DrawingAreaProxyImpl*>(_data->_page->drawingArea())) {
1465ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            const NSRect *rectsBeingDrawn;
1466ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            NSInteger numRectsBeingDrawn;
1467ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            [self getRectsBeingDrawn:&rectsBeingDrawn count:&numRectsBeingDrawn];
1468ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            for (NSInteger i = 0; i < numRectsBeingDrawn; ++i) {
1469ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                Region unpaintedRegion;
1470ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                IntRect rect = enclosingIntRect(rectsBeingDrawn[i]);
1471ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                drawingArea->paint(context, rect, unpaintedRegion);
14722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
14732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                Vector<IntRect> unpaintedRects = unpaintedRegion.rects();
14742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                for (size_t i = 0; i < unpaintedRects.size(); ++i)
14752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    drawPageBackground(context, _data->_page.get(), unpaintedRects[i]);
1476ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            }
14772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        } else
14782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            drawPageBackground(context, _data->_page.get(), enclosingIntRect(rect));
147965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
148065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->didDraw();
148165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
148265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
148365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
148465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_page->isValid() && _data->_page->drawingArea()) {
148565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        CGContextRef context = static_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]);
148665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->drawingArea()->paint(IntRect(rect), context);
148765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_page->didDraw();
148865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else if (_data->_page->drawsBackground()) {
148965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [_data->_page->drawsTransparentBackground() ? [NSColor clearColor] : [NSColor whiteColor] set];
149065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSRectFill(rect);
149165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
149265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
149365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
149465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)isOpaque
149565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
149665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return _data->_page->drawsBackground();
149765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
149865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
149965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewDidHide
150065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
150165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
150265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
150365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
150465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)viewDidUnhide
150565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
150665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->viewStateDidChange(WebPageProxy::ViewIsVisible);
150765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
150865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
150965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)accessibilityIsIgnored
151065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
151165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return NO;
151265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
151365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
151465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)accessibilityHitTest:(NSPoint)point
151565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
151665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return _data->_remoteAccessibilityChild.get();
151765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
151865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
151965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (id)accessibilityAttributeValue:(NSString*)attribute
152065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
152165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([attribute isEqualToString:NSAccessibilityChildrenAttribute]) {
152265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!_data->_remoteAccessibilityChild)
152365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return nil;
152465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return [NSArray arrayWithObject:_data->_remoteAccessibilityChild.get()];
152565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
152665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([attribute isEqualToString:NSAccessibilityRoleAttribute])
152765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NSAccessibilityGroupRole;
152865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute])
152965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NSAccessibilityRoleDescription(NSAccessibilityGroupRole, nil);
153065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([attribute isEqualToString:NSAccessibilityParentAttribute])
153165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NSAccessibilityUnignoredAncestor([self superview]);
153265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([attribute isEqualToString:NSAccessibilityEnabledAttribute])
153365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return [NSNumber numberWithBool:YES];
153465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
153565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [super accessibilityAttributeValue:attribute];
153665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
153765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
153865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSView *)hitTest:(NSPoint)point
153965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
154065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSView *hitView = [super hitTest:point];
154165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (hitView && _data && hitView == _data->_layerHostingView)
154265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        hitView = self;
15432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
15442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if USE(ACCELERATED_COMPOSITING)
15452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (hitView && _data && hitView == _data->_oldLayerHostingView)
15462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        hitView = self;
154765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
154865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return hitView;
154965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
155065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
155165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSInteger)conversationIdentifier
155265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
155365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return (NSInteger)self;
155465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
155565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
155665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (BOOL)canChangeFrameLayout:(WKFrameRef)frameRef
1558ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
15592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // PDF documents are already paginated, so we can't change them to add headers and footers.
15602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return !toImpl(frameRef)->isMainFrame() || !_data->_pdfViewController;
1561ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
1562ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
156365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSPrintOperation *)printOperationWithPrintInfo:(NSPrintInfo *)printInfo forFrame:(WKFrameRef)frameRef
156465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
156565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LOG(View, "Creating an NSPrintOperation for frame '%s'", toImpl(frameRef)->url().utf8().data());
156665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
156765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Only the top frame can currently contain a PDF view.
156865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_pdfViewController) {
15692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!toImpl(frameRef)->isMainFrame())
15702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            return 0;
15712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return _data->_pdfViewController->makePrintOperation(printInfo);
15722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    } else {
15732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        RetainPtr<WKPrintingView> printingView(AdoptNS, [[WKPrintingView alloc] initWithFrameProxy:toImpl(frameRef)]);
15742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        // NSPrintOperation takes ownership of the view.
15752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        NSPrintOperation *printOperation = [NSPrintOperation printOperationWithView:printingView.get()];
15762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [printOperation setCanSpawnSeparateThread:YES];
15772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        printingView->_printOperation = printOperation;
15782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return printOperation;
157965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
158065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
158165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
158265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
158365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
158465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@implementation WKView (Internal)
158565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
158665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (PassOwnPtr<WebKit::DrawingAreaProxy>)_createDrawingAreaProxy
158765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
158865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (useNewDrawingArea())
158965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return DrawingAreaProxyImpl::create(_data->_page.get());
159065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
159165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ChunkedUpdateDrawingAreaProxy::create(self, _data->_page.get());
159265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
159365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
159465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (BOOL)_isFocused
159565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
159665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_inBecomeFirstResponder)
159765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return YES;
159865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data->_inResignFirstResponder)
159965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return NO;
160065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return [[self window] firstResponder] == self;
160165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
160265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
160365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_processDidCrash
160465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
160565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self setNeedsDisplay:YES];
16062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [self _updateRemoteAccessibilityRegistration:NO];
16072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_pageClosed
16102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [self _updateRemoteAccessibilityRegistration:NO];
161265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
161365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
161465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_didRelaunchProcess
161565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
161665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self setNeedsDisplay:YES];
161765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
161865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
161965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_takeFocus:(BOOL)forward
162065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
162165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (forward)
162265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[self window] selectKeyViewFollowingView:self];
162365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    else
162465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[self window] selectKeyViewPrecedingView:self];
162565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
162665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
162765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setCursor:(NSCursor *)cursor
162865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
162965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if ([NSCursor currentCursor] == cursor)
163065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
163165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [cursor set];
163265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
163365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
163465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setUserInterfaceItemState:(NSString *)commandName enabled:(BOOL)isEnabled state:(int)newState
163565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
163665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ValidationVector items = _data->_validationMap.take(commandName);
163765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    size_t size = items.size();
163865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < size; ++i) {
163965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ValidationItem item = items[i].get();
164065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setState:newState];
164165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [menuItem(item) setEnabled:isEnabled];
164265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [toolbarItem(item) setEnabled:isEnabled];
164365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // FIXME <rdar://problem/8803392>: If the item is neither a menu nor toolbar item, it will be left enabled.
164465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
164565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
164665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_setEventBeingResent:(NSEvent *)event
16482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_keyDownEventBeingResent = [event retain];
16502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (Vector<KeypressCommand>&)_interceptKeyEvent:(NSEvent *)theEvent
16532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_commandsList.clear();
16552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // interpretKeyEvents will trigger one or more calls to doCommandBySelector or setText
16562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // that will populate the commandsList vector.
16572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
16582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return _data->_commandsList;
16592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
16612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_getTextInputState:(unsigned)start selectionEnd:(unsigned)end underlines:(Vector<WebCore::CompositionUnderline>&)lines
16622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
16632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    start = _data->_selectionStart;
16642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    end = _data->_selectionEnd;
16652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    lines = _data->_underlines;
16662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
16672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
166865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)_convertToDeviceSpace:(NSRect)rect
166965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
167065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toDeviceSpace(rect, [self window]);
167165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
167265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
167365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSRect)_convertToUserSpace:(NSRect)rect
167465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
167565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toUserSpace(rect, [self window]);
167665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
167765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
167865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Any non-zero value will do, but using something recognizable might help us debug some day.
167965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define TRACKING_RECT_TAG 0xBADFACE
168065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
168165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSTrackingRectTag)addTrackingRect:(NSRect)rect owner:(id)owner userData:(void *)data assumeInside:(BOOL)assumeInside
168265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
168365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(_data->_trackingRectOwner == nil);
168465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_trackingRectOwner = owner;
168565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_trackingRectUserData = data;
168665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return TRACKING_RECT_TAG;
168765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
168865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
168965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSTrackingRectTag)_addTrackingRect:(NSRect)rect owner:(id)owner userData:(void *)data assumeInside:(BOOL)assumeInside useTrackingNum:(int)tag
169065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
169165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(tag == 0 || tag == TRACKING_RECT_TAG);
169265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(_data->_trackingRectOwner == nil);
169365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_trackingRectOwner = owner;
169465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_trackingRectUserData = data;
169565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return TRACKING_RECT_TAG;
169665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
169765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
169865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_addTrackingRects:(NSRect *)rects owner:(id)owner userDataList:(void **)userDataList assumeInsideList:(BOOL *)assumeInsideList trackingNums:(NSTrackingRectTag *)trackingNums count:(int)count
169965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
170065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(count == 1);
170165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(trackingNums[0] == 0 || trackingNums[0] == TRACKING_RECT_TAG);
170265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(_data->_trackingRectOwner == nil);
170365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_trackingRectOwner = owner;
170465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_trackingRectUserData = userDataList[0];
170565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    trackingNums[0] = TRACKING_RECT_TAG;
170665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
170765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
170865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)removeTrackingRect:(NSTrackingRectTag)tag
170965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
171065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (tag == 0)
171165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
171265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
171365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data && (tag == TRACKING_RECT_TAG)) {
171465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_trackingRectOwner = nil;
171565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
171665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
171765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
171865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (_data && (tag == _data->_lastToolTipTag)) {
171965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [super removeTrackingRect:tag];
172065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_lastToolTipTag = 0;
172165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
172265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
172365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
172465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If any other tracking rect is being removed, we don't know how it was created
172565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // and it's possible there's a leak involved (see 3500217)
172665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_NOT_REACHED();
172765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
172865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
172965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_removeTrackingRects:(NSTrackingRectTag *)tags count:(int)count
173065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
173165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int i;
173265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (i = 0; i < count; ++i) {
173365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        int tag = tags[i];
173465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (tag == 0)
173565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            continue;
173665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(tag == TRACKING_RECT_TAG);
173765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (_data != nil) {
173865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            _data->_trackingRectOwner = nil;
173965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
174065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
174165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
174265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
174365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_sendToolTipMouseExited
174465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
174565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Nothing matters except window, trackingNumber, and userData.
174665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSEvent *fakeEvent = [NSEvent enterExitEventWithType:NSMouseExited
174765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        location:NSMakePoint(0, 0)
174865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags:0
174965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        timestamp:0
175065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        windowNumber:[[self window] windowNumber]
175165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        context:NULL
175265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventNumber:0
175365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        trackingNumber:TRACKING_RECT_TAG
175465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        userData:_data->_trackingRectUserData];
175565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [_data->_trackingRectOwner mouseExited:fakeEvent];
175665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
175765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
175865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_sendToolTipMouseEntered
175965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
176065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Nothing matters except window, trackingNumber, and userData.
176165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSEvent *fakeEvent = [NSEvent enterExitEventWithType:NSMouseEntered
176265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        location:NSMakePoint(0, 0)
176365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        modifierFlags:0
176465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        timestamp:0
176565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        windowNumber:[[self window] windowNumber]
176665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        context:NULL
176765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventNumber:0
176865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        trackingNumber:TRACKING_RECT_TAG
176965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        userData:_data->_trackingRectUserData];
177065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [_data->_trackingRectOwner mouseEntered:fakeEvent];
177165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
177265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
177365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (NSString *)view:(NSView *)view stringForToolTip:(NSToolTipTag)tag point:(NSPoint)point userData:(void *)data
177465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
177565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return nsStringFromWebCoreString(_data->_page->toolTip());
177665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
177765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
177865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_toolTipChangedFrom:(NSString *)oldToolTip to:(NSString *)newToolTip
177965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
178065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (oldToolTip)
178165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self _sendToolTipMouseExited];
178265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
178365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (newToolTip && [newToolTip length] > 0) {
178465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // See radar 3500217 for why we remove all tooltips rather than just the single one we created.
178565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self removeAllToolTips];
178665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSRect wideOpenRect = NSMakeRect(-100000, -100000, 200000, 200000);
178765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_lastToolTipTag = [self addToolTipRect:wideOpenRect owner:self userData:NULL];
178865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self _sendToolTipMouseEntered];
178965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
179065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
179165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
179265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setFindIndicator:(PassRefPtr<FindIndicator>)findIndicator fadeOut:(BOOL)fadeOut
179365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
179465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!findIndicator) {
179565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_findIndicatorWindow = 0;
179665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
179765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
179865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
179965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!_data->_findIndicatorWindow)
180065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_findIndicatorWindow = FindIndicatorWindow::create(self);
180165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
180265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_findIndicatorWindow->setFindIndicator(findIndicator, fadeOut);
180365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
180465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
180565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if USE(ACCELERATED_COMPOSITING)
180665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_startAcceleratedCompositing:(CALayer *)rootLayer
180765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!_data->_oldLayerHostingView) {
180965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NSView *hostingView = [[NSView alloc] initWithFrame:[self bounds]];
181065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !defined(BUILDING_ON_LEOPARD)
181165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [hostingView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
181265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
181365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
181465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [self addSubview:hostingView];
181565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [hostingView release];
18162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        _data->_oldLayerHostingView = hostingView;
181765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
181865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
181965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Make a container layer, which will get sized/positioned by AppKit and CA.
182065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CALayer *viewLayer = [CALayer layer];
182165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
182265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef NDEBUG
182365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [viewLayer setName:@"hosting layer"];
182465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
182565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
182665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if defined(BUILDING_ON_LEOPARD)
182765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Turn off default animations.
182865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSNull *nullValue = [NSNull null];
182965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NSDictionary *actions = [NSDictionary dictionaryWithObjectsAndKeys:
183065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"anchorPoint",
183165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"bounds",
183265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"contents",
183365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"contentsRect",
183465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"opacity",
183565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"position",
183665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"sublayerTransform",
183765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"sublayers",
183865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nullValue, @"transform",
183965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             nil];
184065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [viewLayer setStyle:[NSDictionary dictionaryWithObject:actions forKey:@"actions"]];
184165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
184265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
184365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if !defined(BUILDING_ON_LEOPARD)
184465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // If we aren't in the window yet, we'll use the screen's scale factor now, and reset the scale
184565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // via -viewDidMoveToWindow.
184665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CGFloat scaleFactor = [self window] ? [[self window] userSpaceScaleFactor] : [[NSScreen mainScreen] userSpaceScaleFactor];
184765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [viewLayer setTransform:CATransform3DMakeScale(scaleFactor, scaleFactor, 1)];
184865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif
184965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_oldLayerHostingView setLayer:viewLayer];
18512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_oldLayerHostingView setWantsLayer:YES];
185265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
185365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Parent our root layer in the container layer
185465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [viewLayer addSublayer:rootLayer];
185565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
185665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
185765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_stopAcceleratedCompositing
185865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (_data->_oldLayerHostingView) {
18602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [_data->_oldLayerHostingView setLayer:nil];
18612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [_data->_oldLayerHostingView setWantsLayer:NO];
18622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [_data->_oldLayerHostingView removeFromSuperview];
18632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        _data->_oldLayerHostingView = nil;
186465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
186565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
186665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
186765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_switchToDrawingAreaTypeIfNecessary:(DrawingAreaInfo::Type)type
186865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
186965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    DrawingAreaInfo::Type existingDrawingAreaType = _data->_page->drawingArea() ? _data->_page->drawingArea()->info().type : DrawingAreaInfo::None;
187065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (existingDrawingAreaType == type)
187165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
187265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
187365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<DrawingAreaProxy> newDrawingArea;
187465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (type) {
187565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case DrawingAreaInfo::Impl:
187665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case DrawingAreaInfo::None:
187765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
187865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case DrawingAreaInfo::ChunkedUpdate: {
187965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            newDrawingArea = ChunkedUpdateDrawingAreaProxy::create(self, _data->_page.get());
188065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
188165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
188265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        case DrawingAreaInfo::LayerBacked: {
188365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            newDrawingArea = LayerBackedDrawingAreaProxy::create(self, _data->_page.get());
188465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            break;
188565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
188665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
188765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    newDrawingArea->setSize(IntSize([self frame].size), IntSize());
188965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
189065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->drawingArea()->detachCompositingContext();
189165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_page->setDrawingArea(newDrawingArea.release());
189265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
189365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_enterAcceleratedCompositingMode:(const LayerTreeContext&)layerTreeContext
18952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
18962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!_data->_layerHostingView);
18972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!layerTreeContext.isEmpty());
18982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
18992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Create an NSView that will host our layer tree.
19002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_layerHostingView.adoptNS([[NSView alloc] initWithFrame:[self bounds]]);
19012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_layerHostingView.get() setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
19022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [self addSubview:_data->_layerHostingView.get()];
19032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
19042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    // Create a root layer that will back the NSView.
19052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    RetainPtr<CALayer> rootLayer(AdoptNS, [[CALayer alloc] init]);
19062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#ifndef NDEBUG
19072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [rootLayer.get() setName:@"Hosting root layer"];
19082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
19092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
19102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    CALayer *renderLayer = WKMakeRenderLayer(layerTreeContext.contextID);
19112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [rootLayer.get() addSublayer:renderLayer];
19122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
19132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_layerHostingView.get() setLayer:rootLayer.get()];
19142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_layerHostingView.get() setWantsLayer:YES];
19152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
19162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
19172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_exitAcceleratedCompositingMode
19182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
19192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(_data->_layerHostingView);
19202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
19212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_layerHostingView.get() setLayer:nil];
19222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_layerHostingView.get() setWantsLayer:NO];
19232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [_data->_layerHostingView.get() removeFromSuperview];
19242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
19252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_layerHostingView = nullptr;
19262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
19272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
192865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_pageDidEnterAcceleratedCompositing
192965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
193065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self _switchToDrawingAreaTypeIfNecessary:DrawingAreaInfo::LayerBacked];
193165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
193265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
193365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_pageDidLeaveAcceleratedCompositing
193465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
193565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: we may want to avoid flipping back to the non-layer-backed drawing area until the next page load, to avoid thrashing.
193665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    [self _switchToDrawingAreaTypeIfNecessary:DrawingAreaInfo::ChunkedUpdate];
193765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
193865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // USE(ACCELERATED_COMPOSITING)
193965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_setAccessibilityWebProcessToken:(NSData *)data
19412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
19422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if !defined(BUILDING_ON_SNOW_LEOPARD)
19432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_remoteAccessibilityChild = WKAXRemoteElementForToken(data);
19442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [self _updateRemoteAccessibilityRegistration:YES];
19452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif
19462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
19472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
194865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setComplexTextInputEnabled:(BOOL)complexTextInputEnabled pluginComplexTextInputIdentifier:(uint64_t)pluginComplexTextInputIdentifier
194965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
195065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BOOL inputSourceChanged = _data->_pluginComplexTextInputIdentifier;
195165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
195265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (complexTextInputEnabled) {
195365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Check if we're already allowing text input for this plug-in.
195465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (pluginComplexTextInputIdentifier == _data->_pluginComplexTextInputIdentifier)
195565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
195665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
195765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_pluginComplexTextInputIdentifier = pluginComplexTextInputIdentifier;
195865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
195965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else {
196065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Check if we got a request to disable complex text input for a plug-in that is not the current plug-in.
196165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (pluginComplexTextInputIdentifier != _data->_pluginComplexTextInputIdentifier)
196265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return;
196365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
196465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_pluginComplexTextInputIdentifier = 0;
196565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
196665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
196765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (inputSourceChanged) {
196865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Inform the out of line window that the input source changed.
196965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        [[WKTextInputWindowController sharedTextInputWindowController] keyboardInputSourceChanged];
197065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
197165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
197265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
197365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setPageHasCustomRepresentation:(BOOL)pageHasCustomRepresentation
197465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
197565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_pdfViewController = nullptr;
197665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
197765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (pageHasCustomRepresentation)
197865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        _data->_pdfViewController = PDFViewController::create(self);
197965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
198065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
198165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_didFinishLoadingDataForCustomRepresentation:(const CoreIPC::DataReference&)dataReference
198265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
198365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(_data->_pdfViewController);
198465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
198565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_pdfViewController->setPDFDocumentData(_data->_page->mainFrame()->mimeType(), dataReference);
198665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
198765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
198865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (double)_customRepresentationZoomFactor
198965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
199065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!_data->_pdfViewController)
199165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 1;
199265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
199365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return _data->_pdfViewController->zoomFactor();
199465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
199565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
199665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch- (void)_setCustomRepresentationZoomFactor:(double)zoomFactor
199765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
199865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!_data->_pdfViewController)
199965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
200065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
200165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    _data->_pdfViewController->setZoomFactor(zoomFactor);
200265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
200365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2004ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch- (void)_setDragImage:(NSImage *)image at:(NSPoint)clientPoint linkDrag:(BOOL)linkDrag
2005ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
2006ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // We need to prevent re-entering this call to avoid crashing in AppKit.
2007ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Given the asynchronous nature of WebKit2 this can now happen.
2008ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (_data->_dragHasStarted)
2009ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
2010ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
2011ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_dragHasStarted = YES;
2012ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    [super dragImage:image
2013ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch                  at:clientPoint
2014ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              offset:NSZeroSize
2015ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch               event:(linkDrag) ? [NSApp currentEvent] :_data->_mouseDownEvent
2016ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch          pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard]
2017ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch              source:self
2018ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch           slideBack:YES];
2019ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    _data->_dragHasStarted = NO;
2020ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
2021ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
20222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_setDrawingAreaSize:(NSSize)size
20232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!_data->_page->drawingArea())
20252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
20262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_page->drawingArea()->setSize(IntSize(size), IntSize(_data->_resizeScrollOffset));
20282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _data->_resizeScrollOffset = NSZeroSize;
20292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)_didChangeScrollbarsForMainFrame
20322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    [self _updateGrowBoxForWindowFrameChange];
20342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block@end
20372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block@implementation WKView (Private)
20392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)disableFrameSizeUpdates
20412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    _frameSizeUpdatesDisabledCount++;
20432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (void)enableFrameSizeUpdates
20462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!_frameSizeUpdatesDisabledCount)
20482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return;
20492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!(--_frameSizeUpdatesDisabledCount))
20512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        [self _setDrawingAreaSize:[self frame].size];
20522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
20542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block- (BOOL)frameSizeUpdatesDisabled
20552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
20562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return _frameSizeUpdatesDisabledCount > 0;
20572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
20582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
205965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch@end
20602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2061