Diff
Modified: trunk/Source/WTF/ChangeLog (275915 => 275916)
--- trunk/Source/WTF/ChangeLog 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WTF/ChangeLog 2021-04-13 22:48:10 UTC (rev 275916)
@@ -1,5 +1,16 @@
2021-04-13 Alex Christensen <[email protected]>
+ WebProcessPool should store Vector<Ref<WebProcessProxy>> instead of Vector<RefPtr>
+ https://bugs.webkit.org/show_bug.cgi?id=224412
+
+ Reviewed by Chris Dumez.
+
+ * wtf/Ref.h:
+ (WTF::operator==):
+ (WTF::operator!=):
+
+2021-04-13 Alex Christensen <[email protected]>
+
Remove support for NPAPI plugins in WebView
https://bugs.webkit.org/show_bug.cgi?id=224449
Modified: trunk/Source/WTF/wtf/Ref.h (275915 => 275916)
--- trunk/Source/WTF/wtf/Ref.h 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WTF/wtf/Ref.h 2021-04-13 22:48:10 UTC (rev 275916)
@@ -289,6 +289,42 @@
return is<ExpectedType>(source.get());
}
+template<typename T, typename U, typename V, typename W>
+inline bool operator==(const Ref<T, U>& a, const Ref<V, W>& b)
+{
+ return a.ptr() == b.ptr();
+}
+
+template<typename T, typename U, typename V>
+inline bool operator==(const Ref<T, U>& a, V& b)
+{
+ return a.ptr() == &b;
+}
+
+template<typename T, typename U, typename V>
+inline bool operator==(T& a, const Ref<U, V>& b)
+{
+ return &a == b.ptr();
+}
+
+template<typename T, typename U, typename V, typename W>
+inline bool operator!=(const Ref<T, U>& a, const Ref<V, W>& b)
+{
+ return a.ptr() != b.ptr();
+}
+
+template<typename T, typename U, typename V>
+inline bool operator!=(const Ref<T, U>& a, V& b)
+{
+ return a.ptr() != &b;
+}
+
+template<typename T, typename U, typename V>
+inline bool operator!=(T& a, const Ref<U, V>& b)
+{
+ return &a != b.ptr();
+}
+
} // namespace WTF
using WTF::Ref;
Modified: trunk/Source/WebKit/ChangeLog (275915 => 275916)
--- trunk/Source/WebKit/ChangeLog 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WebKit/ChangeLog 2021-04-13 22:48:10 UTC (rev 275916)
@@ -1,3 +1,40 @@
+2021-04-13 Alex Christensen <[email protected]>
+
+ WebProcessPool should store Vector<Ref<WebProcessProxy>> instead of Vector<RefPtr>
+ https://bugs.webkit.org/show_bug.cgi?id=224412
+
+ Reviewed by Chris Dumez.
+
+ No change in behavior, except I also changed a raw pointer to a WeakPtr, so we should be a little safer.
+
+ * UIProcess/Cocoa/WebProcessPoolCocoa.mm:
+ (WebKit::WebProcessPool::remoteWebInspectorEnabledCallback):
+ (WebKit::WebProcessPool::registerNotificationObservers):
+ * UIProcess/Cocoa/WebProcessProxyCocoa.mm:
+ (WebKit::WebProcessProxy::cacheMediaMIMETypes):
+ * UIProcess/VisitedLinkStore.cpp:
+ (WebKit::VisitedLinkStore::removeAll):
+ (WebKit::VisitedLinkStore::sendStoreHandleToProcess):
+ (WebKit::VisitedLinkStore::didUpdateSharedStringHashes):
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::gpuProcessCrashed):
+ (WebKit::WebProcessPool::establishWorkerContextConnectionToNetworkProcess):
+ (WebKit::WebProcessPool::tryTakePrewarmedProcess):
+ (WebKit::WebProcessPool::initializeNewWebProcess):
+ (WebKit::WebProcessPool::enableProcessTermination):
+ (WebKit::WebProcessPool::shouldTerminate):
+ (WebKit::WebProcessPool::processDidFinishLaunching):
+ (WebKit::WebProcessPool::disconnectProcess):
+ (WebKit::WebProcessPool::processForRegistrableDomain):
+ (WebKit::WebProcessPool::createWebPage):
+ (WebKit::WebProcessPool::terminateAllWebContentProcesses):
+ (WebKit::webProcessProxyFromConnection):
+ * UIProcess/WebProcessPool.h:
+ (WebKit::WebProcessPool::sendToAllProcesses):
+ (WebKit::WebProcessPool::sendToAllProcessesForSession):
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::didFinishLaunching):
+
2021-04-13 Lauro Moura <[email protected]>
REGRESSION(r275262) [WebDriver] Make automation JS code aware of injected script headers
Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm (275915 => 275916)
--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm 2021-04-13 22:48:10 UTC (rev 275916)
@@ -605,10 +605,8 @@
void WebProcessPool::remoteWebInspectorEnabledCallback(CFNotificationCenterRef, void *observer, CFStringRef name, const void *, CFDictionaryRef userInfo)
{
auto* pool = reinterpret_cast<WebProcessPool*>(observer);
- for (size_t i = 0; i < pool->m_processes.size(); ++i) {
- auto process = pool->m_processes[i];
+ for (auto& process : pool->m_processes)
process->enableRemoteInspectorIfNeeded();
- }
}
#endif
@@ -698,11 +696,11 @@
m_accessibilityEnabledObserver = [[NSNotificationCenter defaultCenter] addObserverForName:(__bridge id)kAXSApplicationAccessibilityEnabledNotification object:nil queue:[NSOperationQueue currentQueue] usingBlock:^(NSNotification *) {
if (!_AXSApplicationAccessibilityEnabled())
return;
- for (size_t i = 0; i < m_processes.size(); ++i) {
+ for (auto& process : m_processes) {
#if ENABLE(CFPREFS_DIRECT_MODE)
- m_processes[i]->unblockPreferenceServiceIfNeeded();
+ process->unblockPreferenceServiceIfNeeded();
#endif
- m_processes[i]->unblockAccessibilityServerIfNeeded();
+ process->unblockAccessibilityServerIfNeeded();
}
}];
#if ENABLE(CFPREFS_DIRECT_MODE)
Modified: trunk/Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm (275915 => 275916)
--- trunk/Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WebKit/UIProcess/Cocoa/WebProcessProxyCocoa.mm 2021-04-13 22:48:10 UTC (rev 275916)
@@ -178,7 +178,7 @@
mediaTypeCache() = types;
for (auto& process : processPool().processes()) {
- if (process != this)
+ if (process != *this)
cacheMediaMIMETypesInternal(types);
}
}
Modified: trunk/Source/WebKit/UIProcess/VisitedLinkStore.cpp (275915 => 275916)
--- trunk/Source/WebKit/UIProcess/VisitedLinkStore.cpp 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WebKit/UIProcess/VisitedLinkStore.cpp 2021-04-13 22:48:10 UTC (rev 275916)
@@ -95,7 +95,7 @@
m_linkHashStore.clear();
for (auto& process : m_processes) {
- ASSERT(process.processPool().processes().contains(&process));
+ ASSERT(process.processPool().processes().contains(process));
process.send(Messages::VisitedLinkTableController::RemoveAllVisitedLinks(), identifier());
}
}
@@ -112,7 +112,7 @@
void VisitedLinkStore::sendStoreHandleToProcess(WebProcessProxy& process)
{
- ASSERT(process.processPool().processes().contains(&process));
+ ASSERT(process.processPool().processes().contains(process));
SharedMemory::Handle handle;
if (!m_linkHashStore.createSharedMemoryHandle(handle))
@@ -138,7 +138,7 @@
ASSERT(!addedHashes.isEmpty() || !removedHashes.isEmpty());
for (auto& process : m_processes) {
- ASSERT(process.processPool().processes().contains(&process));
+ ASSERT(process.processPool().processes().contains(process));
if (addedHashes.size() > 20 || !removedHashes.isEmpty())
process.send(Messages::VisitedLinkTableController::AllVisitedLinkStateChanged(), identifier());
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (275915 => 275916)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2021-04-13 22:48:10 UTC (rev 275916)
@@ -510,7 +510,7 @@
m_gpuProcess = nullptr;
m_client.gpuProcessDidCrash(this, identifier);
- Vector<RefPtr<WebProcessProxy>> processes = m_processes;
+ Vector<Ref<WebProcessProxy>> processes = m_processes;
for (auto& process : processes)
process->gpuProcessCrashed();
@@ -569,7 +569,7 @@
if (!s_useSeparateServiceWorkerProcess) {
for (auto& process : processPool->m_processes) {
- if (process == processPool->m_prewarmedProcess || process->isDummyProcessProxy())
+ if (process.ptr() == processPool->m_prewarmedProcess.get() || process->isDummyProcessProxy())
continue;
if (&process->websiteDataStore() != websiteDataStore)
continue;
@@ -576,7 +576,7 @@
if (!process->isMatchingRegistrableDomain(registrableDomain))
continue;
- serviceWorkerProcessProxy = process.get();
+ serviceWorkerProcessProxy = process.ptr();
serviceWorkerProcessProxy->enableServiceWorkers(processPool->userContentControllerIdentifierForServiceWorkers());
if (serviceWorkerProcessProxy->isInProcessCache()) {
@@ -670,7 +670,7 @@
// There is sometimes a delay until we get notified that a prewarmed process has been terminated (e.g. after resuming
// from suspension) so make sure the process is still running here before deciding to use it.
if (m_prewarmedProcess->wasTerminated()) {
- WEBPROCESSPOOL_RELEASE_LOG_ERROR(Process, "tryTakePrewarmedProcess: Not using prewarmed process because it has been terminated (process=%p, PID=%d)", m_prewarmedProcess, m_prewarmedProcess->processIdentifier());
+ WEBPROCESSPOOL_RELEASE_LOG_ERROR(Process, "tryTakePrewarmedProcess: Not using prewarmed process because it has been terminated (process=%p, PID=%d)", m_prewarmedProcess.get(), m_prewarmedProcess->processIdentifier());
m_prewarmedProcess = nullptr;
return nullptr;
}
@@ -686,7 +686,7 @@
m_prewarmedProcess->setWebsiteDataStore(websiteDataStore);
m_prewarmedProcess->markIsNoLongerInPrewarmedPool();
- return std::exchange(m_prewarmedProcess, nullptr);
+ return std::exchange(m_prewarmedProcess, nullptr).get();
}
#if PLATFORM(MAC)
@@ -871,7 +871,7 @@
if (isPrewarmed == WebProcessProxy::IsPrewarmed::Yes) {
ASSERT(!m_prewarmedProcess);
- m_prewarmedProcess = &process;
+ m_prewarmedProcess = makeWeakPtr(process);
}
#if PLATFORM(IOS_FAMILY) && !PLATFORM(MACCATALYST)
@@ -901,17 +901,16 @@
void WebProcessPool::enableProcessTermination()
{
m_processTerminationEnabled = true;
- // FIXME: m_processes should be Vector<Ref<WebProcessProxy>>
- Vector<RefPtr<WebProcessProxy>> processes = m_processes;
- for (size_t i = 0; i < processes.size(); ++i) {
- if (shouldTerminate(*processes[i]))
- processes[i]->terminate();
+ Vector<Ref<WebProcessProxy>> processes = m_processes;
+ for (auto& process : processes) {
+ if (shouldTerminate(process))
+ process->terminate();
}
}
bool WebProcessPool::shouldTerminate(WebProcessProxy& process)
{
- ASSERT(m_processes.contains(&process));
+ ASSERT(m_processes.contains(process));
if (!m_processTerminationEnabled || m_configuration->alwaysKeepAndReuseSwappedProcesses())
return false;
@@ -919,7 +918,7 @@
return true;
}
-void WebProcessPool::processDidFinishLaunching(WebProcessProxy* process)
+void WebProcessPool::processDidFinishLaunching(WebProcessProxy& process)
{
ASSERT(m_processes.contains(process));
@@ -933,24 +932,24 @@
if (m_memorySamplerEnabled) {
SandboxExtension::Handle sampleLogSandboxHandle;
WallTime now = WallTime::now();
- String sampleLogFilePath = makeString("WebProcess", static_cast<unsigned long long>(now.secondsSinceEpoch().seconds()), "pid", process->processIdentifier());
+ String sampleLogFilePath = makeString("WebProcess", static_cast<unsigned long long>(now.secondsSinceEpoch().seconds()), "pid", process.processIdentifier());
sampleLogFilePath = SandboxExtension::createHandleForTemporaryFile(sampleLogFilePath, SandboxExtension::Type::ReadWrite, sampleLogSandboxHandle);
- process->send(Messages::WebProcess::StartMemorySampler(sampleLogSandboxHandle, sampleLogFilePath, m_memorySamplerInterval), 0);
+ process.send(Messages::WebProcess::StartMemorySampler(sampleLogSandboxHandle, sampleLogFilePath, m_memorySamplerInterval), 0);
}
if (m_configuration->fullySynchronousModeIsAllowedForTesting())
- process->connection()->allowFullySynchronousModeForTesting();
+ process.connection()->allowFullySynchronousModeForTesting();
if (m_configuration->ignoreSynchronousMessagingTimeoutsForTesting())
- process->connection()->ignoreTimeoutsForTesting();
+ process.connection()->ignoreTimeoutsForTesting();
- m_connectionClient.didCreateConnection(this, process->webConnection());
+ m_connectionClient.didCreateConnection(this, process.webConnection());
}
void WebProcessPool::disconnectProcess(WebProcessProxy& process)
{
- ASSERT(m_processes.contains(&process));
+ ASSERT(m_processes.contains(process));
if (m_prewarmedProcess == &process) {
ASSERT(m_prewarmedProcess->isPrewarmed());
@@ -973,7 +972,7 @@
static_cast<WebContextSupplement*>(supplement<WebGeolocationManagerProxy>())->processDidClose(&process);
- m_processes.removeFirst(&process);
+ m_processes.removeFirst(process);
#if ENABLE(GAMEPAD)
if (m_processesUsingGamepads.contains(process))
@@ -987,7 +986,7 @@
{
if (!registrableDomain.isEmpty()) {
if (auto process = webProcessCache().takeProcess(registrableDomain, websiteDataStore)) {
- ASSERT(m_processes.contains(process.get()));
+ ASSERT(m_processes.contains(*process));
return process.releaseNonNull();
}
@@ -994,7 +993,7 @@
// Check if we have a suspended page for the given registrable domain and use its process if we do, for performance reasons.
if (auto process = SuspendedPageProxy::findReusableSuspendedPageProcess(*this, registrableDomain, websiteDataStore)) {
WEBPROCESSPOOL_RELEASE_LOG(ProcessSwapping, "processForRegistrableDomain: Using WebProcess from a SuspendedPage (process=%p, PID=%i)", process.get(), process->processIdentifier());
- ASSERT(m_processes.contains(process.get()));
+ ASSERT(m_processes.contains(*process));
return process.releaseNonNull();
}
}
@@ -1003,7 +1002,7 @@
WEBPROCESSPOOL_RELEASE_LOG(ProcessSwapping, "processForRegistrableDomain: Using prewarmed process (process=%p, PID=%i)", process.get(), process->processIdentifier());
if (!registrableDomain.isEmpty())
tryPrewarmWithDomainInformation(*process, registrableDomain);
- ASSERT(m_processes.contains(process.get()));
+ ASSERT(m_processes.contains(*process));
return process.releaseNonNull();
}
@@ -1015,7 +1014,7 @@
#endif
for (auto& process : m_processes) {
- if (process == m_prewarmedProcess || process->isDummyProcessProxy())
+ if (process.ptr() == m_prewarmedProcess.get() || process->isDummyProcessProxy())
continue;
#if ENABLE(SERVICE_WORKER)
if (process->isRunningServiceWorkers())
@@ -1023,7 +1022,7 @@
#endif
if (mustMatchDataStore && &process->websiteDataStore() != &websiteDataStore)
continue;
- return *process;
+ return process;
}
}
return createNewWebProcess(&websiteDataStore);
@@ -1070,7 +1069,7 @@
if (!process) {
process = WebProcessProxy::create(*this, pageConfiguration->websiteDataStore(), WebProcessProxy::IsPrewarmed::No, WebProcessProxy::ShouldLaunchProcess::No);
m_dummyProcessProxies.add(pageConfiguration->websiteDataStore()->sessionID(), makeWeakPtr(*process));
- m_processes.append(process.copyRef());
+ m_processes.append(*process);
}
} else
process = processForRegistrableDomain(*pageConfiguration->websiteDataStore(), nullptr, { });
@@ -1501,7 +1500,7 @@
void WebProcessPool::terminateAllWebContentProcesses()
{
WEBPROCESSPOOL_RELEASE_LOG_ERROR(Process, "terminateAllWebContentProcesses");
- Vector<RefPtr<WebProcessProxy>> processes = m_processes;
+ Vector<Ref<WebProcessProxy>> processes = m_processes;
for (auto& process : processes)
process->terminate();
}
@@ -1558,11 +1557,11 @@
#endif
}
-static WebProcessProxy* webProcessProxyFromConnection(IPC::Connection& connection, const Vector<RefPtr<WebProcessProxy>>& processes)
+static WebProcessProxy* webProcessProxyFromConnection(IPC::Connection& connection, const Vector<Ref<WebProcessProxy>>& processes)
{
for (auto& process : processes) {
if (process->hasConnection(connection))
- return process.get();
+ return process.ptr();
}
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (275915 => 275916)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2021-04-13 22:48:10 UTC (rev 275916)
@@ -186,7 +186,7 @@
void setCustomWebContentServiceBundleIdentifier(const String&);
const String& customWebContentServiceBundleIdentifier() { return m_configuration->customWebContentServiceBundleIdentifier(); }
- const Vector<RefPtr<WebProcessProxy>>& processes() const { return m_processes; }
+ const Vector<Ref<WebProcessProxy>>& processes() const { return m_processes; }
// WebProcessProxy object which does not have a running process which is used for convenience, to avoid
// null checks in WebPageProxy.
@@ -195,7 +195,7 @@
template<typename T> void sendToAllProcesses(const T& message);
template<typename T> void sendToAllProcessesForSession(const T& message, PAL::SessionID);
- void processDidFinishLaunching(WebProcessProxy*);
+ void processDidFinishLaunching(WebProcessProxy&);
WebProcessCache& webProcessCache() { return m_webProcessCache.get(); }
@@ -596,8 +596,8 @@
IPC::MessageReceiverMap m_messageReceiverMap;
- Vector<RefPtr<WebProcessProxy>> m_processes;
- WebProcessProxy* m_prewarmedProcess { nullptr };
+ Vector<Ref<WebProcessProxy>> m_processes;
+ WeakPtr<WebProcessProxy> m_prewarmedProcess;
HashMap<PAL::SessionID, WeakPtr<WebProcessProxy>> m_dummyProcessProxies; // Lightweight WebProcessProxy objects without backing process.
@@ -797,9 +797,7 @@
template<typename T>
void WebProcessPool::sendToAllProcesses(const T& message)
{
- size_t processCount = m_processes.size();
- for (size_t i = 0; i < processCount; ++i) {
- WebProcessProxy* process = m_processes[i].get();
+ for (auto& process : m_processes) {
if (process->canSendMessage())
process->send(T(message), 0);
}
@@ -808,9 +806,7 @@
template<typename T>
void WebProcessPool::sendToAllProcessesForSession(const T& message, PAL::SessionID sessionID)
{
- size_t processCount = m_processes.size();
- for (size_t i = 0; i < processCount; ++i) {
- WebProcessProxy* process = m_processes[i].get();
+ for (auto& process : m_processes) {
if (process->canSendMessage() && !process->isPrewarmed() && process->sessionID() == sessionID)
process->send(T(message), 0);
}
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (275915 => 275916)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-04-13 22:42:33 UTC (rev 275915)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-04-13 22:48:10 UTC (rev 275916)
@@ -1028,7 +1028,7 @@
RELEASE_ASSERT(!m_webConnection);
m_webConnection = WebConnectionToWebProcess::create(this);
- m_processPool->processDidFinishLaunching(this);
+ m_processPool->processDidFinishLaunching(*this);
m_backgroundResponsivenessTimer.updateState();
#if ENABLE(IPC_TESTING_API)