summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm')
-rw-r--r--Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm141
1 files changed, 27 insertions, 114 deletions
diff --git a/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm b/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm
index a182faa42..2ca0b3f2a 100644
--- a/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm
+++ b/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm
@@ -26,124 +26,14 @@
#import "config.h"
#import "WebProcessProxy.h"
-#import "SecItemRequestData.h"
-#import "SecItemResponseData.h"
-#import "SecKeychainItemRequestData.h"
-#import "SecKeychainItemResponseData.h"
+#import "WebContext.h"
+#import "WebPageGroup.h"
+#import "WebPreferences.h"
#import "WebProcessMessages.h"
#import "WKFullKeyboardAccessWatcher.h"
-#import <Security/SecItem.h>
namespace WebKit {
-static void handleSecItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecItemRequestData& request)
-{
- SecItemResponseData response;
-
- switch (request.type()) {
- case SecItemRequestData::CopyMatching: {
- CFTypeRef resultObject = 0;
- OSStatus resultCode = SecItemCopyMatching(request.query(), &resultObject);
- response = SecItemResponseData(resultCode, adoptCF(resultObject).get());
- break;
- }
-
- case SecItemRequestData::Add: {
- CFTypeRef resultObject = 0;
- OSStatus resultCode = SecItemAdd(request.query(), &resultObject);
- response = SecItemResponseData(resultCode, adoptCF(resultObject).get());
- break;
- }
-
- case SecItemRequestData::Update: {
- OSStatus resultCode = SecItemUpdate(request.query(), request.attributesToMatch());
- response = SecItemResponseData(resultCode, 0);
- break;
- }
-
- case SecItemRequestData::Delete: {
- OSStatus resultCode = SecItemDelete(request.query());
- response = SecItemResponseData(resultCode, 0);
- break;
- }
-
- default:
- return;
- }
-
- connection->send(Messages::WebProcess::SecItemResponse(requestID, response), 0);
-}
-
-static void dispatchFunctionOnQueue(dispatch_queue_t queue, const Function<void ()>& function)
-{
-#if COMPILER(CLANG)
- dispatch_async(queue, function);
-#else
- Function<void ()>* functionPtr = new Function<void ()>(function);
- dispatch_async(queue, ^{
- (*functionPtr)();
- delete functionPtr;
- });
-#endif
-}
-
-void WebProcessProxy::secItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecItemRequestData& request)
-{
- // Since we don't want the connection work queue to be held up, we do all
- // keychain interaction work on a global dispatch queue.
- dispatch_queue_t keychainWorkQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- dispatchFunctionOnQueue(keychainWorkQueue, bind(handleSecItemRequest, RefPtr<CoreIPC::Connection>(connection), requestID, request));
-}
-
-static void handleSecKeychainItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecKeychainItemRequestData& request)
-{
- SecKeychainItemResponseData response;
-
- switch (request.type()) {
- case SecKeychainItemRequestData::CopyContent: {
- SecKeychainItemRef item = request.keychainItem();
- SecItemClass itemClass;
- SecKeychainAttributeList* attrList = request.attributeList();
- UInt32 length = 0;
- void* outData = 0;
-
- OSStatus resultCode = SecKeychainItemCopyContent(item, &itemClass, attrList, &length, &outData);
- RetainPtr<CFDataRef> data(AdoptCF, CFDataCreate(0, static_cast<const UInt8*>(outData), length));
- response = SecKeychainItemResponseData(resultCode, itemClass, attrList, data.get());
-
- SecKeychainItemFreeContent(attrList, outData);
- break;
- }
-
- case SecKeychainItemRequestData::CreateFromContent: {
- SecKeychainItemRef keychainItem;
-
- OSStatus resultCode = SecKeychainItemCreateFromContent(request.itemClass(), request.attributeList(), request.length(), request.data(), 0, 0, &keychainItem);
- response = SecKeychainItemResponseData(resultCode, adoptCF(keychainItem));
- break;
- }
-
- case SecKeychainItemRequestData::ModifyContent: {
- OSStatus resultCode = SecKeychainItemModifyContent(request.keychainItem(), request.attributeList(), request.length(), request.data());
- response = resultCode;
- break;
- }
-
- default:
- return;
- }
-
- connection->send(Messages::WebProcess::SecKeychainItemResponse(requestID, response), 0);
-}
-
-void WebProcessProxy::secKeychainItemRequest(CoreIPC::Connection* connection, uint64_t requestID, const SecKeychainItemRequestData& request)
-{
- // Since we don't want the connection work queue to be held up, we do all
- // keychain interaction work on a global dispatch queue.
- dispatch_queue_t keychainWorkQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
- dispatchFunctionOnQueue(keychainWorkQueue, bind(handleSecKeychainItemRequest, RefPtr<CoreIPC::Connection>(connection), requestID, request));
-}
-
bool WebProcessProxy::fullKeyboardAccessEnabled()
{
return [WKFullKeyboardAccessWatcher fullKeyboardAccessEnabled];
@@ -163,7 +53,7 @@ static bool shouldUseXPC()
}
#endif
-void WebProcessProxy::platformConnect(ProcessLauncher::LaunchOptions& launchOptions)
+void WebProcessProxy::platformGetLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions)
{
// We want the web process to match the architecture of the UI process.
launchOptions.architecture = ProcessLauncher::LaunchOptions::MatchCurrentArchitecture;
@@ -174,4 +64,27 @@ void WebProcessProxy::platformConnect(ProcessLauncher::LaunchOptions& launchOpti
#endif
}
+bool WebProcessProxy::pageIsProcessSuppressible(WebPageProxy* page)
+{
+ return !page->isViewVisible() && page->pageGroup()->preferences()->pageVisibilityBasedProcessSuppressionEnabled();
+}
+
+bool WebProcessProxy::allPagesAreProcessSuppressible() const
+{
+ return (m_processSuppressiblePages.size() == m_pageMap.size()) && !m_processSuppressiblePages.isEmpty();
+}
+
+void WebProcessProxy::updateProcessSuppressionState()
+{
+ if (!isValid())
+ return;
+
+ bool canEnable = m_context->canEnableProcessSuppressionForWebProcess(this);
+ if (m_processSuppressionEnabled == canEnable)
+ return;
+ m_processSuppressionEnabled = canEnable;
+
+ connection()->send(Messages::WebProcess::SetProcessSuppressionEnabled(m_processSuppressionEnabled), 0);
+}
+
} // namespace WebKit