/* * 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 #import @implementation TestInspectorBarItemController { WeakObjCPtr _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 _testItemController; } - (instancetype)initWithWebView:(WKWebView *)webView { if (self = [super init]) { self.visible = YES; self.client = webView; [webView.window setInspectorBar:self]; } return self; } + (Class)standardItemControllerClass { return TestInspectorBarItemController.class; } + (NSArray *)standardTextItemIdentifiers { static NSArray *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)