summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm')
-rw-r--r--Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm185
1 files changed, 0 insertions, 185 deletions
diff --git a/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm b/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm
deleted file mode 100644
index f74b76015..000000000
--- a/Source/WebKit2/UIProcess/mac/WebPopupMenuProxyMac.mm
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2010, 2011 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 "WebPopupMenuProxyMac.h"
-
-#if USE(APPKIT)
-
-#import "NativeWebMouseEvent.h"
-#import "PageClientImpl.h"
-#import "PlatformPopupMenuData.h"
-#import "StringUtilities.h"
-#import "WKView.h"
-#import "WebPopupItem.h"
-#import <WebKitSystemInterface.h>
-
-using namespace WebCore;
-
-namespace WebKit {
-
-WebPopupMenuProxyMac::WebPopupMenuProxyMac(WKView *webView, WebPopupMenuProxy::Client* client)
- : WebPopupMenuProxy(client)
- , m_webView(webView)
-{
-}
-
-WebPopupMenuProxyMac::~WebPopupMenuProxyMac()
-{
- if (m_popup)
- [m_popup.get() setControlView:nil];
-}
-
-void WebPopupMenuProxyMac::populate(const Vector<WebPopupItem>& items, NSFont *font, TextDirection menuTextDirection)
-{
- if (m_popup)
- [m_popup.get() removeAllItems];
- else {
- m_popup = adoptNS([[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:NO]);
- [m_popup.get() setUsesItemFromMenu:NO];
- [m_popup.get() setAutoenablesItems:NO];
- }
-
- int size = items.size();
-
- for (int i = 0; i < size; i++) {
- if (items[i].m_type == WebPopupItem::Separator)
- [[m_popup.get() menu] addItem:[NSMenuItem separatorItem]];
- else {
- [m_popup.get() addItemWithTitle:@""];
- NSMenuItem *menuItem = [m_popup.get() lastItem];
-
- RetainPtr<NSMutableParagraphStyle> paragraphStyle = adoptNS([[NSParagraphStyle defaultParagraphStyle] mutableCopy]);
- NSWritingDirection writingDirection = items[i].m_textDirection == LTR ? NSWritingDirectionLeftToRight : NSWritingDirectionRightToLeft;
- [paragraphStyle.get() setBaseWritingDirection:writingDirection];
- [paragraphStyle.get() setAlignment:menuTextDirection == LTR ? NSLeftTextAlignment : NSRightTextAlignment];
- RetainPtr<NSMutableDictionary> attributes = adoptNS([[NSMutableDictionary alloc] initWithObjectsAndKeys:
- paragraphStyle.get(), NSParagraphStyleAttributeName,
- font, NSFontAttributeName,
- nil]);
- if (items[i].m_hasTextDirectionOverride) {
- RetainPtr<NSNumber> writingDirectionValue = adoptNS([[NSNumber alloc] initWithInteger:writingDirection + NSTextWritingDirectionOverride]);
- RetainPtr<NSArray> writingDirectionArray = adoptNS([[NSArray alloc] initWithObjects:writingDirectionValue.get(), nil]);
- [attributes.get() setObject:writingDirectionArray.get() forKey:NSWritingDirectionAttributeName];
- }
- RetainPtr<NSAttributedString> string = adoptNS([[NSAttributedString alloc] initWithString:nsStringFromWebCoreString(items[i].m_text) attributes:attributes.get()]);
-
- [menuItem setAttributedTitle:string.get()];
- // We set the title as well as the attributed title here. The attributed title will be displayed in the menu,
- // but typeahead will use the non-attributed string that doesn't contain any leading or trailing whitespace.
- [menuItem setTitle:[[string.get() string] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
- [menuItem setEnabled:items[i].m_isEnabled];
- [menuItem setToolTip:nsStringFromWebCoreString(items[i].m_toolTip)];
- }
- }
-}
-
-void WebPopupMenuProxyMac::showPopupMenu(const IntRect& rect, TextDirection textDirection, double pageScaleFactor, const Vector<WebPopupItem>& items, const PlatformPopupMenuData& data, int32_t selectedIndex)
-{
- NSFont *font;
- if (data.fontInfo.fontAttributeDictionary) {
- NSFontDescriptor *fontDescriptor = [NSFontDescriptor fontDescriptorWithFontAttributes:(NSDictionary *)data.fontInfo.fontAttributeDictionary.get()];
- font = [NSFont fontWithDescriptor:fontDescriptor size:((pageScaleFactor != 1) ? [fontDescriptor pointSize] * pageScaleFactor : 0)];
- } else
- font = [NSFont menuFontOfSize:0];
-
- populate(items, font, textDirection);
-
- [m_popup.get() attachPopUpWithFrame:rect inView:m_webView];
- [m_popup.get() selectItemAtIndex:selectedIndex];
- [m_popup.get() setUserInterfaceLayoutDirection:textDirection == LTR ? NSUserInterfaceLayoutDirectionLeftToRight : NSUserInterfaceLayoutDirectionRightToLeft];
-
- NSMenu *menu = [m_popup.get() menu];
-
- // These values were borrowed from AppKit to match their placement of the menu.
- const int popOverHorizontalAdjust = -10;
- const int popUnderHorizontalAdjust = 6;
- const int popUnderVerticalAdjust = 6;
-
- // Menus that pop-over directly obscure the node that generated the popup menu.
- // Menus that pop-under are offset underneath it.
- NSPoint location;
- if (data.shouldPopOver) {
- NSRect titleFrame = [m_popup.get() titleRectForBounds:rect];
- if (titleFrame.size.width <= 0 || titleFrame.size.height <= 0)
- titleFrame = rect;
- float vertOffset = roundf((NSMaxY(rect) - NSMaxY(titleFrame)) + NSHeight(titleFrame));
- location = NSMakePoint(NSMinX(rect) + popOverHorizontalAdjust, NSMaxY(rect) - vertOffset);
- } else
- location = NSMakePoint(NSMinX(rect) + popUnderHorizontalAdjust, NSMaxY(rect) + popUnderVerticalAdjust);
-
- RetainPtr<NSView> dummyView = adoptNS([[NSView alloc] initWithFrame:rect]);
- [m_webView addSubview:dummyView.get()];
- location = [dummyView.get() convertPoint:location fromView:m_webView];
-
- WKPopupMenu(menu, location, roundf(NSWidth(rect)), dummyView.get(), selectedIndex, font);
-
- [m_popup.get() dismissPopUp];
- [dummyView.get() removeFromSuperview];
-
- if (!m_client)
- return;
-
- m_client->valueChangedForPopupMenu(this, [m_popup.get() indexOfSelectedItem]);
-
- // <https://bugs.webkit.org/show_bug.cgi?id=57904> This code is adopted from EventHandler::sendFakeEventsAfterWidgetTracking().
- if (!m_client->currentlyProcessedMouseDownEvent())
- return;
-
- NSEvent* initiatingNSEvent = m_client->currentlyProcessedMouseDownEvent()->nativeEvent();
- if ([initiatingNSEvent type] != NSLeftMouseDown)
- return;
-
- NSEvent *fakeEvent = [NSEvent mouseEventWithType:NSLeftMouseUp
- location:[initiatingNSEvent locationInWindow]
- modifierFlags:[initiatingNSEvent modifierFlags]
- timestamp:[initiatingNSEvent timestamp]
- windowNumber:[initiatingNSEvent windowNumber]
- context:[initiatingNSEvent context]
- eventNumber:[initiatingNSEvent eventNumber]
- clickCount:[initiatingNSEvent clickCount]
- pressure:[initiatingNSEvent pressure]];
-
- [NSApp postEvent:fakeEvent atStart:YES];
- fakeEvent = [NSEvent mouseEventWithType:NSMouseMoved
- location:[[m_webView window] convertScreenToBase:[NSEvent mouseLocation]]
- modifierFlags:[initiatingNSEvent modifierFlags]
- timestamp:[initiatingNSEvent timestamp]
- windowNumber:[initiatingNSEvent windowNumber]
- context:[initiatingNSEvent context]
- eventNumber:0
- clickCount:0
- pressure:0];
- [NSApp postEvent:fakeEvent atStart:YES];
-}
-
-void WebPopupMenuProxyMac::hidePopupMenu()
-{
- [m_popup.get() dismissPopUp];
-}
-
-} // namespace WebKit
-
-#endif // USE(APPKIT)