InjectedBundleNodeHandle::renderedImage() needs to be exposed from the Cocoa WebAPI...
[WebKit-https.git] / Source / WebKit2 / WebProcess / InjectedBundle / API / Cocoa / WKWebProcessPlugInNodeHandle.mm
1 /*
2  * Copyright (C) 2013 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 "WKWebProcessPlugInNodeHandleInternal.h"
28
29 #import "WKWebProcessPlugInFrameInternal.h"
30 #import <WebCore/IntRect.h>
31 #import <WebKit/WebImage.h>
32
33 #if WK_API_ENABLED
34
35 using namespace WebKit;
36
37 @implementation WKWebProcessPlugInNodeHandle {
38     API::ObjectStorage<InjectedBundleNodeHandle> _nodeHandle;
39 }
40
41 - (void)dealloc
42 {
43     _nodeHandle->~InjectedBundleNodeHandle();
44     [super dealloc];
45 }
46
47 + (WKWebProcessPlugInNodeHandle *)nodeHandleWithJSValue:(JSValue *)value inContext:(JSContext *)context
48 {
49     JSContextRef contextRef = [context JSGlobalContextRef];
50     JSObjectRef objectRef = JSValueToObject(contextRef, [value JSValueRef], 0);
51     RefPtr<InjectedBundleNodeHandle> nodeHandle = InjectedBundleNodeHandle::getOrCreate(contextRef, objectRef);
52     if (!nodeHandle)
53         return nil;
54
55     return [wrapper(*nodeHandle.release().leakRef()) autorelease];
56 }
57
58 - (WKWebProcessPlugInFrame *)htmlIFrameElementContentFrame
59 {
60     RefPtr<WebFrame> frame = _nodeHandle->htmlIFrameElementContentFrame();
61     if (!frame)
62         return nil;
63
64     return [wrapper(*frame.release().leakRef()) autorelease];
65 }
66
67 #if PLATFORM(IOS)
68 - (UIImage *)renderedImageWithOptions:(WKSnapshotOptions)options
69 {
70     RefPtr<WebImage> image = _nodeHandle->renderedImage(options);
71     if (!image || !image->bitmap())
72         return nil;
73
74     return [[[UIImage alloc] initWithCGImage:image->bitmap()->makeCGImage().get()] autorelease];
75 }
76 #endif
77
78 #if PLATFORM(MAC)
79 - (NSImage *)renderedImageWithOptions:(WKSnapshotOptions)options
80 {
81     RefPtr<WebImage> image = _nodeHandle->renderedImage(options);
82     if (!image || !image->bitmap())
83         return nil;
84
85     return [[[NSImage alloc] initWithCGImage:image->bitmap()->makeCGImage().get() size:NSZeroSize] autorelease];
86 }
87 #endif
88
89 - (CGRect)elementBounds
90 {
91     return _nodeHandle->elementBounds();
92 }
93
94 - (BOOL)HTMLInputElementIsAutoFilled
95 {
96     return _nodeHandle->isHTMLInputElementAutoFilled();
97 }
98
99 - (void)setHTMLInputElementIsAutoFilled:(BOOL)isAutoFilled
100 {
101     _nodeHandle->setHTMLInputElementAutoFilled(isAutoFilled);
102 }
103
104 - (BOOL)HTMLInputElementIsUserEdited
105 {
106     return _nodeHandle->htmlInputElementLastChangeWasUserEdit();
107 }
108
109 - (BOOL)HTMLTextAreaElementIsUserEdited
110 {
111     return _nodeHandle->htmlTextAreaElementLastChangeWasUserEdit();
112 }
113
114 - (BOOL)isTextField
115 {
116     return _nodeHandle->isTextField();
117 }
118
119 - (WKWebProcessPlugInNodeHandle *)HTMLTableCellElementCellAbove
120 {
121     auto nodeHandle = _nodeHandle->htmlTableCellElementCellAbove();
122     if (!nodeHandle)
123         return nil;
124
125     return [wrapper(*nodeHandle.leakRef()) autorelease];
126 }
127
128 - (InjectedBundleNodeHandle&)_nodeHandle
129 {
130     return *_nodeHandle;
131 }
132
133 #pragma mark WKObject protocol implementation
134
135 - (API::Object&)_apiObject
136 {
137     return *_nodeHandle;
138 }
139
140 @end
141
142 #endif // WK_API_ENABLED