5cfdfd2ea7e3352166d42872604690096163979a
[WebKit-https.git] / WebKit / mac / DOM / WebDOMOperations.mm
1 /*
2  * Copyright (C) 2005 Apple Computer, 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import "WebDOMOperationsPrivate.h"
30
31 #import "WebArchiver.h"
32 #import "WebDataSourcePrivate.h"
33 #import "WebFrameBridge.h"
34 #import "WebFrameInternal.h"
35 #import "WebFramePrivate.h"
36 #import "WebKitNSStringExtras.h"
37 #import <JavaScriptCore/Assertions.h>
38 #import <WebCore/Document.h>
39 #import <WebKit/DOMExtensions.h>
40 #import <WebKit/DOMHTML.h>
41
42 #if ENABLE(SVG)
43 #import <WebKit/DOMSVG.h>
44 #endif
45
46 using namespace WebCore;
47
48 @implementation DOMNode (WebDOMNodeOperations)
49
50 - (WebFrameBridge *)_bridge
51 {
52     Document* document = core(self)->document();
53     if (!document)
54         return nil;
55     Frame* frame = document->frame();
56     if (!frame)
57         return nil;
58     return [kit(frame) _bridge];
59 }
60
61 - (WebArchive *)webArchive
62 {
63     return [WebArchiver archiveNode:self];
64 }
65
66 - (NSString *)markupString
67 {
68     return [[self _bridge] markupStringFromNode:self nodes:nil];
69 }
70
71 - (NSArray *)_URLsFromSelectors:(SEL)firstSel, ...
72 {
73     NSMutableArray *URLs = [NSMutableArray array];
74     
75     va_list args;
76     va_start(args, firstSel);
77     
78     SEL selector = firstSel;
79     do {
80 #if ENABLE(SVG)
81         NSString *string;
82         id attributeValue = [self performSelector:selector];
83         if ([attributeValue isKindOfClass:[DOMSVGAnimatedString class]])
84             string = [(DOMSVGAnimatedString*)attributeValue animVal];
85         else
86             string = attributeValue;
87 #else
88         NSString *string = [self performSelector:selector];
89 #endif
90         if ([string length] > 0)
91             [URLs addObject:[[self ownerDocument] URLWithAttributeString:string]];
92     } while ((selector = va_arg(args, SEL)) != nil);
93     
94     va_end(args);
95     
96     return URLs;
97 }
98
99 - (NSArray *)_subresourceURLs
100 {
101     return nil;
102 }
103
104 @end
105
106 @implementation DOMDocument (WebDOMDocumentOperations)
107
108 - (WebFrame *)webFrame
109 {
110     return [[self _bridge] webFrame];
111 }
112
113 - (NSURL *)URLWithAttributeString:(NSString *)string
114 {
115     return [[self _bridge] URLWithAttributeString:string];
116 }
117
118 @end
119
120 @implementation DOMDocument (WebDOMDocumentOperationsPrivate)
121
122 - (DOMRange *)_createRangeWithNode:(DOMNode *)node
123 {
124     DOMRange *range = [self createRange];
125     [range selectNode:node];
126     return range;
127 }
128
129 - (DOMRange *)_documentRange
130 {
131     return [self _createRangeWithNode:[self documentElement]];
132 }
133
134 @end
135
136 @implementation DOMRange (WebDOMRangeOperations)
137
138 - (WebFrameBridge *)_bridge
139 {
140     return [[self startContainer] _bridge];
141 }
142
143 - (WebArchive *)webArchive
144 {
145     return [WebArchiver archiveRange:self];
146 }
147
148 - (NSString *)markupString
149 {
150     return [[self _bridge] markupStringFromRange:self nodes:nil];
151 }
152
153 @end
154
155 @implementation DOMHTMLBodyElement (WebDOMHTMLBodyElementOperationsPrivate)
156
157 - (NSArray *)_subresourceURLs
158 {
159     return [self _URLsFromSelectors:@selector(background), nil];
160 }
161
162 @end
163
164 @implementation DOMHTMLInputElement (WebDOMHTMLInputElementOperationsPrivate)
165
166 - (NSArray *)_subresourceURLs
167 {
168     return [self _URLsFromSelectors:@selector(src), nil];
169 }
170
171 @end
172
173 @implementation DOMHTMLLinkElement (WebDOMHTMLLinkElementOperationsPrivate)
174
175 - (NSArray *)_subresourceURLs
176 {
177     NSString *relName = [self rel];
178     if ([relName _webkit_isCaseInsensitiveEqualToString:@"stylesheet"] || [relName _webkit_isCaseInsensitiveEqualToString:@"icon"]) {
179         return [self _URLsFromSelectors:@selector(href), nil];
180     }
181     return nil;
182 }
183
184 @end
185
186 @implementation DOMHTMLScriptElement (WebDOMHTMLScriptElementOperationsPrivate)
187
188 - (NSArray *)_subresourceURLs
189 {
190     return [self _URLsFromSelectors:@selector(src), nil];
191 }
192
193 @end
194
195 @implementation DOMHTMLImageElement (WebDOMHTMLImageElementOperationsPrivate)
196
197 - (NSArray *)_subresourceURLs
198 {
199     SEL useMapSelector = [[self useMap] hasPrefix:@"#"] ? nil : @selector(useMap);
200     return [self _URLsFromSelectors:@selector(src), useMapSelector, nil];
201 }
202
203 @end
204
205 #if ENABLE(SVG)
206
207 @implementation DOMSVGImageElement (WebDOMSVGImageElementOperationsPrivate)
208
209 - (NSArray *)_subresourceURLs
210 {
211     return [self _URLsFromSelectors:@selector(href), nil];
212 }
213
214 @end
215
216 @implementation DOMSVGScriptElement (WebDOMSVGScriptElementOperationsPrivate)
217
218 - (NSArray *)_subresourceURLs
219 {
220     return [self _URLsFromSelectors:@selector(href), nil];
221 }
222
223 @end
224
225 @implementation DOMSVGCursorElement (WebDOMSVGCursorElementOperationsPrivate)
226
227 - (NSArray *)_subresourceURLs
228 {
229     return [self _URLsFromSelectors:@selector(href), nil];
230 }
231
232 @end
233
234 #if ENABLE(SVG_FILTERS)
235 @implementation DOMSVGFEImageElement (WebDOMSVGFEImageElementOperationsPrivate)
236
237 - (NSArray *)_subresourceURLs
238 {
239     return [self _URLsFromSelectors:@selector(href), nil];
240 }
241
242 @end
243 #endif
244
245 #endif
246
247 @implementation DOMProcessingInstruction (WebDOMProcessingInstructionOperationsPrivate)
248
249 - (NSString *)_stylesheetURL
250 {
251     DOMStyleSheet *styleSheet = [self sheet];
252     if (styleSheet)
253         return [styleSheet href];
254     return nil;
255 }
256
257 - (NSArray *)_subresourceURLs
258 {
259     return [self _URLsFromSelectors:@selector(_stylesheetURL), nil];
260 }
261
262 @end
263
264 @implementation DOMHTMLEmbedElement (WebDOMHTMLEmbedElementOperationsPrivate)
265
266 - (NSArray *)_subresourceURLs
267 {
268     return [self _URLsFromSelectors:@selector(src), nil];
269 }
270
271 @end
272
273 @implementation DOMHTMLObjectElement (WebDOMHTMLObjectElementOperationsPrivate)
274
275 - (NSArray *)_subresourceURLs
276 {
277     SEL useMapSelector = [[self useMap] hasPrefix:@"#"] ? nil : @selector(useMap);
278     return [self _URLsFromSelectors:@selector(data), useMapSelector, nil];
279 }
280
281 @end
282
283 @implementation DOMHTMLParamElement (WebDOMHTMLParamElementOperationsPrivate)
284
285 - (NSArray *)_subresourceURLs
286 {
287     NSString *paramName = [self name];
288     if ([paramName _webkit_isCaseInsensitiveEqualToString:@"data"] ||
289         [paramName _webkit_isCaseInsensitiveEqualToString:@"movie"] ||
290         [paramName _webkit_isCaseInsensitiveEqualToString:@"src"]) {
291         return [self _URLsFromSelectors:@selector(value), nil];
292     }
293     return nil;
294 }
295
296 @end
297
298 @implementation DOMHTMLTableElement (WebDOMHTMLTableElementOperationsPrivate)
299
300 - (NSString *)_web_background
301 {
302     return [self getAttribute:@"background"];
303 }
304
305 - (NSArray *)_subresourceURLs
306 {
307     return [self _URLsFromSelectors:@selector(_web_background), nil];
308 }
309
310 @end
311
312 @implementation DOMHTMLTableCellElement (WebDOMHTMLTableCellElementOperationsPrivate)
313
314 - (NSString *)_web_background
315 {
316     return [self getAttribute:@"background"];
317 }
318
319 - (NSArray *)_subresourceURLs
320 {
321     return [self _URLsFromSelectors:@selector(_web_background), nil];
322 }
323
324 @end
325
326 @implementation DOMHTMLFrameElement (WebDOMHTMLFrameElementOperations)
327
328 - (WebFrame *)contentFrame
329 {
330     return [[self contentDocument] webFrame];
331 }
332
333 @end
334
335 @implementation DOMHTMLIFrameElement (WebDOMHTMLIFrameElementOperations)
336
337 - (WebFrame *)contentFrame
338 {
339     return [[self contentDocument] webFrame];
340 }
341
342 @end
343
344 @implementation DOMHTMLObjectElement (WebDOMHTMLObjectElementOperations)
345
346 - (WebFrame *)contentFrame
347 {
348     return [[self contentDocument] webFrame];
349 }
350
351 @end