TSharedPtr<IWebBrowserWindow> FWebBrowserSingleton::CreateBrowserWindow(void* OSWindowHandle, FString InitialURL, uint32 Width, uint32 Height, bool bUseTransparency, TOptional<FString> ContentsToLoad, bool ShowErrorMessage) { #if WITH_CEF3 // Create new window TSharedPtr<FWebBrowserWindow> NewWindow(new FWebBrowserWindow(FIntPoint(Width, Height), InitialURL, ContentsToLoad, ShowErrorMessage)); // WebBrowserHandler implements browser-level callbacks. CefRefPtr<FWebBrowserHandler> NewHandler(new FWebBrowserHandler); NewWindow->SetHandler(NewHandler); // Information used when creating the native window. CefWindowHandle WindowHandle = (CefWindowHandle)OSWindowHandle; // TODO: check this is correct for all platforms CefWindowInfo WindowInfo; // Always use off screen rendering so we can integrate with our windows WindowInfo.SetAsOffScreen(WindowHandle); WindowInfo.SetTransparentPainting(bUseTransparency); // Specify CEF browser settings here. CefBrowserSettings BrowserSettings; CefString URL = *InitialURL; // Create the CEF browser window. if (CefBrowserHost::CreateBrowser(WindowInfo, NewHandler.get(), URL, BrowserSettings, NULL)) { WindowInterfaces.Add(NewWindow); return NewWindow; } #endif return NULL; }
void AddWebView(CefWindowHandle parent, RECT windowRect, char* url, Settings* settings) { CefWindowInfo windowInfo; windowInfo.SetAsChild(parent, windowRect); windowInfo.SetTransparentPainting(true); g_handler->browserSettings_.web_security_disabled = settings->getBoolean("disableSecurity", false); CefBrowser::CreateBrowser(windowInfo, static_cast<CefRefPtr<CefClient>>(g_handler), url, g_handler->browserSettings_); }
NPError NPP_SetWindowImpl(NPP instance, NPWindow* window_info) { if (instance == NULL) return NPERR_INVALID_INSTANCE_ERROR; if (window_info == NULL) return NPERR_GENERIC_ERROR; ClientPlugin* plugin = reinterpret_cast<ClientPlugin*>(instance->pdata); HWND parent_hwnd = reinterpret_cast<HWND>(window_info->window); if (plugin->hWnd == NULL) { WNDCLASS wc; HINSTANCE hInstance = GetModuleHandle(NULL); // Register the window class. wc.style = CS_OWNDC; wc.lpfnWndProc = PluginWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = L"ClientOSRPlugin"; RegisterClass(&wc); // Create the main window. plugin->hWnd = CreateWindow(L"ClientOSRPlugin", L"Client OSR Plugin", WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS, 0, 0, 0, 0, parent_hwnd, NULL, hInstance, NULL); SetWindowLongPtr(plugin->hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(plugin)); // Enable GL drawing for the window. EnableGL(plugin->hWnd, &(plugin->hDC), &(plugin->hRC)); // Create the off-screen rendering window. CefWindowInfo windowInfo; CefBrowserSettings settings; windowInfo.SetAsOffScreen(plugin->hWnd); if (g_offscreenTransparent) windowInfo.SetTransparentPainting(TRUE); CefBrowser::CreateBrowser(windowInfo, new ClientOSRHandler(plugin), "http://www.google.com", settings); } // Position the plugin window and make sure it's visible. RECT parent_rect; GetClientRect(parent_hwnd, &parent_rect); SetWindowPos(plugin->hWnd, NULL, parent_rect.left, parent_rect.top, parent_rect.right - parent_rect.left, parent_rect.bottom - parent_rect.top, SWP_SHOWWINDOW); UpdateWindow(plugin->hWnd); ShowWindow(plugin->hWnd, SW_SHOW); return NPERR_NO_ERROR; }
bool WindowlessBoltBrowser::Create( HWND hHostWnd ) { assert(hHostWnd); assert(::IsWindow(hHostWnd)); CefWindowInfo info; info.SetAsOffScreen(hHostWnd); info.SetTransparentPainting(m_transparent? TRUE : FALSE); return BaseBoltBrowser::Create(info); }
void RunTransparentPopupTest(CefRefPtr<CefBrowser> browser) { CefWindowInfo info; CefBrowserSettings settings; // Initialize window info to the defaults for a popup window info.SetAsPopup(NULL, "TransparentPopup"); info.SetTransparentPainting(TRUE); info.m_nWidth = 500; info.m_nHeight = 500; // Creat the popup browser window CefBrowser::CreateBrowser(info, static_cast<CefRefPtr<CefClient> >(g_handler), "http://tests/transparency", settings); }
CefRefPtr< CefBrowser > ClientAppCreateBrowser(std::shared_ptr<ofxCEFBrowser> ofx, std::string startResource) { // OSR Browser ======================================================= CefBrowserSettings settings; // Create the single static handler class instance HWND hWnd = WindowFromDC(wglGetCurrentDC()); CefWindowInfo info; info.width = ofx->getWidth(); info.height = ofx->getHeight(); info.SetAsOffScreen(hWnd); info.SetTransparentPainting(true); //info.SetAsChild(hWnd, rect); //info.SetAsPopup(hWnd, "hehe"); // Create the new child browser window using an offscreen window auto browser = CefBrowserHost::CreateBrowserSync(info, ofx->getClientHandler().get(), CefString(startResource), settings); return browser; }
void BrowserClient::initBrowser(const std::string& url) { //Setup our main view that will show the cef ui setupMainView( _width, _height ); _viewer->addView( _mainView ); { CefWindowInfo windowInfo; CefBrowserSettings browserSettings; // in linux set a gtk widget, in windows a hwnd. If not available set nullptr - may cause some render errors, in context-menu and plugins. windowInfo.SetAsOffScreen(0L); windowInfo.SetTransparentPainting(true); //windowInfo.SetAsWindowless(0L, true); _browser = CefBrowserHost::CreateBrowserSync(windowInfo, this, url.c_str(), browserSettings, 0L); _browser->GetHost()->SendFocusEvent(true); } addExecuteCallback(new MapExecuteCallback(this)); _mainView->addEventHandler(new BrowserEventHandler(_mainView.get(), this, _browser)); }
// // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND backWnd = NULL, forwardWnd = NULL, reloadWnd = NULL, stopWnd = NULL, editWnd = NULL; static WNDPROC editWndOldProc = NULL; // Static members used for the find dialog. static FINDREPLACE fr; static WCHAR szFindWhat[80] = {0}; static WCHAR szLastFindWhat[80] = {0}; static bool findNext = false; static bool lastMatchCase = false; int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; if (hWnd == editWnd) { // Callback for the edit window switch (message) { case WM_CHAR: if (wParam == VK_RETURN && g_handler.get()) { // When the user hits the enter key load the URL CefRefPtr<CefBrowser> browser = g_handler->GetBrowser(); wchar_t strPtr[MAX_URL_LENGTH+1] = {0}; *((LPWORD)strPtr) = MAX_URL_LENGTH; LRESULT strLen = SendMessage(hWnd, EM_GETLINE, 0, (LPARAM)strPtr); if (strLen > 0) { strPtr[strLen] = 0; browser->GetMainFrame()->LoadURL(strPtr); } return 0; } } return (LRESULT)CallWindowProc(editWndOldProc, hWnd, message, wParam, lParam); } else if (message == uFindMsg) { // Find event. LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam; if (lpfr->Flags & FR_DIALOGTERM) { // The find dialog box has been dismissed so invalidate the handle and // reset the search results. hFindDlg = NULL; if (g_handler.get()) { g_handler->GetBrowser()->GetHost()->StopFinding(true); szLastFindWhat[0] = 0; findNext = false; } return 0; } if ((lpfr->Flags & FR_FINDNEXT) && g_handler.get()) { // Search for the requested string. bool matchCase = (lpfr->Flags & FR_MATCHCASE?true:false); if (matchCase != lastMatchCase || (matchCase && wcsncmp(szFindWhat, szLastFindWhat, sizeof(szLastFindWhat)/sizeof(WCHAR)) != 0) || (!matchCase && _wcsnicmp(szFindWhat, szLastFindWhat, sizeof(szLastFindWhat)/sizeof(WCHAR)) != 0)) { // The search string has changed, so reset the search results. if (szLastFindWhat[0] != 0) { g_handler->GetBrowser()->GetHost()->StopFinding(true); findNext = false; } lastMatchCase = matchCase; wcscpy_s(szLastFindWhat, sizeof(szLastFindWhat)/sizeof(WCHAR), szFindWhat); } g_handler->GetBrowser()->GetHost()->Find(0, lpfr->lpstrFindWhat, (lpfr->Flags & FR_DOWN)?true:false, matchCase, findNext); if (!findNext) findNext = true; } return 0; } else { // Callback for the main window switch (message) { case WM_CREATE: { // Create the single static handler class instance g_handler = new ClientHandler(); g_handler->SetMainHwnd(hWnd); // Create the child windows used for navigation RECT rect; int x = 0; GetClientRect(hWnd, &rect); backWnd = CreateWindow(L"BUTTON", L"Back", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED, x, 0, BUTTON_WIDTH, URLBAR_HEIGHT, hWnd, (HMENU) IDC_NAV_BACK, hInst, 0); x += BUTTON_WIDTH; forwardWnd = CreateWindow(L"BUTTON", L"Forward", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED, x, 0, BUTTON_WIDTH, URLBAR_HEIGHT, hWnd, (HMENU) IDC_NAV_FORWARD, hInst, 0); x += BUTTON_WIDTH; reloadWnd = CreateWindow(L"BUTTON", L"Reload", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED, x, 0, BUTTON_WIDTH, URLBAR_HEIGHT, hWnd, (HMENU) IDC_NAV_RELOAD, hInst, 0); x += BUTTON_WIDTH; stopWnd = CreateWindow(L"BUTTON", L"Stop", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED, x, 0, BUTTON_WIDTH, URLBAR_HEIGHT, hWnd, (HMENU) IDC_NAV_STOP, hInst, 0); x += BUTTON_WIDTH; editWnd = CreateWindow(L"EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL | ES_AUTOHSCROLL| WS_DISABLED, x, 0, rect.right - BUTTON_WIDTH * 4, URLBAR_HEIGHT, hWnd, 0, hInst, 0); // Assign the edit window's WNDPROC to this function so that we can // capture the enter key editWndOldProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(editWnd, GWLP_WNDPROC)); SetWindowLongPtr(editWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(WndProc)); g_handler->SetEditHwnd(editWnd); g_handler->SetButtonHwnds(backWnd, forwardWnd, reloadWnd, stopWnd); rect.top += URLBAR_HEIGHT; CefWindowInfo info; CefBrowserSettings settings; if (AppIsOffScreenRenderingEnabled()) { CefRefPtr<CefCommandLine> cmd_line = AppGetCommandLine(); bool transparent = cmd_line->HasSwitch(cefclient::kTransparentPaintingEnabled); CefRefPtr<OSRWindow> osr_window = OSRWindow::Create(&g_main_browser_provider, transparent); osr_window->CreateWidget(hWnd, rect, hInst, szOSRWindowClass); info.SetAsOffScreen(osr_window->hwnd()); info.SetTransparentPainting(transparent ? TRUE : FALSE); g_handler->SetOSRHandler(osr_window.get()); } else { // Initialize window info to the defaults for a child window. info.SetAsChild(hWnd, rect); } // Creat the new child browser window CefBrowserHost::CreateBrowser(info, g_handler.get(), g_handler->GetStartupURL(), settings, NULL); return 0; } case WM_COMMAND: { CefRefPtr<CefBrowser> browser; if (g_handler.get()) browser = g_handler->GetBrowser(); wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); return 0; case IDM_EXIT: if (g_handler.get()) g_handler->CloseAllBrowsers(false); return 0; case ID_WARN_CONSOLEMESSAGE: if (g_handler.get()) { std::wstringstream ss; ss << L"Console messages will be written to " << std::wstring(CefString(g_handler->GetLogFile())); MessageBox(hWnd, ss.str().c_str(), L"Console Messages", MB_OK | MB_ICONINFORMATION); } return 0; case ID_WARN_DOWNLOADCOMPLETE: case ID_WARN_DOWNLOADERROR: if (g_handler.get()) { std::wstringstream ss; ss << L"File \"" << std::wstring(CefString(g_handler->GetLastDownloadFile())) << L"\" "; if (wmId == ID_WARN_DOWNLOADCOMPLETE) ss << L"downloaded successfully."; else ss << L"failed to download."; MessageBox(hWnd, ss.str().c_str(), L"File Download", MB_OK | MB_ICONINFORMATION); } return 0; case ID_FIND: if (!hFindDlg) { // Create the find dialog. ZeroMemory(&fr, sizeof(fr)); fr.lStructSize = sizeof(fr); fr.hwndOwner = hWnd; fr.lpstrFindWhat = szFindWhat; fr.wFindWhatLen = sizeof(szFindWhat); fr.Flags = FR_HIDEWHOLEWORD | FR_DOWN; hFindDlg = FindText(&fr); } else { // Give focus to the existing find dialog. ::SetFocus(hFindDlg); } return 0; case IDC_NAV_BACK: // Back button if (browser.get()) browser->GoBack(); return 0; case IDC_NAV_FORWARD: // Forward button if (browser.get()) browser->GoForward(); return 0; case IDC_NAV_RELOAD: // Reload button if (browser.get()) browser->Reload(); return 0; case IDC_NAV_STOP: // Stop button if (browser.get()) browser->StopLoad(); return 0; case ID_TESTS_GETSOURCE: // Test the GetSource function if (browser.get()) RunGetSourceTest(browser); return 0; case ID_TESTS_GETTEXT: // Test the GetText function if (browser.get()) RunGetTextTest(browser); return 0; case ID_TESTS_POPUP: // Test a popup window if (browser.get()) RunPopupTest(browser); return 0; case ID_TESTS_REQUEST: // Test a request if (browser.get()) RunRequestTest(browser); return 0; case ID_TESTS_PLUGIN_INFO: // Test plugin info if (browser.get()) RunPluginInfoTest(browser); return 0; case ID_TESTS_ZOOM_IN: if (browser.get()) ModifyZoom(browser, 0.5); return 0; case ID_TESTS_ZOOM_OUT: if (browser.get()) ModifyZoom(browser, -0.5); return 0; case ID_TESTS_ZOOM_RESET: if (browser.get()) browser->GetHost()->SetZoomLevel(0.0); return 0; case ID_TESTS_TRACING_BEGIN: g_handler->BeginTracing(); return 0; case ID_TESTS_TRACING_END: g_handler->EndTracing(); return 0; case ID_TESTS_PRINT: if(browser.get()) browser->GetHost()->Print(); return 0; case ID_TESTS_OTHER_TESTS: if (browser.get()) RunOtherTests(browser); return 0; } break; } case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); return 0; case WM_SETFOCUS: if (g_handler.get() && g_handler->GetBrowser()) { if (AppIsOffScreenRenderingEnabled()) { // Give focus to the OSR window. CefRefPtr<OSRWindow> osr_window = static_cast<OSRWindow*>(g_handler->GetOSRHandler().get()); if (osr_window) ::SetFocus(osr_window->hwnd()); } else { // Give focus to the browser. g_handler->GetBrowser()->GetHost()->SetFocus(true); } } return 0; case WM_SIZE: // Minimizing resizes the window to 0x0 which causes our layout to go all // screwy, so we just ignore it. if (wParam != SIZE_MINIMIZED && g_handler.get() && g_handler->GetBrowser()) { CefWindowHandle hwnd = g_handler->GetBrowser()->GetHost()->GetWindowHandle(); if (hwnd) { // Resize the browser window and address bar to match the new frame // window size RECT rect; GetClientRect(hWnd, &rect); rect.top += URLBAR_HEIGHT; int urloffset = rect.left + BUTTON_WIDTH * 4; HDWP hdwp = BeginDeferWindowPos(1); hdwp = DeferWindowPos(hdwp, editWnd, NULL, urloffset, 0, rect.right - urloffset, URLBAR_HEIGHT, SWP_NOZORDER); hdwp = DeferWindowPos(hdwp, hwnd, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); EndDeferWindowPos(hdwp); } } break; case WM_ERASEBKGND: if (g_handler.get() && g_handler->GetBrowser()) { CefWindowHandle hwnd = g_handler->GetBrowser()->GetHost()->GetWindowHandle(); if (hwnd) { // Dont erase the background if the browser window has been loaded // (this avoids flashing) return 0; } } break; case WM_ENTERMENULOOP: if (!wParam) { // Entering the menu loop for the application menu. CefSetOSModalLoop(true); } break; case WM_EXITMENULOOP: if (!wParam) { // Exiting the menu loop for the application menu. CefSetOSModalLoop(false); } break; case WM_CLOSE: if (g_handler.get() && !g_handler->IsClosing()) { CefRefPtr<CefBrowser> browser = g_handler->GetBrowser(); if (browser.get()) { // Notify the browser window that we would like to close it. This // will result in a call to ClientHandler::DoClose() if the // JavaScript 'onbeforeunload' event handler allows it. browser->GetHost()->CloseBrowser(false); // Cancel the close. return 0; } } // Allow the close. break; case WM_DESTROY: // Quitting CEF is handled in ClientHandler::OnBeforeClose(). return 0; } return DefWindowProc(hWnd, message, wParam, lParam); } }
LRESULT CALLBACK TransparentWnd::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static CefRefPtr<CefBrowser> browser = NULL; static HWND browserhWnd=NULL; static RECT rect; static TransparentWnd* handler; static int top=GetSystemMetrics(SM_CYFRAME)+GetSystemMetrics(SM_CYCAPTION)-2,left=GetSystemMetrics(SM_CXFRAME); switch (message) { case WM_INIT: { // Create the single static handler class instance handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); CefRefPtr<MyHandler> g_handler=handler->g_handler; g_handler->SetMainHwnd(hWnd); GetClientRect(hWnd, &rect); CefWindowInfo info; CefBrowserSettings settings; // Populate the settings based on command line arguments. AppGetBrowserSettings(settings); // Initialize window info to the defaults for a child window info.SetAsChild(hWnd, rect); if(handler->isTransparent){ info.m_bWindowRenderingDisabled = TRUE; info.SetTransparentPainting(TRUE); } // Creat the new child browser window CefBrowser::CreateBrowserSync(info, static_cast<CefRefPtr<CefClient> >(g_handler), handler->GetUrl(), settings); DragAcceptFiles(hWnd,TRUE); } break; case WM_NOTIFYICON: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); handler->TaskMouseHandler(lParam); } break; case WM_ACTIVATE: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); handler->FocusHandler(); } break; case WM_CLOSE: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); if(handler->g_handler->win){ handler->CloseHandler(); return 0; }; } break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); if(handler->isEnableDrag){ SetCapture(hWnd); handler->dragX=LOWORD(lParam); handler->dragY=HIWORD(lParam); handler->isDrag=true; } } break; case WM_LBUTTONUP: case WM_RBUTTONUP: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); if (GetCapture() == hWnd) ReleaseCapture(); handler->isDrag=false; } break; case WM_MOUSEMOVE: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); if(handler->isDrag){ POINT pt; GetCursorPos(&pt); handler->Move(pt.x-handler->dragX, pt.y-handler->dragY); handler->MoveHandler(handler->x,handler->y); } } break; case WM_SIZE: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); switch(wParam){ case SIZE_MINIMIZED: ShowWindow(handler->hWnd, SW_MINIMIZE); break; case SIZE_RESTORED: break; default: handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); GetWindowRect(hWnd, &rect); int m_x = rect.left; int m_y = rect.top; int m_nWidth = rect.right - rect.left; int m_nHeight = rect.bottom - rect.top; if(rect.right-rect.left>0){ handler->SetSize(m_nWidth,m_nHeight); } } if(!handler->isTransparent){ RECT rect; GetClientRect(hWnd, &rect); MoveWindow(handler->g_handler->GetBrowserHwnd(), rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, false); } } break; case WM_SIZING: { handler=(TransparentWnd*)GetWindowLong(hWnd, GWL_USERDATA); LPRECT lpRect=(LPRECT)lParam; int m_nWidth = lpRect->right-lpRect->left; int m_nHeight = lpRect->bottom-lpRect->top; handler->Move(lpRect->left,lpRect->top); handler->SetSize(m_nWidth,m_nHeight); } break; default: break; } return DefWindowProc(hWnd, message, wParam, lParam); }