diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm')
-rw-r--r-- | Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm | 141 |
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 |