/*
 * Copyright (C) 2005-2017 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer. 
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution. 
 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// Things internal to the WebKit framework; not SPI.

#import "WebHTMLViewPrivate.h"
#import <wtf/NakedPtr.h>

@class CALayer;
@class WebFrame;
@class WebPluginController;

namespace WebCore {
    class CachedImage;
    class KeyboardEvent;
}

#if PLATFORM(MAC)

@interface WebHTMLView () <NSDraggingSource>
@end

#endif

@interface WebHTMLView (WebInternal)
- (void)_selectionChanged;

#if PLATFORM(MAC)
- (void)_updateFontPanel;
- (void)_setSoftSpaceRange:(NSRange)range;
#endif

- (BOOL)_canSmartCopyOrDelete;

- (WebFrame *)_frame;
- (void)closeIfNotCurrentView;

#if PLATFORM(MAC)
- (void)_lookUpInDictionaryFromMenu:(id)sender;
- (BOOL)_interpretKeyEvent:(NakedPtr<WebCore::KeyboardEvent>)event savingCommands:(BOOL)savingCommands;
- (DOMDocumentFragment *)_documentFragmentFromPasteboard:(NSPasteboard *)pasteboard;
- (NSEvent *)_mouseDownEvent;
- (BOOL)isGrammarCheckingEnabled;
- (void)setGrammarCheckingEnabled:(BOOL)flag;
- (void)toggleGrammarChecking:(id)sender;
- (void)setPromisedDragTIFFDataSource:(NakedPtr<WebCore::CachedImage>)source;
#endif

#if PLATFORM(IOS_FAMILY)
- (BOOL)_handleEditingKeyEvent:(WebCore::KeyboardEvent *)event;
#endif

- (void)_web_updateLayoutAndStyleIfNeededRecursive;
- (void)_destroyAllWebPlugins;
- (BOOL)_needsLayout;

#if PLATFORM(MAC)
- (void)attachRootLayer:(CALayer *)layer;
- (void)detachRootLayer;

- (BOOL)_web_isDrawingIntoLayer;
- (BOOL)_web_isDrawingIntoAcceleratedLayer;
#endif

#if PLATFORM(IOS_FAMILY)
- (void)_layoutIfNeeded;
#endif

#if PLATFORM(MAC)
- (void)_changeSpellingToWord:(NSString *)newWord;
- (void)_startAutoscrollTimer:(NSEvent *)event;
#endif

- (void)_stopAutoscrollTimer;

- (WebPluginController *)_pluginController;

- (void)_executeSavedKeypressCommands;

@end

@interface WebHTMLView (RemovedAppKitSuperclassMethods)
#if PLATFORM(IOS_FAMILY)
- (void)delete:(id)sender;
- (void)transpose:(id)sender;
#endif
- (BOOL)hasMarkedText;
@end
