browser(webkit): do not activate headless window on browser start (#900)

This commit is contained in:
Pavel Feldman 2020-02-07 16:05:04 -08:00 коммит произвёл GitHub
Родитель 36344dee27
Коммит e2710dec29
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 190 добавлений и 40 удалений

Просмотреть файл

@ -1 +1 @@
1139
1140

Просмотреть файл

@ -11951,60 +11951,133 @@ index d996feb64e02d7399f2ed0b34d3d0dd03133f824..4ab1fa69437ed5a11a5357a331cb7e1c
CommandLineOptions()
#if ENABLE(WEBKIT)
diff --git a/Tools/MiniBrowser/win/MainWindow.cpp b/Tools/MiniBrowser/win/MainWindow.cpp
index 82d28bbd4282c2b6b3d1441e822b4fa41e699e78..9fef117e2bc39ade8df4d0bba3b1f10483b37e51 100644
index 82d28bbd4282c2b6b3d1441e822b4fa41e699e78..180c0d7f9eaed1e48951c660cb3c6a184f7a6ef3 100644
--- a/Tools/MiniBrowser/win/MainWindow.cpp
+++ b/Tools/MiniBrowser/win/MainWindow.cpp
@@ -91,7 +91,9 @@ void MainWindow::registerClass(HINSTANCE hInstance)
@@ -91,7 +91,10 @@ void MainWindow::registerClass(HINSTANCE hInstance)
RegisterClassEx(&wcex);
}
-MainWindow::MainWindow()
+MainWindow::MainWindow(WKContextRef context, WKWebsiteDataStoreRef dataStore)
+MainWindow::MainWindow(WKContextRef context, WKWebsiteDataStoreRef dataStore, bool headless)
+ : m_context(context)
+ , m_dataStore(dataStore)
+ , m_headless(headless)
{
s_numInstances++;
}
@@ -101,9 +103,9 @@ MainWindow::~MainWindow()
@@ -101,9 +104,9 @@ MainWindow::~MainWindow()
s_numInstances--;
}
-Ref<MainWindow> MainWindow::create()
+Ref<MainWindow> MainWindow::create(WKContextRef context, WKWebsiteDataStoreRef dataStore)
+Ref<MainWindow> MainWindow::create(WKContextRef context, WKWebsiteDataStoreRef dataStore, bool headless)
{
- return adoptRef(*new MainWindow());
+ return adoptRef(*new MainWindow(context, dataStore));
+ return adoptRef(*new MainWindow(context, dataStore, headless));
}
bool MainWindow::init(BrowserWindowFactory factory, HINSTANCE hInstance, bool usesLayeredWebView)
@@ -134,7 +136,7 @@ bool MainWindow::init(BrowserWindowFactory factory, HINSTANCE hInstance, bool us
DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(m_hURLBarWnd, GWLP_WNDPROC));
SetWindowLongPtr(m_hURLBarWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(EditProc));
@@ -112,29 +115,31 @@ bool MainWindow::init(BrowserWindowFactory factory, HINSTANCE hInstance, bool us
auto title = loadString(IDS_APP_TITLE);
- m_hMainWnd = CreateWindow(s_windowClass.c_str(), title.c_str(), WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, this);
+ m_hMainWnd = CreateWindowExW(m_headless ? WS_EX_NOACTIVATE : 0, s_windowClass.c_str(), title.c_str(),
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, this);
if (!m_hMainWnd)
return false;
+ if (!m_headless) {
#if !ENABLE(WEBKIT)
- EnableMenuItem(GetMenu(m_hMainWnd), IDM_NEW_WEBKIT_WINDOW, MF_GRAYED);
+ EnableMenuItem(GetMenu(m_hMainWnd), IDM_NEW_WEBKIT_WINDOW, MF_GRAYED);
#endif
#if !ENABLE(WEBKIT_LEGACY)
- EnableMenuItem(GetMenu(m_hMainWnd), IDM_NEW_WEBKITLEGACY_WINDOW, MF_GRAYED);
+ EnableMenuItem(GetMenu(m_hMainWnd), IDM_NEW_WEBKITLEGACY_WINDOW, MF_GRAYED);
#endif
- m_hBackButtonWnd = CreateWindow(L"BUTTON", L"<", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, m_hMainWnd, reinterpret_cast<HMENU>(IDM_HISTORY_BACKWARD), hInstance, 0);
- m_hForwardButtonWnd = CreateWindow(L"BUTTON", L">", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, m_hMainWnd, reinterpret_cast<HMENU>(IDM_HISTORY_FORWARD), hInstance, 0);
- m_hReloadButtonWnd = CreateWindow(L"BUTTON", L"↺", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, m_hMainWnd, reinterpret_cast<HMENU>(IDM_RELOAD), hInstance, 0);
- m_hURLBarWnd = CreateWindow(L"EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 0, 0, 0, 0, m_hMainWnd, 0, hInstance, 0);
- m_hProgressIndicator = CreateWindow(L"STATIC", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER | SS_CENTERIMAGE, 0, 0, 0, 0, m_hMainWnd, 0, hInstance, 0);
+ m_hBackButtonWnd = CreateWindow(L"BUTTON", L"<", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, m_hMainWnd, reinterpret_cast<HMENU>(IDM_HISTORY_BACKWARD), hInstance, 0);
+ m_hForwardButtonWnd = CreateWindow(L"BUTTON", L">", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, m_hMainWnd, reinterpret_cast<HMENU>(IDM_HISTORY_FORWARD), hInstance, 0);
+ m_hReloadButtonWnd = CreateWindow(L"BUTTON", L"↺", WS_CHILD | WS_VISIBLE | BS_TEXT, 0, 0, 0, 0, m_hMainWnd, reinterpret_cast<HMENU>(IDM_RELOAD), hInstance, 0);
+ m_hURLBarWnd = CreateWindow(L"EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOVSCROLL, 0, 0, 0, 0, m_hMainWnd, 0, hInstance, 0);
+ m_hProgressIndicator = CreateWindow(L"STATIC", 0, WS_CHILD | WS_VISIBLE | WS_BORDER | SS_CENTER | SS_CENTERIMAGE, 0, 0, 0, 0, m_hMainWnd, 0, hInstance, 0);
- DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(m_hURLBarWnd, GWLP_WNDPROC));
- SetWindowLongPtr(m_hURLBarWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(EditProc));
+ DefEditProc = reinterpret_cast<WNDPROC>(GetWindowLongPtr(m_hURLBarWnd, GWLP_WNDPROC));
+ SetWindowLongPtr(m_hURLBarWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(EditProc));
+ }
- m_browserWindow = factory(*this, m_hMainWnd, usesLayeredWebView);
+ m_browserWindow = factory(*this, m_hMainWnd, m_context.get(), m_dataStore.get(), usesLayeredWebView);
if (!m_browserWindow)
return false;
HRESULT hr = m_browserWindow->init();
@@ -196,7 +198,7 @@ LRESULT CALLBACK MainWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
@@ -143,7 +148,13 @@ bool MainWindow::init(BrowserWindowFactory factory, HINSTANCE hInstance, bool us
updateDeviceScaleFactor();
resizeSubViews();
- SetFocus(m_hURLBarWnd);
+
+ if (m_headless) {
+ SetMenu(m_hMainWnd, NULL);
+ } else {
+ SetFocus(m_hURLBarWnd);
+ ShowWindow(m_hMainWnd, SW_SHOW);
+ }
return true;
}
@@ -157,12 +168,13 @@ void MainWindow::resizeSubViews()
int height = scaleFactor * urlBarHeight;
int width = scaleFactor * controlButtonWidth;
- MoveWindow(m_hBackButtonWnd, 0, 0, width, height, TRUE);
- MoveWindow(m_hForwardButtonWnd, width, 0, width, height, TRUE);
- MoveWindow(m_hReloadButtonWnd, width * 2, 0, width, height, TRUE);
- MoveWindow(m_hURLBarWnd, width * 3, 0, rcClient.right - width * 5, height, TRUE);
- MoveWindow(m_hProgressIndicator, rcClient.right - width * 2, 0, width * 2, height, TRUE);
-
+ if (!m_headless) {
+ MoveWindow(m_hBackButtonWnd, 0, 0, width, height, TRUE);
+ MoveWindow(m_hForwardButtonWnd, width, 0, width, height, TRUE);
+ MoveWindow(m_hReloadButtonWnd, width * 2, 0, width, height, TRUE);
+ MoveWindow(m_hURLBarWnd, width * 3, 0, rcClient.right - width * 5, height, TRUE);
+ MoveWindow(m_hProgressIndicator, rcClient.right - width * 2, 0, width * 2, height, TRUE);
+ }
if (m_browserWindow->usesLayeredWebView() || !m_browserWindow->hwnd())
return;
MoveWindow(m_browserWindow->hwnd(), 0, height, rcClient.right, rcClient.bottom - height, TRUE);
@@ -196,17 +208,15 @@ LRESULT CALLBACK MainWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
break;
#if ENABLE(WEBKIT)
case IDM_NEW_WEBKIT_WINDOW: {
- auto& newWindow = MainWindow::create().leakRef();
+ auto& newWindow = MainWindow::create(thisWindow->m_context.get(), thisWindow->m_dataStore.get()).leakRef();
+ auto& newWindow = MainWindow::create(thisWindow->m_context.get(), thisWindow->m_dataStore.get(), false).leakRef();
newWindow.init(WebKitBrowserWindow::create, hInst);
ShowWindow(newWindow.hwnd(), SW_SHOW);
- ShowWindow(newWindow.hwnd(), SW_SHOW);
break;
@@ -204,7 +206,7 @@ LRESULT CALLBACK MainWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
}
#endif
#if ENABLE(WEBKIT_LEGACY)
case IDM_NEW_WEBKITLEGACY_WINDOW: {
- auto& newWindow = MainWindow::create().leakRef();
+ auto& newWindow = MainWindow::create(thisWindow->m_context.get(), thisWindow->m_dataStore.get()).leakRef();
+ auto& newWindow = MainWindow::create(thisWindow->m_context.get(), thisWindow->m_dataStore.get(), false).leakRef();
newWindow.init(WebKitLegacyBrowserWindow::create, hInst);
ShowWindow(newWindow.hwnd(), SW_SHOW);
- ShowWindow(newWindow.hwnd(), SW_SHOW);
break;
@@ -225,9 +227,6 @@ LRESULT CALLBACK MainWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
}
#endif
@@ -225,9 +235,6 @@ LRESULT CALLBACK MainWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
case IDM_WEB_INSPECTOR:
thisWindow->browserWindow()->launchInspector();
break;
@ -12014,8 +12087,92 @@ index 82d28bbd4282c2b6b3d1441e822b4fa41e699e78..9fef117e2bc39ade8df4d0bba3b1f104
case IDM_CACHES:
if (!::IsWindow(thisWindow->m_hCacheWnd)) {
thisWindow->m_hCacheWnd = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CACHES), hWnd, cachesDialogProc, reinterpret_cast<LPARAM>(thisWindow.get()));
@@ -314,6 +321,9 @@ static void turnOffOtherUserAgents(HMENU menu)
bool MainWindow::toggleMenuItem(UINT menuID)
{
+ if (m_headless)
+ return (INT_PTR)FALSE;
+
HMENU menu = ::GetMenu(hwnd());
switch (menuID) {
@@ -390,6 +400,8 @@ INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
INT_PTR CALLBACK MainWindow::cachesDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
MainWindow& thisWindow = *reinterpret_cast<MainWindow*>(GetWindowLongPtr(hDlg, DWLP_USER));
+ if (thisWindow.m_headless)
+ return (INT_PTR)FALSE;
switch (message) {
case WM_INITDIALOG:
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
@@ -420,6 +432,8 @@ INT_PTR CALLBACK MainWindow::cachesDialogProc(HWND hDlg, UINT message, WPARAM wP
INT_PTR CALLBACK MainWindow::customUserAgentDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
MainWindow& thisWindow = *reinterpret_cast<MainWindow*>(GetWindowLongPtr(hDlg, DWLP_USER));
+ if (thisWindow.m_headless)
+ return (INT_PTR)FALSE;
switch (message) {
case WM_INITDIALOG: {
MainWindow& thisWindow = *reinterpret_cast<MainWindow*>(lParam);
@@ -465,17 +479,20 @@ void MainWindow::loadURL(std::wstring url)
if (SUCCEEDED(::UrlCreateFromPath(url.c_str(), fileURL, &fileURLLength, 0)))
url = fileURL;
}
- if (url.find(L"://") == url.npos)
+ if (url.find(L"://") == url.npos && url.find(L"about:blank") == url.npos)
url = L"http://" + url;
if (FAILED(m_browserWindow->loadURL(_bstr_t(url.c_str()))))
return;
- SetFocus(m_browserWindow->hwnd());
+ if (!m_headless)
+ SetFocus(m_browserWindow->hwnd());
}
void MainWindow::onURLBarEnter()
{
+ if (m_headless)
+ return;
wchar_t strPtr[INTERNET_MAX_URL_LENGTH];
GetWindowText(m_hURLBarWnd, strPtr, INTERNET_MAX_URL_LENGTH);
strPtr[INTERNET_MAX_URL_LENGTH - 1] = 0;
@@ -484,6 +501,8 @@ void MainWindow::onURLBarEnter()
void MainWindow::updateDeviceScaleFactor()
{
+ if (m_headless)
+ return;
if (m_hURLBarFont)
::DeleteObject(m_hURLBarFont);
auto scaleFactor = WebCore::deviceScaleFactorForWindow(m_hMainWnd);
@@ -495,6 +514,8 @@ void MainWindow::updateDeviceScaleFactor()
void MainWindow::progressChanged(double progress)
{
+ if (m_headless)
+ return;
std::wostringstream text;
text << static_cast<int>(progress * 100) << L'%';
SetWindowText(m_hProgressIndicator, text.str().c_str());
@@ -502,10 +523,14 @@ void MainWindow::progressChanged(double progress)
void MainWindow::progressFinished()
{
+ if (m_headless)
+ return;
SetWindowText(m_hProgressIndicator, L"");
}
void MainWindow::activeURLChanged(std::wstring url)
{
+ if (m_headless)
+ return;
SetWindowText(m_hURLBarWnd, url.c_str());
}
diff --git a/Tools/MiniBrowser/win/MainWindow.h b/Tools/MiniBrowser/win/MainWindow.h
index fba7f670f8953563d8d0d2b8d42a636c653f9d5f..2514c7d942384af1f3114c9008af499c78051298 100644
index fba7f670f8953563d8d0d2b8d42a636c653f9d5f..660c34408eb181ddbdb8e52395b56b3d7f9ae7e5 100644
--- a/Tools/MiniBrowser/win/MainWindow.h
+++ b/Tools/MiniBrowser/win/MainWindow.h
@@ -26,6 +26,8 @@
@ -12035,7 +12192,7 @@ index fba7f670f8953563d8d0d2b8d42a636c653f9d5f..2514c7d942384af1f3114c9008af499c
+ using BrowserWindowFactory = std::function<Ref<BrowserWindow>(BrowserWindowClient&, HWND mainWnd, WKContextRef, WKWebsiteDataStoreRef, bool usesLayeredWebView)>;
- static Ref<MainWindow> create();
+ static Ref<MainWindow> create(WKContextRef context, WKWebsiteDataStoreRef dataStore);
+ static Ref<MainWindow> create(WKContextRef context, WKWebsiteDataStoreRef dataStore, bool headless);
~MainWindow();
bool init(BrowserWindowFactory, HINSTANCE hInstance, bool usesLayeredWebView = false);
@ -12044,20 +12201,21 @@ index fba7f670f8953563d8d0d2b8d42a636c653f9d5f..2514c7d942384af1f3114c9008af499c
static size_t s_numInstances;
- MainWindow();
+ MainWindow(WKContextRef context, WKWebsiteDataStoreRef dataStore);
+ MainWindow(WKContextRef context, WKWebsiteDataStoreRef dataStore, bool headless);
bool toggleMenuItem(UINT menuID);
void onURLBarEnter();
void updateDeviceScaleFactor();
@@ -72,5 +74,7 @@ private:
@@ -72,5 +74,8 @@ private:
HWND m_hProgressIndicator { nullptr };
HWND m_hCacheWnd { nullptr };
HGDIOBJ m_hURLBarFont { nullptr };
+ WKRetainPtr<WKContextRef> m_context;
+ WKRetainPtr<WKWebsiteDataStoreRef> m_dataStore;
RefPtr<BrowserWindow> m_browserWindow;
+ bool m_headless;
};
diff --git a/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp b/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
index 71c43e6691395b787140ca0603550aac1c8513d5..1de905c3227315d6099c19fcd25880124b220610 100644
index 71c43e6691395b787140ca0603550aac1c8513d5..289795e88d893e4b85fb663bf924e68383579d85 100644
--- a/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
+++ b/Tools/MiniBrowser/win/WebKitBrowserWindow.cpp
@@ -39,6 +39,8 @@
@ -12167,16 +12325,14 @@ index 71c43e6691395b787140ca0603550aac1c8513d5..1de905c3227315d6099c19fcd2588012
void WebKitBrowserWindow::setUserAgent(_bstr_t& customUAString)
{
auto page = WKViewGetPage(m_view.get());
@@ -381,21 +384,106 @@ bool WebKitBrowserWindow::canTrustServerCertificate(WKProtectionSpaceRef protect
@@ -381,21 +384,102 @@ bool WebKitBrowserWindow::canTrustServerCertificate(WKProtectionSpaceRef protect
return false;
}
-WKPageRef WebKitBrowserWindow::createNewPage(WKPageRef page, WKPageConfigurationRef configuration, WKNavigationActionRef navigationAction, WKWindowFeaturesRef windowFeatures, const void *clientInfo)
+// static
+void WebKitBrowserWindow::setHeadless(bool headless)
{
- auto& newWindow = MainWindow::create().leakRef();
- auto factory = [configuration](BrowserWindowClient& client, HWND mainWnd, bool) -> auto {
+{
+ s_headless = headless;
+}
+
@ -12248,10 +12404,12 @@ index 71c43e6691395b787140ca0603550aac1c8513d5..1de905c3227315d6099c19fcd2588012
+}
+
+WKPageRef WebKitBrowserWindow::createViewCallback(WKPageConfigurationRef configuration, bool navigate)
+{
{
- auto& newWindow = MainWindow::create().leakRef();
- auto factory = [configuration](BrowserWindowClient& client, HWND mainWnd, bool) -> auto {
+ auto context = WKPageConfigurationGetContext(configuration);
+ auto dataStore = WKPageConfigurationGetWebsiteDataStore(configuration);
+ auto& newWindow = MainWindow::create(context, dataStore).leakRef();
+ auto& newWindow = MainWindow::create(context, dataStore, s_headless).leakRef();
+ auto factory = [configuration](BrowserWindowClient& client, HWND mainWnd, WKContextRef, WKWebsiteDataStoreRef, bool) -> auto {
return adoptRef(*new WebKitBrowserWindow(client, configuration, mainWnd));
};
@ -12259,10 +12417,6 @@ index 71c43e6691395b787140ca0603550aac1c8513d5..1de905c3227315d6099c19fcd2588012
- if (!ok)
- return nullptr;
- ShowWindow(newWindow.hwnd(), SW_SHOW);
+ if (s_headless)
+ SetMenu(newWindow.hwnd(), NULL);
+ else
+ ShowWindow(newWindow.hwnd(), SW_SHOW);
+ if (navigate)
+ newWindow.browserWindow()->loadURL(_bstr_t("about:blank").GetBSTR());
+
@ -12375,7 +12529,7 @@ index f84e5cde0baaa08dab1fc77771e4a62a08a5df78..dac73d3d9db04c5d502432cea8adfa89
void navigateToHistory(UINT menuID);
bool seedInitialDefaultPreferences();
diff --git a/Tools/MiniBrowser/win/WinMain.cpp b/Tools/MiniBrowser/win/WinMain.cpp
index b1d17e88de61a6f196830f62604e4174564506bd..6a939ce02295ab6fa24c620f2c5b4f1f5165f666 100644
index b1d17e88de61a6f196830f62604e4174564506bd..0cc40ce5a5f0a3331275fcdaf7ea95cd0dc5031f 100644
--- a/Tools/MiniBrowser/win/WinMain.cpp
+++ b/Tools/MiniBrowser/win/WinMain.cpp
@@ -32,6 +32,9 @@
@ -12433,7 +12587,7 @@ index b1d17e88de61a6f196830f62604e4174564506bd..6a939ce02295ab6fa24c620f2c5b4f1f
if (options.useFullDesktop)
computeFullDesktopFrame();
@@ -86,19 +115,40 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
@@ -86,19 +115,35 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
#else
auto factory = options.windowType == BrowserWindowType::WebKit ? WebKitBrowserWindow::create : WebKitLegacyBrowserWindow::create;
#endif
@ -12456,17 +12610,13 @@ index b1d17e88de61a6f196830f62604e4174564506bd..6a939ce02295ab6fa24c620f2c5b4f1f
+ auto dataStore = adoptWK(WKWebsiteDataStoreCreateWithConfiguration(configuration.get()));
+ WKContextSetPrimaryDataStore(context.get(), dataStore.get());
+
+ auto& mainWindow = MainWindow::create(context.get(), dataStore.get()).leakRef();
+ auto& mainWindow = MainWindow::create(context.get(), dataStore.get(), options.headless).leakRef();
HRESULT hr = mainWindow.init(factory, hInst, options.usesLayeredWebView);
if (FAILED(hr))
goto exit;
- ShowWindow(mainWindow.hwnd(), nCmdShow);
+ if (options.headless)
+ SetMenu(mainWindow.hwnd(), NULL);
+ else
+ ShowWindow(mainWindow.hwnd(), nCmdShow);
-
hAccelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDC_MINIBROWSER));
if (options.requestedURL.length())