static void doMouseMove(MSG msg) { COMPtr<IWebFramePrivate> framePrivate; if (SUCCEEDED(frame->QueryInterface(&framePrivate))) framePrivate->layout(); dispatchMessage(&msg); if (down && draggingInfo) { POINT screenPoint = msg.pt; ::ClientToScreen(webViewWindow, &screenPoint); IWebView* webView; COMPtr<IDropTarget> webViewDropTarget; if (SUCCEEDED(frame->webView(&webView)) && SUCCEEDED(webView->QueryInterface(IID_IDropTarget, (void**)&webViewDropTarget))) { DWORD effect = 0; if (didDragEnter) webViewDropTarget->DragOver(MK_LBUTTON, pointl(screenPoint), &effect); else { webViewDropTarget->DragEnter(draggingInfo->dataObject(), 0, pointl(screenPoint), &effect); didDragEnter = true; } draggingInfo->dropSource()->GiveFeedback(effect); } } }
Page* WebChromeClient::createWindow(Frame*, const FrameLoadRequest& frameLoadRequest, const WindowFeatures& features) { if (features.dialog) { COMPtr<IWebUIDelegate> delegate = uiDelegate(); if (!delegate) return 0; COMPtr<IWebMutableURLRequest> request(AdoptCOM, WebMutableURLRequest::createInstance(frameLoadRequest.resourceRequest())); COMPtr<IWebView> dialog; if (FAILED(delegate->createModalDialog(m_webView, request.get(), &dialog))) return 0; return core(dialog.get()); } Page* page = 0; IWebUIDelegate* uiDelegate = 0; IWebMutableURLRequest* request = WebMutableURLRequest::createInstance(frameLoadRequest.resourceRequest()); if (SUCCEEDED(m_webView->uiDelegate(&uiDelegate))) { IWebView* webView = 0; if (SUCCEEDED(uiDelegate->createWebViewWithRequest(m_webView, request, &webView))) { page = core(webView); webView->Release(); } uiDelegate->Release(); } request->Release(); return page; }
HRESULT MiniBrowserWebHost::updateAddressBar(IWebView& webView) { IWebFramePtr mainFrame; HRESULT hr = webView.mainFrame(&mainFrame.GetInterfacePtr()); if (FAILED(hr)) return hr; IWebDataSourcePtr dataSource; hr = mainFrame->dataSource(&dataSource.GetInterfacePtr()); if (FAILED(hr) || !dataSource) hr = mainFrame->provisionalDataSource(&dataSource.GetInterfacePtr()); if (FAILED(hr) || !dataSource) return hr; IWebMutableURLRequestPtr request; hr = dataSource->request(&request.GetInterfacePtr()); if (FAILED(hr) || !request) return hr; _bstr_t frameURL; hr = request->mainDocumentURL(frameURL.GetAddress()); if (FAILED(hr)) return hr; if (frameURL.length()) { m_client->pageLoadTestClient().setPageURL(frameURL); m_client->pageLoadTestClient().didCommitLoad(); } loadURL(frameURL); return S_OK; }
HRESULT WinLauncherWebHost::updateAddressBar(IWebView& webView) { IWebFramePtr mainFrame; HRESULT hr = webView.mainFrame(&mainFrame.GetInterfacePtr()); if (FAILED(hr)) return 0; IWebDataSourcePtr dataSource; hr = mainFrame->dataSource(&dataSource.GetInterfacePtr()); if (FAILED(hr) || !dataSource) hr = mainFrame->provisionalDataSource(&dataSource.GetInterfacePtr()); if (FAILED(hr) || !dataSource) return 0; IWebMutableURLRequestPtr request; hr = dataSource->request(&request.GetInterfacePtr()); if (FAILED(hr) || !request) return 0; _bstr_t frameURL; hr = request->mainDocumentURL(frameURL.GetAddress()); if (FAILED(hr)) return 0; ::SendMessage(m_hURLBarWnd, static_cast<UINT>(WM_SETTEXT), 0, reinterpret_cast<LPARAM>(frameURL.GetBSTR())); return 0; }
void WinLauncher::showLastVisitedSites(IWebView& webView) { HMENU menu = ::GetMenu(m_hMainWnd); _com_ptr_t<_com_IIID<IWebBackForwardList, &__uuidof(IWebBackForwardList)>> backForwardList; HRESULT hr = webView.backForwardList(&backForwardList.GetInterfacePtr()); if (FAILED(hr)) return; int capacity = 0; hr = backForwardList->capacity(&capacity); if (FAILED(hr)) return; int backCount = 0; hr = backForwardList->backListCount(&backCount); if (FAILED(hr)) return; UINT backSetting = MF_BYCOMMAND | (backCount) ? MF_ENABLED : MF_DISABLED; ::EnableMenuItem(menu, IDM_HISTORY_BACKWARD, backSetting); int forwardCount = 0; hr = backForwardList->forwardListCount(&forwardCount); if (FAILED(hr)) return; UINT forwardSetting = MF_BYCOMMAND | (forwardCount) ? MF_ENABLED : MF_DISABLED; ::EnableMenuItem(menu, IDM_HISTORY_FORWARD, forwardSetting); IWebHistoryItemPtr currentItem; hr = backForwardList->currentItem(¤tItem.GetInterfacePtr()); if (FAILED(hr)) return; hr = m_webHistory->addItems(1, ¤tItem.GetInterfacePtr()); if (FAILED(hr)) return; _com_ptr_t<_com_IIID<IWebHistoryPrivate, &__uuidof(IWebHistoryPrivate)>> webHistory; hr = m_webHistory->QueryInterface(IID_IWebHistoryPrivate, reinterpret_cast<void**>(&webHistory.GetInterfacePtr())); if (FAILED(hr)) return; int totalListCount = 0; hr = webHistory->allItems(&totalListCount, 0); if (FAILED(hr)) return; m_historyItems.resize(totalListCount); std::vector<IWebHistoryItem*> historyToLoad(totalListCount); hr = webHistory->allItems(&totalListCount, historyToLoad.data()); if (FAILED(hr)) return; size_t i = 0; for (auto& cur : historyToLoad) { m_historyItems[i].Attach(cur); ++i; } int allItemsOffset = 0; if (totalListCount > maxHistorySize) allItemsOffset = totalListCount - maxHistorySize; int currentHistoryItem = 0; for (int i = 0; i < totalListCount; ++i) { updateMenuItemForHistoryItem(menu, *(m_historyItems[allItemsOffset + currentHistoryItem]), currentHistoryItem); ++currentHistoryItem; } // Hide any history we aren't using yet. for (int i = currentHistoryItem; i < maxHistorySize; ++i) ::EnableMenuItem(menu, IDM_HISTORY_LINK0 + i, MF_BYCOMMAND | MF_DISABLED); }
IWebView* createWebViewAndOffscreenWindow(HWND* webViewWindow) { unsigned maxViewWidth = LayoutTestController::maxViewWidth; unsigned maxViewHeight = LayoutTestController::maxViewHeight; HWND hostWindow = CreateWindowEx(WS_EX_TOOLWINDOW, kDumpRenderTreeClassName, TEXT("DumpRenderTree"), WS_POPUP, -maxViewWidth, -maxViewHeight, maxViewWidth, maxViewHeight, 0, 0, GetModuleHandle(0), 0); IWebView* webView; HRESULT hr = WebKitCreateInstance(CLSID_WebView, 0, IID_IWebView, (void**)&webView); if (FAILED(hr)) { fprintf(stderr, "Failed to create CLSID_WebView instance, error 0x%x\n", hr); return 0; } if (FAILED(webView->setHostWindow((OLE_HANDLE)(ULONG64)hostWindow))) return 0; RECT clientRect; clientRect.bottom = clientRect.left = clientRect.top = clientRect.right = 0; BSTR groupName = SysAllocString(L"org.webkit.DumpRenderTree"); bool failed = FAILED(webView->initWithFrame(clientRect, 0, groupName)); SysFreeString(groupName); if (failed) return 0; COMPtr<IWebViewPrivate> viewPrivate; if (FAILED(webView->QueryInterface(&viewPrivate))) return 0; viewPrivate->setShouldApplyMacFontAscentHack(TRUE); viewPrivate->setAlwaysUsesComplexTextCodePath(forceComplexText); BSTR pluginPath = SysAllocStringLen(0, exePath().length() + _tcslen(TestPluginDir)); _tcscpy(pluginPath, exePath().c_str()); _tcscat(pluginPath, TestPluginDir); failed = FAILED(viewPrivate->addAdditionalPluginDirectory(pluginPath)); SysFreeString(pluginPath); if (failed) return 0; HWND viewWindow; if (FAILED(viewPrivate->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)))) return 0; if (webViewWindow) *webViewWindow = viewWindow; SetWindowPos(viewWindow, 0, 0, 0, maxViewWidth, maxViewHeight, 0); ShowWindow(hostWindow, SW_SHOW); if (FAILED(webView->setFrameLoadDelegate(sharedFrameLoadDelegate.get()))) return 0; if (FAILED(viewPrivate->setFrameLoadDelegatePrivate(sharedFrameLoadDelegate.get()))) return 0; if (FAILED(webView->setUIDelegate(sharedUIDelegate.get()))) return 0; COMPtr<IWebViewEditing> viewEditing; if (FAILED(webView->QueryInterface(&viewEditing))) return 0; if (FAILED(viewEditing->setEditingDelegate(sharedEditingDelegate.get()))) return 0; if (FAILED(webView->setResourceLoadDelegate(sharedResourceLoadDelegate.get()))) return 0; openWindows().append(hostWindow); windowToWebViewMap().set(hostWindow, webView); return webView; }
static LRESULT CALLBACK UserWindowWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { Win32UserWindow* window = Win32UserWindow::FromWindow(hWnd); if (!window) return DefWindowProc(hWnd, message, wParam, lParam); LRESULT handled = 0; if (window->HasTransparentBackground()) { if (message == WM_ERASEBKGND) { handled = 1; } else if (message == WM_TIMER && wParam == window->GetTimer()) { window->UpdateBitmap(); handled = 1; } else { IWebView* webView = window->GetWebView(); if (webView) { handled = webView->forwardingWindowProc( reinterpret_cast<OLE_HANDLE>(hWnd), message, wParam, lParam); // WebKit sometimes causes WM_PAINT messages to fire. We need to ensure // we call DefWindowProc in this case, otherwise Windows will assume // that it was not handled and continue to flood us with WM_PAINT messages. if (message == WM_PAINT) { // Calling UpdateBitmap here, assures smooth resizing. window->UpdateBitmap(); handled = 0; } } } } switch (message) { case WM_CLOSE: if (!window->Close()) handled = 1; break; case WM_GETMINMAXINFO: window->GetMinMaxInfo((MINMAXINFO*) lParam); handled = 1; break; case WM_SIZE: window->FireEvent(Event::RESIZED); if (wParam == SIZE_MAXIMIZED) { window->FireEvent(Event::MAXIMIZED); window->ResizeSubViews(); } else if (wParam == SIZE_MINIMIZED) { window->FireEvent(Event::MINIMIZED); } else { window->ResizeSubViews(); } handled = 1; break; case WM_SETFOCUS: // The focus event will be fired by the UIDelegate window->Focus(); // Focus the WebView and not the main window. handled = 1; break; case WM_MOVE: window->FireEvent(Event::MOVED); break; case WM_SHOWWINDOW: window->FireEvent(((BOOL)wParam) ? Event::SHOWN : Event::HIDDEN); break; case WM_MENUCOMMAND: { HMENU nativeMenu = (HMENU) lParam; UINT position = (UINT) wParam; UINT itemId = GetMenuItemID(nativeMenu, position); if (itemId == WEB_INSPECTOR_MENU_ITEM_ID) { handled = 1; window->ShowInspector(false); } else { handled = Win32MenuItem::HandleClickEvent(nativeMenu, position); } } break; } if (!handled) return DefWindowProc(hWnd, message, wParam, lParam); else return handled; }