WebCore:
[WebKit-https.git] / WebKit / mac / DOM / WebDOMOperations.mm
1 /*
2  * Copyright (C) 2005, 2008 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  *
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 "WebFrameInternal.h"
34 #import "WebFramePrivate.h"
35 #import "WebKitNSStringExtras.h"
36 #import <JavaScriptCore/Assertions.h>
37 #import <WebCore/Document.h>
38 #import <WebKit/DOMExtensions.h>
39 #import <WebKit/DOMHTML.h>
40
41 #if ENABLE(SVG)
42 #import <WebKit/DOMSVG.h>
43 #endif
44
45 using namespace WebCore;
46
47 @implementation DOMNode (WebDOMNodeOperations)
48
49 - (WebArchive *)webArchive
50 {
51     return [WebArchiver archiveNode:self];
52 }
53
54 - (NSString *)markupString
55 {
56     return [[[self ownerDocument] webFrame] _markupStringFromNode:self nodes:nil];
57 }
58
59 @end
60
61 @implementation DOMNode (WebDOMNodeOperationsPrivate)
62
63 - (NSArray *)_URLsFromSelectors:(SEL)firstSel, ...
64 {
65     NSMutableArray *URLs = [NSMutableArray array];
66     
67     va_list args;
68     va_start(args, firstSel);
69     
70     SEL selector = firstSel;
71     do {
72 #if ENABLE(SVG)
73         NSString *string;
74         id attributeValue = [self performSelector:selector];
75         if ([attributeValue isKindOfClass:[DOMSVGAnimatedString class]])
76             string = [(DOMSVGAnimatedString*)attributeValue animVal];
77         else
78             string = attributeValue;
79 #else
80         NSString *string = [self performSelector:selector];
81 #endif
82         if ([string length] > 0)
83             [URLs addObject:[[self ownerDocument] URLWithAttributeString:string]];
84     } while ((selector = va_arg(args, SEL)) != nil);
85     
86     va_end(args);
87     
88     return URLs;
89 }
90
91 - (NSArray *)_subresourceURLs
92 {
93     return nil;
94 }
95
96 @end
97
98 @implementation DOMDocument (WebDOMDocumentOperations)
99
100 - (WebFrame *)webFrame
101 {
102     Document* document = core(self);
103     Frame* frame = document->frame();
104     if (!frame)
105         return nil;
106     return kit(frame);
107 }
108
109 - (NSURL *)URLWithAttributeString:(NSString *)string
110 {
111     return [[self webFrame] _URLWithAttributeString:string];
112 }
113
114 @end
115
116 @implementation DOMDocument (WebDOMDocumentOperationsPrivate)
117
118 - (DOMRange *)_createRangeWithNode:(DOMNode *)node
119 {
120     DOMRange *range = [self createRange];
121     [range selectNode:node];
122     return range;
123 }
124
125 - (DOMRange *)_documentRange
126 {
127     return [self _createRangeWithNode:[self documentElement]];
128 }
129
130 @end
131
132 @implementation DOMRange (WebDOMRangeOperations)
133
134 - (WebArchive *)webArchive
135 {
136     return [WebArchiver archiveRange:self];
137 }
138
139 - (NSString *)markupString
140 {
141     return [[[[self startContainer] ownerDocument] webFrame] _markupStringFromRange:self nodes:nil];
142 }
143
144 @end
145
146 @implementation DOMHTMLBodyElement (WebDOMHTMLBodyElementOperationsPrivate)
147
148 - (NSArray *)_subresourceURLs
149 {
150     return [self _URLsFromSelectors:@selector(background), nil];
151 }
152
153 @end
154
155 @implementation DOMHTMLInputElement (WebDOMHTMLInputElementOperationsPrivate)
156
157 - (NSArray *)_subresourceURLs
158 {
159     return [self _URLsFromSelectors:@selector(src), nil];
160 }
161
162 @end
163
164 @implementation DOMHTMLLinkElement (WebDOMHTMLLinkElementOperationsPrivate)
165
166 - (NSArray *)_subresourceURLs
167 {
168     NSString *relName = [self rel];
169     if ([relName _webkit_isCaseInsensitiveEqualToString:@"stylesheet"] || [relName _webkit_isCaseInsensitiveEqualToString:@"icon"]) {
170         return [self _URLsFromSelectors:@selector(href), nil];
171     }
172     return nil;
173 }
174
175 @end
176
177 @implementation DOMHTMLScriptElement (WebDOMHTMLScriptElementOperationsPrivate)
178
179 - (NSArray *)_subresourceURLs
180 {
181     return [self _URLsFromSelectors:@selector(src), nil];
182 }
183
184 @end
185
186 @implementation DOMHTMLImageElement (WebDOMHTMLImageElementOperationsPrivate)
187
188 - (NSArray *)_subresourceURLs
189 {
190     SEL useMapSelector = [[self useMap] hasPrefix:@"#"] ? nil : @selector(useMap);
191     return [self _URLsFromSelectors:@selector(src), useMapSelector, nil];
192 }
193
194 @end
195
196 #if ENABLE(SVG)
197
198 @implementation DOMSVGImageElement (WebDOMSVGImageElementOperationsPrivate)
199
200 - (NSArray *)_subresourceURLs
201 {
202     return [self _URLsFromSelectors:@selector(href), nil];
203 }
204
205 @end
206
207 @implementation DOMSVGScriptElement (WebDOMSVGScriptElementOperationsPrivate)
208
209 - (NSArray *)_subresourceURLs
210 {
211     return [self _URLsFromSelectors:@selector(href), nil];
212 }
213
214 @end
215
216 @implementation DOMSVGCursorElement (WebDOMSVGCursorElementOperationsPrivate)
217
218 - (NSArray *)_subresourceURLs
219 {
220     return [self _URLsFromSelectors:@selector(href), nil];
221 }
222
223 @end
224
225 #if ENABLE(SVG_FILTERS)
226 @implementation DOMSVGFEImageElement (WebDOMSVGFEImageElementOperationsPrivate)
227
228 - (NSArray *)_subresourceURLs
229 {
230     return [self _URLsFromSelectors:@selector(href), nil];
231 }
232
233 @end
234 #endif
235
236 #endif
237
238 @implementation DOMProcessingInstruction (WebDOMProcessingInstructionOperationsPrivate)
239
240 - (NSString *)_stylesheetURL
241 {
242     DOMStyleSheet *styleSheet = [self sheet];
243     if (styleSheet)
244         return [styleSheet href];
245     return nil;
246 }
247
248 - (NSArray *)_subresourceURLs
249 {
250     return [self _URLsFromSelectors:@selector(_stylesheetURL), nil];
251 }
252
253 @end
254
255 @implementation DOMHTMLEmbedElement (WebDOMHTMLEmbedElementOperationsPrivate)
256
257 - (NSArray *)_subresourceURLs
258 {
259     return [self _URLsFromSelectors:@selector(src), nil];
260 }
261
262 @end
263
264 @implementation DOMHTMLObjectElement (WebDOMHTMLObjectElementOperationsPrivate)
265
266 - (NSArray *)_subresourceURLs
267 {
268     SEL useMapSelector = [[self useMap] hasPrefix:@"#"] ? nil : @selector(useMap);
269     return [self _URLsFromSelectors:@selector(data), useMapSelector, nil];
270 }
271
272 @end
273
274 @implementation DOMHTMLParamElement (WebDOMHTMLParamElementOperationsPrivate)
275
276 - (NSArray *)_subresourceURLs
277 {
278     NSString *paramName = [self name];
279     if ([paramName _webkit_isCaseInsensitiveEqualToString:@"data"] ||
280         [paramName _webkit_isCaseInsensitiveEqualToString:@"movie"] ||
281         [paramName _webkit_isCaseInsensitiveEqualToString:@"src"]) {
282         return [self _URLsFromSelectors:@selector(value), nil];
283     }
284     return nil;
285 }
286
287 @end
288
289 @implementation DOMHTMLTableElement (WebDOMHTMLTableElementOperationsPrivate)
290
291 - (NSString *)_web_background
292 {
293     return [self getAttribute:@"background"];
294 }
295
296 - (NSArray *)_subresourceURLs
297 {
298     return [self _URLsFromSelectors:@selector(_web_background), nil];
299 }
300
301 @end
302
303 @implementation DOMHTMLTableCellElement (WebDOMHTMLTableCellElementOperationsPrivate)
304
305 - (NSString *)_web_background
306 {
307     return [self getAttribute:@"background"];
308 }
309
310 - (NSArray *)_subresourceURLs
311 {
312     return [self _URLsFromSelectors:@selector(_web_background), nil];
313 }
314
315 @end
316
317 @implementation DOMHTMLFrameElement (WebDOMHTMLFrameElementOperations)
318
319 - (WebFrame *)contentFrame
320 {
321     return [[self contentDocument] webFrame];
322 }
323
324 @end
325
326 @implementation DOMHTMLIFrameElement (WebDOMHTMLIFrameElementOperations)
327
328 - (WebFrame *)contentFrame
329 {
330     return [[self contentDocument] webFrame];
331 }
332
333 @end
334
335 @implementation DOMHTMLObjectElement (WebDOMHTMLObjectElementOperations)
336
337 - (WebFrame *)contentFrame
338 {
339     return [[self contentDocument] webFrame];
340 }
341
342 @end