blob: 06440cda8ca65d33eed7d317c1c61833cf7e0ab0 [file] [log] [blame]
/*
* Copyright (C) 2018 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "config.h"
#import "TestInspectorBar.h"
#if PLATFORM(MAC)
#import <objc/runtime.h>
#import <wtf/WeakObjCPtr.h>
@implementation TestInspectorBarItemController {
WeakObjCPtr<TestInspectorBar> _testInspectorBar;
}
- (instancetype)initWithInspectorBar:(TestInspectorBar *)inspectorBar
{
if (self = [super initWithInspectorBar:inspectorBar]) {
inspectorBar.itemController = self;
_testInspectorBar = inspectorBar;
}
return self;
}
- (TestInspectorBar *)inspectorBar
{
return _testInspectorBar.get().get();
}
- (void)updateSelectedAttributes
{
// Older versions of AppKit only invoke synchronous NSTextInputClient methods, which immediately causes a debug
// assertion in WebKit. To prevent this assertion, we suppress selection updates for versions of macOS where AppKit
// only knows how to update selected attributes using synchronous text input client methods. That being said, the
// inspector bar item controller still needs to set its _client pointer to the inspector bar's client; otherwise,
// attempts to send @selector(changeAttributes:) when changing font attributes will become no-ops.
object_setInstanceVariable(self, "_client", [_testInspectorBar client]);
}
@end
@implementation TestInspectorBar {
WeakObjCPtr<TestInspectorBarItemController> _testItemController;
}
- (instancetype)initWithWebView:(WKWebView<NSInspectorBarClient> *)webView
{
if (self = [super init]) {
self.visible = YES;
self.client = webView;
[webView.window setInspectorBar:self];
}
return self;
}
+ (Class)standardItemControllerClass
{
return TestInspectorBarItemController.class;
}
+ (NSArray<NSString *> *)standardTextItemIdentifiers
{
static NSArray<NSString *> *identifiers = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
identifiers = @[
NSInspectorBarFontFamilyItemIdentifier,
NSInspectorBarFontSizeItemIdentifier,
NSInspectorBarTextForegroundColorItemIdentifier,
NSInspectorBarTextBackgroundColorItemIdentifier,
NSInspectorBarFontStyleItemIdentifier
];
});
return identifiers;
}
- (void)_setStyleControlSelected:(BOOL)selected atIndex:(NSInteger)index
{
NSSegmentedControl *styleControls = [_testItemController textStyleSwitches];
styleControls.selectedSegment = index;
[styleControls setSelected:selected forSegment:index];
[_testItemController _fontStyleAction:styleControls];
}
- (void)chooseFontSize:(CGFloat)fontSize
{
[_testItemController fontSizeItemWasClicked:@(fontSize)];
}
- (void)chooseFontFamily:(NSString *)fontFamily
{
NSPopUpButton *fontFamilyPopup = [_testItemController fontFamilyPopup];
[_testItemController menuNeedsUpdate:fontFamilyPopup.cell.menu];
for (NSMenuItem *item in [fontFamilyPopup itemArray]) {
if ([item.representedObject isKindOfClass:NSString.class] && [fontFamily isEqualToString:item.representedObject]) {
[fontFamilyPopup selectItem:item];
[_testItemController _fontPopupAction:fontFamilyPopup];
return;
}
}
ASSERT_NOT_REACHED();
}
- (void)_chooseColor:(NSColor *)color inColorWell:(NSColorWell *)colorWell
{
[colorWell setColor:color];
[_testItemController _colorAction:colorWell];
}
- (void)chooseForegroundColor:(NSColor *)color
{
[self _chooseColor:color inColorWell:[_testItemController foregroundColorWell]];
}
- (void)chooseBackgroundColor:(NSColor *)color
{
[self _chooseColor:color inColorWell:[_testItemController backgroundColorWell]];
}
- (void)formatBold:(BOOL)bold
{
[self _setStyleControlSelected:bold atIndex:0];
}
- (void)formatItalic:(BOOL)italic
{
[self _setStyleControlSelected:italic atIndex:1];
}
- (void)formatUnderline:(BOOL)underline
{
[self _setStyleControlSelected:underline atIndex:2];
}
- (TestInspectorBarItemController *)itemController
{
return _testItemController.get().get();
}
- (void)setItemController:(TestInspectorBarItemController *)itemController
{
_testItemController = itemController;
}
@end
#endif // PLATFORM(MAC)