📄 webchromeclient.mm
字号:
result = (NSString *)CallUIDelegate(m_webView, selector, prompt, defaultText, kit(frame)); return !result.isNull(); } // Call the old version of the delegate method if it is implemented. selector = @selector(webView:runJavaScriptTextInputPanelWithPrompt:defaultText:); if ([delegate respondsToSelector:selector]) { result = (NSString *)CallUIDelegate(m_webView, selector, prompt, defaultText); return !result.isNull(); } result = [[WebDefaultUIDelegate sharedUIDelegate] webView:m_webView runJavaScriptTextInputPanelWithPrompt:prompt defaultText:defaultText initiatedByFrame:kit(frame)]; return !result.isNull();}bool WebChromeClient::shouldInterruptJavaScript(){ return CallUIDelegate(m_webView, @selector(webViewShouldInterruptJavaScript:));}void WebChromeClient::setStatusbarText(const String& status){ // We want the temporaries allocated here to be released even before returning to the // event loop; see <http://bugs.webkit.org/show_bug.cgi?id=9880>. NSAutoreleasePool* localPool = [[NSAutoreleasePool alloc] init]; CallUIDelegate(m_webView, @selector(webView:setStatusText:), (NSString *)status); [localPool drain];}bool WebChromeClient::tabsToLinks() const{ return [[m_webView preferences] tabsToLinks];}IntRect WebChromeClient::windowResizerRect() const{ NSRect rect = [[m_webView window] _growBoxRect]; if ([m_webView _usesDocumentViews]) return enclosingIntRect(rect); return enclosingIntRect([m_webView convertRect:rect fromView:nil]);}void WebChromeClient::repaint(const IntRect& rect, bool contentChanged, bool immediate, bool repaintContentOnly){ if ([m_webView _usesDocumentViews]) return; if (contentChanged) [m_webView setNeedsDisplayInRect:rect]; if (immediate) { [[m_webView window] displayIfNeeded]; [[m_webView window] flushWindowIfNeeded]; }}void WebChromeClient::scroll(const IntSize&, const IntRect&, const IntRect&){}IntPoint WebChromeClient::screenToWindow(const IntPoint& p) const{ if ([m_webView _usesDocumentViews]) return p; NSPoint windowCoord = [[m_webView window] convertScreenToBase:p]; return IntPoint([m_webView convertPoint:windowCoord fromView:nil]);}IntRect WebChromeClient::windowToScreen(const IntRect& r) const{ if ([m_webView _usesDocumentViews]) return r; NSRect tempRect = r; tempRect = [m_webView convertRect:tempRect toView:nil]; tempRect.origin = [[m_webView window] convertBaseToScreen:tempRect.origin]; return enclosingIntRect(tempRect);}PlatformWidget WebChromeClient::platformWindow() const{ if ([m_webView _usesDocumentViews]) return 0; return m_webView;}void WebChromeClient::contentsSizeChanged(Frame*, const IntSize&) const{}void WebChromeClient::scrollRectIntoView(const IntRect& r, const ScrollView* scrollView) const{ // FIXME: This scrolling behavior should be under the control of the embedding client (rather than something // we just do ourselves). // We have to convert back to document view coordinates in order to let the flipping conversion take place. It just // doesn't make sense for the scrollRectIntoView API to take document view coordinates. IntRect scrollRect = r; scrollRect.move(scrollView->scrollOffset()); NSRect rect = scrollRect; for (NSView *view = [[[m_webView mainFrame] frameView] documentView]; view; view = [view superview]) { if ([view isKindOfClass:[NSClipView class]]) { NSClipView *clipView = (NSClipView *)view; NSView *documentView = [clipView documentView]; [documentView scrollRectToVisible:[documentView convertRect:rect fromView:[[[m_webView mainFrame] frameView] documentView]]]; } }}// End host window methods.void WebChromeClient::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags){ WebElementDictionary *element = [[WebElementDictionary alloc] initWithHitTestResult:result]; [m_webView _mouseDidMoveOverElement:element modifierFlags:modifierFlags]; [element release];}void WebChromeClient::setToolTip(const String& toolTip){ [(WebHTMLView *)[[[m_webView mainFrame] frameView] documentView] _setToolTip:toolTip];}void WebChromeClient::print(Frame* frame){ WebFrameView* frameView = [kit(frame) frameView]; CallUIDelegate(m_webView, @selector(webView:printFrameView:), frameView);}void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseName){ BEGIN_BLOCK_OBJC_EXCEPTIONS; WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:frame->document()->securityOrigin()]; // FIXME: remove this workaround once shipping Safari has the necessary delegate implemented. if (WKAppVersionCheckLessThan(@"com.apple.Safari", -1, 3.1)) { const unsigned long long defaultQuota = 5 * 1024 * 1024; // 5 megabytes should hopefully be enough to test storage support. [webOrigin setQuota:defaultQuota]; } else CallUIDelegate(m_webView, @selector(webView:frame:exceededDatabaseQuotaForSecurityOrigin:database:), kit(frame), webOrigin, (NSString *)databaseName); [webOrigin release]; END_BLOCK_OBJC_EXCEPTIONS;} void WebChromeClient::populateVisitedLinks(){ BEGIN_BLOCK_OBJC_EXCEPTIONS; [[WebHistory optionalSharedHistory] _addVisitedLinksToPageGroup:[m_webView page]->group()]; END_BLOCK_OBJC_EXCEPTIONS;}#if ENABLE(DASHBOARD_SUPPORT)void WebChromeClient::dashboardRegionsChanged(){ BEGIN_BLOCK_OBJC_EXCEPTIONS; NSMutableDictionary *regions = core([m_webView mainFrame])->dashboardRegionsDictionary(); [m_webView _addScrollerDashboardRegions:regions]; CallUIDelegate(m_webView, @selector(webView:dashboardRegionsChanged:), regions); END_BLOCK_OBJC_EXCEPTIONS;}#endifFloatRect WebChromeClient::customHighlightRect(Node* node, const AtomicString& type, const FloatRect& lineRect){ BEGIN_BLOCK_OBJC_EXCEPTIONS; NSView *documentView = [[kit(node->document()->frame()) frameView] documentView]; if (![documentView isKindOfClass:[WebHTMLView class]]) return NSZeroRect; WebHTMLView *webHTMLView = (WebHTMLView *)documentView; id<WebHTMLHighlighter> highlighter = [webHTMLView _highlighterForType:type]; if ([(NSObject *)highlighter respondsToSelector:@selector(highlightRectForLine:representedNode:)]) return [highlighter highlightRectForLine:lineRect representedNode:kit(node)]; return [highlighter highlightRectForLine:lineRect]; END_BLOCK_OBJC_EXCEPTIONS; return NSZeroRect;}void WebChromeClient::paintCustomHighlight(Node* node, const AtomicString& type, const FloatRect& boxRect, const FloatRect& lineRect, bool behindText, bool entireLine){ BEGIN_BLOCK_OBJC_EXCEPTIONS; NSView *documentView = [[kit(node->document()->frame()) frameView] documentView]; if (![documentView isKindOfClass:[WebHTMLView class]]) return; WebHTMLView *webHTMLView = (WebHTMLView *)documentView; id<WebHTMLHighlighter> highlighter = [webHTMLView _highlighterForType:type]; if ([(NSObject *)highlighter respondsToSelector:@selector(paintHighlightForBox:onLine:behindText:entireLine:representedNode:)]) [highlighter paintHighlightForBox:boxRect onLine:lineRect behindText:behindText entireLine:entireLine representedNode:kit(node)]; else [highlighter paintHighlightForBox:boxRect onLine:lineRect behindText:behindText entireLine:entireLine]; END_BLOCK_OBJC_EXCEPTIONS;}void WebChromeClient::runOpenPanel(Frame*, PassRefPtr<FileChooser> chooser){ BEGIN_BLOCK_OBJC_EXCEPTIONS; BOOL allowMultipleFiles = chooser->allowsMultipleFiles(); WebOpenPanelResultListener *listener = [[WebOpenPanelResultListener alloc] initWithChooser:chooser]; id delegate = [m_webView UIDelegate]; if ([delegate respondsToSelector:@selector(webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:)]) CallUIDelegate(m_webView, @selector(webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:), listener, allowMultipleFiles); else CallUIDelegate(m_webView, @selector(webView:runOpenPanelForFileButtonWithResultListener:), listener); [listener release]; END_BLOCK_OBJC_EXCEPTIONS;}KeyboardUIMode WebChromeClient::keyboardUIMode(){ BEGIN_BLOCK_OBJC_EXCEPTIONS; return [m_webView _keyboardUIMode]; END_BLOCK_OBJC_EXCEPTIONS; return KeyboardAccessDefault;}NSResponder *WebChromeClient::firstResponder(){ BEGIN_BLOCK_OBJC_EXCEPTIONS; return [[m_webView _UIDelegateForwarder] webViewFirstResponder:m_webView]; END_BLOCK_OBJC_EXCEPTIONS; return nil;}void WebChromeClient::makeFirstResponder(NSResponder *responder){ BEGIN_BLOCK_OBJC_EXCEPTIONS; [m_webView _pushPerformingProgrammaticFocus]; [[m_webView _UIDelegateForwarder] webView:m_webView makeFirstResponder:responder]; [m_webView _popPerformingProgrammaticFocus]; END_BLOCK_OBJC_EXCEPTIONS;}void WebChromeClient::willPopUpMenu(NSMenu *menu){ BEGIN_BLOCK_OBJC_EXCEPTIONS; CallUIDelegate(m_webView, @selector(webView:willPopupMenu:), menu); END_BLOCK_OBJC_EXCEPTIONS;}bool WebChromeClient::shouldReplaceWithGeneratedFileForUpload(const String& path, String& generatedFilename){ NSString* filename; if (![[m_webView _UIDelegateForwarder] webView:m_webView shouldReplaceUploadFile:path usingGeneratedFilename:&filename]) return false; generatedFilename = filename; return true;}String WebChromeClient::generateReplacementFile(const String& path){ return [[m_webView _UIDelegateForwarder] webView:m_webView generateReplacementFile:path];}void WebChromeClient::disableSuddenTermination(){#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) [[NSProcessInfo processInfo] disableSuddenTermination];#endif}void WebChromeClient::enableSuddenTermination(){#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) [[NSProcessInfo processInfo] enableSuddenTermination];#endif}#if USE(ACCELERATED_COMPOSITING)void WebChromeClient::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* graphicsLayer){ WebFrameView *frameView = [kit(frame) frameView]; WebHTMLView *docView = (WebHTMLView *)[frameView documentView]; if (graphicsLayer) [docView attachRootLayer:graphicsLayer->nativeLayer()]; else [docView detachRootLayer];}void WebChromeClient::setNeedsOneShotDrawingSynchronization(){ [m_webView _setNeedsOneShotDrawingSynchronization:YES];}#endifbool WebChromeClient::shouldAllowGeolocationForFrame(Frame* frame){ BOOL result = NO; BEGIN_BLOCK_OBJC_EXCEPTIONS; WebSecurityOrigin *webOrigin = [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:frame->document()->securityOrigin()]; result = CallUIDelegateReturningBoolean(NO, m_webView, @selector(webView:shouldAllowLocationServicesForFrame:securityOrigin:), kit(frame), webOrigin); [webOrigin release]; END_BLOCK_OBJC_EXCEPTIONS; return result;}@implementation WebOpenPanelResultListener- (id)initWithChooser:(PassRefPtr<FileChooser>)chooser{ self = [super init]; if (!self) return nil; _chooser = chooser.releaseRef(); return self;}#ifndef NDEBUG- (void)dealloc{ ASSERT(!_chooser); [super dealloc];}- (void)finalize{ ASSERT(!_chooser); [super finalize];}#endif- (void)cancel{ ASSERT(_chooser); if (!_chooser) return; _chooser->deref(); _chooser = 0;}- (void)chooseFilename:(NSString *)filename{ ASSERT(_chooser); if (!_chooser) return; _chooser->chooseFile(filename); _chooser->deref(); _chooser = 0;}- (void)chooseFilenames:(NSArray *)filenames{ ASSERT(_chooser); if (!_chooser) return; int count = [filenames count]; Vector<String> names(count); for (int i = 0; i < count; i++) names[i] = [filenames objectAtIndex:i]; _chooser->chooseFiles(names); _chooser->deref(); _chooser = 0;}@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -