⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webframeview.mm

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 MM
📖 第 1 页 / 共 3 页
字号:
    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 + -