📄 webframeview.mm
字号:
if ([firstResponder isKindOfClass:[WebHTMLView class]]) { return NO; } return [firstResponder isKindOfClass:[NSControl class]];}- (void)keyDown:(NSEvent *)event{ NSString *characters = [event characters]; int index, count; BOOL callSuper = YES; Frame* coreFrame = [self _web_frame]; BOOL maintainsBackForwardList = coreFrame && coreFrame->page()->backForwardList()->enabled() ? YES : NO; count = [characters length]; for (index = 0; index < count; ++index) { switch ([characters characterAtIndex:index]) { case NSDeleteCharacter: if (!maintainsBackForwardList) { callSuper = YES; break; } // This odd behavior matches some existing browsers, // including Windows IE if ([event modifierFlags] & NSShiftKeyMask) { [self _goForward]; } else { [self _goBack]; } callSuper = NO; break; case SpaceKey: // Checking for a control will allow events to percolate // correctly when the focus is on a form control and we // are in full keyboard access mode. if ((![self allowsScrolling] && ![self _largestChildWithScrollBars]) || [self _firstResponderIsFormControl]) { callSuper = YES; break; } if ([event modifierFlags] & NSShiftKeyMask) { [self scrollPageUp:nil]; } else { [self scrollPageDown:nil]; } callSuper = NO; break; case NSPageUpFunctionKey: if (![self allowsScrolling] && ![self _largestChildWithScrollBars]) { callSuper = YES; break; } [self scrollPageUp:nil]; callSuper = NO; break; case NSPageDownFunctionKey: if (![self allowsScrolling] && ![self _largestChildWithScrollBars]) { callSuper = YES; break; } [self scrollPageDown:nil]; callSuper = NO; break; case NSHomeFunctionKey: if (![self allowsScrolling] && ![self _largestChildWithScrollBars]) { callSuper = YES; break; } [self scrollToBeginningOfDocument:nil]; callSuper = NO; break; case NSEndFunctionKey: if (![self allowsScrolling] && ![self _largestChildWithScrollBars]) { callSuper = YES; break; } [self scrollToEndOfDocument:nil]; callSuper = NO; break; case NSUpArrowFunctionKey: // We don't handle shifted or control-arrow keys here, so let super have a chance. if ([event modifierFlags] & (NSShiftKeyMask | NSControlKeyMask)) { callSuper = YES; break; } if ((![self allowsScrolling] && ![self _largestChildWithScrollBars]) || [[[self window] firstResponder] isKindOfClass:[NSPopUpButton class]]) { // Let arrow keys go through to pop up buttons // <rdar://problem/3455910>: hitting up or down arrows when focus is on a // pop-up menu should pop the menu callSuper = YES; break; } if ([event modifierFlags] & NSCommandKeyMask) { [self scrollToBeginningOfDocument:nil]; } else if ([event modifierFlags] & NSAlternateKeyMask) { [self scrollPageUp:nil]; } else { [self scrollLineUp:nil]; } callSuper = NO; break; case NSDownArrowFunctionKey: // We don't handle shifted or control-arrow keys here, so let super have a chance. if ([event modifierFlags] & (NSShiftKeyMask | NSControlKeyMask)) { callSuper = YES; break; } if ((![self allowsScrolling] && ![self _largestChildWithScrollBars]) || [[[self window] firstResponder] isKindOfClass:[NSPopUpButton class]]) { // Let arrow keys go through to pop up buttons // <rdar://problem/3455910>: hitting up or down arrows when focus is on a // pop-up menu should pop the menu callSuper = YES; break; } if ([event modifierFlags] & NSCommandKeyMask) { [self scrollToEndOfDocument:nil]; } else if ([event modifierFlags] & NSAlternateKeyMask) { [self scrollPageDown:nil]; } else { [self scrollLineDown:nil]; } callSuper = NO; break; case NSLeftArrowFunctionKey: // We don't handle shifted or control-arrow keys here, so let super have a chance. if ([event modifierFlags] & (NSShiftKeyMask | NSControlKeyMask)) { callSuper = YES; break; } // Check back/forward related keys. if ([event modifierFlags] & NSCommandKeyMask) { if (!maintainsBackForwardList) { callSuper = YES; break; } [self _goBack]; } else { // Now check scrolling related keys. if ((![self allowsScrolling] && ![self _largestChildWithScrollBars])) { callSuper = YES; break; } if ([event modifierFlags] & NSAlternateKeyMask) { [self _pageHorizontally:YES]; } else { [self _scrollLineHorizontally:YES]; } } callSuper = NO; break; case NSRightArrowFunctionKey: // We don't handle shifted or control-arrow keys here, so let super have a chance. if ([event modifierFlags] & (NSShiftKeyMask | NSControlKeyMask)) { callSuper = YES; break; } // Check back/forward related keys. if ([event modifierFlags] & NSCommandKeyMask) { if (!maintainsBackForwardList) { callSuper = YES; break; } [self _goForward]; } else { // Now check scrolling related keys. if ((![self allowsScrolling] && ![self _largestChildWithScrollBars])) { callSuper = YES; break; } if ([event modifierFlags] & NSAlternateKeyMask) { [self _pageHorizontally:NO]; } else { [self _scrollLineHorizontally:NO]; } } callSuper = NO; break; } } if (callSuper) { [super keyDown:event]; } else { // if we did something useful, get the cursor out of the way [NSCursor setHiddenUntilMouseMoves:YES]; }}- (NSView *)_webcore_effectiveFirstResponder{ NSView *view = [self documentView]; return view ? [view _webcore_effectiveFirstResponder] : [super _webcore_effectiveFirstResponder];}- (BOOL)canPrintHeadersAndFooters{ NSView *documentView = [[self _scrollView] documentView]; if ([documentView respondsToSelector:@selector(canPrintHeadersAndFooters)]) { return [(id)documentView canPrintHeadersAndFooters]; } return NO;}- (NSPrintOperation *)printOperationWithPrintInfo:(NSPrintInfo *)printInfo{ NSView *documentView = [[self _scrollView] documentView]; if (!documentView) { return nil; } if ([documentView respondsToSelector:@selector(printOperationWithPrintInfo:)]) { return [(id)documentView printOperationWithPrintInfo:printInfo]; } return [NSPrintOperation printOperationWithView:documentView printInfo:printInfo];}- (BOOL)documentViewShouldHandlePrint{ NSView *documentView = [[self _scrollView] documentView]; if (documentView && [documentView respondsToSelector:@selector(documentViewShouldHandlePrint)]) return [(id)documentView documentViewShouldHandlePrint]; return NO;}- (void)printDocumentView{ NSView *documentView = [[self _scrollView] documentView]; if (documentView && [documentView respondsToSelector:@selector(printDocumentView)]) [(id)documentView printDocumentView];}@end@implementation WebFrameView (WebPrivate)- (float)_area{ NSRect frame = [self frame]; return frame.size.height * frame.size.width;}- (BOOL)_hasScrollBars{ NSScrollView *scrollView = [self _scrollView]; return [scrollView hasHorizontalScroller] || [scrollView hasVerticalScroller];}- (WebFrameView *)_largestChildWithScrollBars{ WebFrameView *largest = nil; NSArray *frameChildren = [[self webFrame] childFrames]; unsigned i; for (i=0; i < [frameChildren count]; i++) { WebFrameView *childFrameView = [[frameChildren objectAtIndex:i] frameView]; WebFrameView *scrollableFrameView = [childFrameView _hasScrollBars] ? childFrameView : [childFrameView _largestChildWithScrollBars]; if (!scrollableFrameView) continue; // Some ads lurk in child frames of zero width and height, see radar 4406994. These don't count as scrollable. // Maybe someday we'll discover that this minimum area check should be larger, but this covers the known cases. float area = [scrollableFrameView _area]; if (area < 1.0) continue; if (!largest || (area > [largest _area])) { largest = scrollableFrameView; } } return largest;}- (NSClipView *)_contentView{ return [[self _scrollView] contentView];}- (Class)_customScrollViewClass{ if ([_private->frameScrollView class] == [WebDynamicScrollBarsView class]) return nil; return [_private->frameScrollView class];}- (void)_setCustomScrollViewClass:(Class)customClass{ if (!customClass) customClass = [WebDynamicScrollBarsView class]; ASSERT([customClass isSubclassOfClass:[WebDynamicScrollBarsView class]]); if (customClass == [_private->frameScrollView class]) return; if (![customClass isSubclassOfClass:[WebDynamicScrollBarsView class]]) return; WebDynamicScrollBarsView *oldScrollView = _private->frameScrollView; // already retained NSView <WebDocumentView> *documentView = [[self documentView] retain]; WebDynamicScrollBarsView *scrollView = [[customClass alloc] initWithFrame:[oldScrollView frame]]; [scrollView setContentView:[[[WebClipView alloc] initWithFrame:[scrollView bounds]] autorelease]]; [scrollView setDrawsBackground:[oldScrollView drawsBackground]]; [scrollView setHasVerticalScroller:[oldScrollView hasVerticalScroller]]; [scrollView setHasHorizontalScroller:[oldScrollView hasHorizontalScroller]]; [scrollView setAutoresizingMask:[oldScrollView autoresizingMask]]; [scrollView setLineScroll:[oldScrollView lineScroll]]; [self addSubview:scrollView]; // don't call our overridden version here; we need to make the standard NSView link between us // and our subview so that previousKeyView and previousValidKeyView work as expected. This works // together with our becomeFirstResponder and setNextKeyView overrides. [super setNextKeyView:scrollView]; _private->frameScrollView = scrollView; [self _setDocumentView:documentView]; [self _install]; [oldScrollView removeFromSuperview]; [oldScrollView release]; [documentView release];}@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -