📄 webchromeclient.cpp
字号:
COMPtr<IWebUIDelegate> ui; if (FAILED(m_webView->uiDelegate(&ui))) return false; TimerBase::fireTimersInNestedEventLoop(); BSTR resultBSTR = 0; if (FAILED(ui->runJavaScriptTextInputPanelWithPrompt(m_webView, BString(message), BString(defaultValue), &resultBSTR))) return false; if (resultBSTR) { result = String(resultBSTR, SysStringLen(resultBSTR)); SysFreeString(resultBSTR); return true; } return false;}void WebChromeClient::setStatusbarText(const String& statusText){ COMPtr<IWebUIDelegate> uiDelegate; if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { uiDelegate->setStatusText(m_webView, BString(statusText)); }}bool WebChromeClient::shouldInterruptJavaScript(){ COMPtr<IWebUIDelegate> uiDelegate; if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { COMPtr<IWebUIDelegatePrivate> uiPrivate; if (SUCCEEDED(uiDelegate->QueryInterface(IID_IWebUIDelegatePrivate, (void**)&uiPrivate))) { BOOL result; if (SUCCEEDED(uiPrivate->webViewShouldInterruptJavaScript(m_webView, &result))) return !!result; } } return false;}bool WebChromeClient::tabsToLinks() const{ BOOL enabled = FALSE; IWebPreferences* preferences; if (SUCCEEDED(m_webView->preferences(&preferences))) preferences->tabsToLinks(&enabled); return !!enabled;}IntRect WebChromeClient::windowResizerRect() const{ IntRect intRect; IWebUIDelegate* ui; if (SUCCEEDED(m_webView->uiDelegate(&ui)) && ui) { IWebUIDelegatePrivate* uiPrivate; if (SUCCEEDED(ui->QueryInterface(IID_IWebUIDelegatePrivate, (void**)&uiPrivate))) { RECT r; if (SUCCEEDED(uiPrivate->webViewResizerRect(m_webView, &r))) intRect = IntRect(r.left, r.top, r.right-r.left, r.bottom-r.top); uiPrivate->Release(); } ui->Release(); } return intRect;}void WebChromeClient::repaint(const IntRect& windowRect, bool contentChanged, bool immediate, bool repaintContentOnly){ ASSERT(core(m_webView->topLevelFrame())); m_webView->repaint(windowRect, contentChanged, immediate, repaintContentOnly);}void WebChromeClient::scroll(const IntSize& delta, const IntRect& scrollViewRect, const IntRect& clipRect){ ASSERT(core(m_webView->topLevelFrame())); m_webView->scrollBackingStore(core(m_webView->topLevelFrame())->view(), delta.width(), delta.height(), scrollViewRect, clipRect);}IntRect WebChromeClient::windowToScreen(const IntRect& rect) const{ HWND viewWindow; if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) return rect; // Find the top left corner of the Widget's containing window in screen coords, // and adjust the result rect's position by this amount. POINT topLeft = {0, 0}; IntRect result = rect; ::ClientToScreen(viewWindow, &topLeft); result.move(topLeft.x, topLeft.y); return result;}IntPoint WebChromeClient::screenToWindow(const IntPoint& point) const{ POINT result = point; HWND viewWindow; if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) return point; ::ScreenToClient(viewWindow, &result); return result;}PlatformWidget WebChromeClient::platformWindow() const{ HWND viewWindow; if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) return 0; return viewWindow;}void WebChromeClient::contentsSizeChanged(Frame*, const IntSize&) const{ notImplemented();}void WebChromeClient::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags){ COMPtr<IWebUIDelegate> uiDelegate; if (FAILED(m_webView->uiDelegate(&uiDelegate))) return; COMPtr<WebElementPropertyBag> element; element.adoptRef(WebElementPropertyBag::createInstance(result)); uiDelegate->mouseDidMoveOverElement(m_webView, element.get(), modifierFlags);}void WebChromeClient::setToolTip(const String& toolTip){ m_webView->setToolTip(toolTip);}void WebChromeClient::print(Frame* frame){ COMPtr<IWebUIDelegate> uiDelegate; COMPtr<IWebUIDelegate2> uiDelegate2; if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) if (SUCCEEDED(uiDelegate->QueryInterface(IID_IWebUIDelegate2, (void**)&uiDelegate2))) uiDelegate2->printFrame(m_webView, kit(frame));}void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseIdentifier){ COMPtr<WebSecurityOrigin> origin(AdoptCOM, WebSecurityOrigin::createInstance(frame->document()->securityOrigin())); COMPtr<IWebUIDelegate> uiDelegate; if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { COMPtr<IWebUIDelegatePrivate3> uiDelegatePrivate3(Query, uiDelegate); if (uiDelegatePrivate3) uiDelegatePrivate3->exceededDatabaseQuota(m_webView, kit(frame), origin.get(), BString(databaseIdentifier)); else { // FIXME: remove this workaround once shipping Safari has the necessary delegate implemented. TCHAR path[MAX_PATH]; HMODULE safariHandle = GetModuleHandle(TEXT("Safari.exe")); if (!safariHandle) return; GetModuleFileName(safariHandle, path, ARRAYSIZE(path)); DWORD handle; DWORD versionSize = GetFileVersionInfoSize(path, &handle); if (!versionSize) return; Vector<char> data(versionSize); if (!GetFileVersionInfo(path, 0, versionSize, data.data())) return; LPCTSTR productVersion; UINT productVersionLength; if (!VerQueryValue(data.data(), TEXT("\\StringFileInfo\\040904b0\\ProductVersion"), (void**)&productVersion, &productVersionLength)) return; if (_tcsncmp(TEXT("3.1"), productVersion, productVersionLength) > 0) { const unsigned long long defaultQuota = 5 * 1024 * 1024; // 5 megabytes should hopefully be enough to test storage support. origin->setQuota(defaultQuota); } } }}void WebChromeClient::populateVisitedLinks(){ WebHistory* history = WebHistory::sharedHistory(); if (!history) return; history->addVisitedLinksToPageGroup(m_webView->page()->group());}bool WebChromeClient::paintCustomScrollbar(GraphicsContext* context, const FloatRect& rect, ScrollbarControlSize size, ScrollbarControlState state, ScrollbarPart pressedPart, bool vertical, float value, float proportion, ScrollbarControlPartMask parts){ if (context->paintingDisabled()) return false; COMPtr<IWebUIDelegate4> delegate = uiDelegate4(); if (!delegate) return false; WebScrollbarControlPartMask webParts = WebNoScrollPart; if (parts & BackButtonStartPart) // FIXME: Hyatt, what about BackButtonEndPart? webParts |= WebBackButtonPart; if (parts & BackTrackPart) webParts |= WebBackTrackPart; if (parts & ThumbPart) webParts |= WebThumbPart; if (parts & ForwardTrackPart) webParts |= WebForwardTrackPart; if (parts & ForwardButtonStartPart) // FIXME: Hyatt, what about ForwardButtonEndPart? webParts |= WebForwardButtonPart; WebScrollbarControlPart webPressedPart = WebNoScrollPart; switch (pressedPart) { case BackButtonStartPart: // FIXME: Hyatt, what about BackButtonEndPart? webPressedPart = WebBackButtonPart; break; case BackTrackPart: webPressedPart = WebBackTrackPart; break; case ThumbPart: webPressedPart = WebThumbPart; break; case ForwardTrackPart: webPressedPart = WebForwardTrackPart; break; case ForwardButtonStartPart: // FIXME: Hyatt, what about ForwardButtonEndPart? webPressedPart = WebForwardButtonPart; break; default: break; } WebScrollBarControlSize webSize; switch (size) { case SmallScrollbar: webSize = WebSmallScrollbar; break; case RegularScrollbar: default: webSize = WebRegularScrollbar; } WebScrollbarControlState webState = 0; if (state & ActiveScrollbarState) webState |= WebActiveScrollbarState; if (state & EnabledScrollbarState) webState |= WebEnabledScrollbarState; if (state & PressedScrollbarState) webState |= WebPressedScrollbarState; RECT webRect = enclosingIntRect(rect); HDC hDC = context->getWindowsContext(webRect); HRESULT hr = delegate->paintCustomScrollbar(m_webView, hDC, webRect, webSize, webState, webPressedPart, vertical, value, proportion, webParts); context->releaseWindowsContext(hDC, webRect); return SUCCEEDED(hr);}bool WebChromeClient::paintCustomScrollCorner(GraphicsContext* context, const FloatRect& rect){ if (context->paintingDisabled()) return false; COMPtr<IWebUIDelegate4> delegate = uiDelegate4(); if (!delegate) return false; RECT webRect = enclosingIntRect(rect); HDC hDC = context->getWindowsContext(webRect); HRESULT hr = delegate->paintCustomScrollCorner(m_webView, hDC, webRect); context->releaseWindowsContext(hDC, webRect); return SUCCEEDED(hr);}void WebChromeClient::runOpenPanel(Frame*, PassRefPtr<FileChooser> prpFileChooser){ RefPtr<FileChooser> fileChooser = prpFileChooser; HWND viewWindow; if (FAILED(m_webView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) return; bool multiFile = fileChooser->allowsMultipleFiles(); Vector<TCHAR> fileBuf(multiFile ? maxFilePathsListSize : MAX_PATH); OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn)); // Need to zero out the first char of fileBuf so GetOpenFileName doesn't think it's an initialization string fileBuf[0] = '\0'; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = viewWindow; String allFiles = allFilesText(); allFiles.append(TEXT("\0*.*\0\0"), 6); ofn.lpstrFilter = allFiles.charactersWithNullTermination(); ofn.lpstrFile = fileBuf.data(); ofn.nMaxFile = fileBuf.size(); String dialogTitle = uploadFileText(); ofn.lpstrTitle = dialogTitle.charactersWithNullTermination(); ofn.Flags = OFN_ENABLESIZING | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER; if (multiFile) ofn.Flags = ofn.Flags | OFN_ALLOWMULTISELECT; if (GetOpenFileName(&ofn)) { TCHAR* files = fileBuf.data(); Vector<String> fileList; String file(files); if (multiFile) { while (!file.isEmpty()) { // When using the OFN_EXPLORER flag, the file list is null delimited. // When you create a String from a ptr to this list, it will use strlen to look for the null character. // Then we find the next file path string by using the length of the string we just created. TCHAR* nextFilePtr = files + file.length() + 1; String nextFile(nextFilePtr); // If multiple files are selected, there will be a directory name first, which we don't want to add to the vector. // We know a single file was selected if there is only one filename in the list. // In that case, we don't want to skip adding the first (and only) name. if (files != fileBuf.data() || nextFile.isEmpty()) fileList.append(file); files = nextFilePtr; file = nextFile; } } else fileList.append(file); ASSERT(fileList.size()); fileChooser->chooseFiles(fileList); } // FIXME: Show some sort of error if too many files are selected and the buffer is too small. For now, this will fail silently.}COMPtr<IWebUIDelegate> WebChromeClient::uiDelegate(){ COMPtr<IWebUIDelegate> delegate; m_webView->uiDelegate(&delegate); return delegate;}COMPtr<IWebUIDelegate2> WebChromeClient::uiDelegate2(){ return COMPtr<IWebUIDelegate2>(Query, uiDelegate());}COMPtr<IWebUIDelegate3> WebChromeClient::uiDelegate3(){ return COMPtr<IWebUIDelegate3>(Query, uiDelegate());}COMPtr<IWebUIDelegate4> WebChromeClient::uiDelegate4(){ return COMPtr<IWebUIDelegate4>(Query, uiDelegate());}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -