Make use of HAVE(CORE_ANIMATION_RENDER_SERVER) in more places
[WebKit-https.git] / Source / WebKit / Platform / mac / LayerHostingContext.mm
1 /*
2  * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "LayerHostingContext.h"
28
29 #import <WebCore/MachSendRight.h>
30 #import <pal/spi/cg/CoreGraphicsSPI.h>
31 #import <pal/spi/cocoa/QuartzCoreSPI.h>
32
33 using namespace WebCore;
34
35 namespace WebKit {
36
37 std::unique_ptr<LayerHostingContext> LayerHostingContext::createForPort(const MachSendRight& serverPort)
38 {
39     auto layerHostingContext = std::make_unique<LayerHostingContext>();
40
41     NSDictionary *options = @{
42         kCAContextPortNumber : @(serverPort.sendRight()),
43 #if PLATFORM(MAC)
44         kCAContextCIFilterBehavior : @"ignore",
45 #endif
46     };
47
48     layerHostingContext->m_layerHostingMode = LayerHostingMode::InProcess;
49     layerHostingContext->m_context = [CAContext remoteContextWithOptions:options];
50
51     return layerHostingContext;
52 }
53
54 #if HAVE(OUT_OF_PROCESS_LAYER_HOSTING)
55 std::unique_ptr<LayerHostingContext> LayerHostingContext::createForExternalHostingProcess()
56 {
57     auto layerHostingContext = std::make_unique<LayerHostingContext>();
58     layerHostingContext->m_layerHostingMode = LayerHostingMode::OutOfProcess;
59
60 #if PLATFORM(IOS)
61     // Use a very large display ID to ensure that the context is never put on-screen 
62     // without being explicitly parented. See <rdar://problem/16089267> for details.
63     layerHostingContext->m_context = [CAContext remoteContextWithOptions:@{
64 #if HAVE(CORE_ANIMATION_RENDER_SERVER)
65         kCAContextIgnoresHitTest : @YES,
66         kCAContextDisplayId : @10000
67 #endif
68     }];
69 #elif __MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
70     [CAContext setAllowsCGSConnections:NO];
71     layerHostingContext->m_context = [CAContext remoteContextWithOptions:@{kCAContextCIFilterBehavior :  @"ignore"}];
72 #else
73     layerHostingContext->m_context = [CAContext contextWithCGSConnection:CGSMainConnectionID() options:@{ kCAContextCIFilterBehavior : @"ignore" }];
74 #endif
75     
76     return layerHostingContext;
77 }
78
79 #if PLATFORM(MAC)
80 std::unique_ptr<LayerHostingContext> LayerHostingContext::createForExternalPluginHostingProcess()
81 {
82     auto layerHostingContext = std::make_unique<LayerHostingContext>();
83     layerHostingContext->m_layerHostingMode = LayerHostingMode::OutOfProcess;
84     layerHostingContext->m_context = [CAContext contextWithCGSConnection:CGSMainConnectionID() options:@{ kCAContextCIFilterBehavior : @"ignore" }];
85     return layerHostingContext;
86 }
87 #endif
88 #endif // HAVE(OUT_OF_PROCESS_LAYER_HOSTING)
89
90 LayerHostingContext::LayerHostingContext()
91 {
92 }
93
94 LayerHostingContext::~LayerHostingContext()
95 {
96 }
97
98 void LayerHostingContext::setRootLayer(CALayer *rootLayer)
99 {
100     [m_context setLayer:rootLayer];
101 }
102
103 CALayer *LayerHostingContext::rootLayer() const
104 {
105     return [m_context layer];
106 }
107
108 uint32_t LayerHostingContext::contextID() const
109 {
110     return [m_context contextId];
111 }
112
113 void LayerHostingContext::invalidate()
114 {
115     [m_context invalidate];
116 }
117
118 void LayerHostingContext::setColorSpace(CGColorSpaceRef colorSpace)
119 {
120     [m_context setColorSpace:colorSpace];
121 }
122
123 CGColorSpaceRef LayerHostingContext::colorSpace() const
124 {
125     return [m_context colorSpace];
126 }
127
128 #if PLATFORM(MAC)
129 void LayerHostingContext::setColorMatchUntaggedContent(bool colorMatchUntaggedContent)
130 {
131     [m_context setColorMatchUntaggedContent:colorMatchUntaggedContent];
132 }
133
134 bool LayerHostingContext::colorMatchUntaggedContent() const
135 {
136     return [m_context colorMatchUntaggedContent];
137 }
138 #endif
139
140 void LayerHostingContext::setFencePort(mach_port_t fencePort)
141 {
142     [m_context setFencePort:fencePort];
143 }
144
145 MachSendRight LayerHostingContext::createFencePort()
146 {
147     return MachSendRight::adopt([m_context createFencePort]);
148 }
149
150 } // namespace WebKit