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

📄 webchromeclient.cpp

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