Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKitLegacy / mac / DOM / DOMDocument.mm
1 /*
2  * Copyright (C) 2004-2016 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "DOMDocumentInternal.h"
27
28 #import <WebCore/Attr.h>
29 #import <WebCore/CDATASection.h>
30 #import <WebCore/CSSRuleList.h>
31 #import <WebCore/CSSStyleDeclaration.h>
32 #import <WebCore/Comment.h>
33 #import "DOMAbstractViewInternal.h"
34 #import "DOMAttrInternal.h"
35 #import "DOMCDATASectionInternal.h"
36 #import "DOMCSSRuleListInternal.h"
37 #import "DOMCSSStyleDeclarationInternal.h"
38 #import "DOMCommentInternal.h"
39 #import "DOMCustomXPathNSResolver.h"
40 #import "DOMDocumentFragmentInternal.h"
41 #import "DOMDocumentTypeInternal.h"
42 #import "DOMElementInternal.h"
43 #import "DOMEventInternal.h"
44 #import "DOMHTMLCollectionInternal.h"
45 #import "DOMHTMLElementInternal.h"
46 #import "DOMHTMLHeadElementInternal.h"
47 #import "DOMHTMLScriptElementInternal.h"
48 #import "DOMImplementationInternal.h"
49 #import "DOMInternal.h"
50 #import "DOMNodeInternal.h"
51 #import "DOMNodeIteratorInternal.h"
52 #import "DOMNodeListInternal.h"
53 #import "DOMProcessingInstructionInternal.h"
54 #import "DOMRangeInternal.h"
55 #import "DOMStyleSheetListInternal.h"
56 #import "DOMTextInternal.h"
57 #import "DOMTreeWalkerInternal.h"
58 #import <WebCore/DOMWindow.h>
59 #import "DOMXPathExpressionInternal.h"
60 #import "DOMXPathResultInternal.h"
61 #import <WebCore/Document.h>
62 #import <WebCore/DocumentFragment.h>
63 #import <WebCore/DocumentType.h>
64 #import <WebCore/Element.h>
65 #import <WebCore/Event.h>
66 #import "ExceptionHandlers.h"
67 #import <WebCore/HTMLCollection.h>
68 #import <WebCore/HTMLElement.h>
69 #import <WebCore/HTMLHeadElement.h>
70 #import <WebCore/HTMLScriptElement.h>
71 #import <WebCore/JSExecState.h>
72 #import <WebCore/NameNodeList.h>
73 #import <WebCore/NativeNodeFilter.h>
74 #import <WebCore/Node.h>
75 #import <WebCore/NodeIterator.h>
76 #import <WebCore/NodeList.h>
77 #import "ObjCNodeFilterCondition.h"
78 #import <WebCore/ProcessingInstruction.h>
79 #import <WebCore/Range.h>
80 #import <WebCore/StyleProperties.h>
81 #import <WebCore/StyleSheetList.h>
82 #import <WebCore/Text.h>
83 #import <WebCore/ThreadCheck.h>
84 #import <WebCore/TreeWalker.h>
85 #import <WebCore/WebScriptObjectPrivate.h>
86 #import <WebCore/XPathExpression.h>
87 #import <WebCore/XPathNSResolver.h>
88 #import <WebCore/XPathResult.h>
89 #import <wtf/GetPtr.h>
90 #import <wtf/URL.h>
91
92 #define IMPL static_cast<WebCore::Document*>(reinterpret_cast<WebCore::Node*>(_internal))
93
94 @implementation DOMDocument
95
96 - (DOMDocumentType *)doctype
97 {
98     WebCore::JSMainThreadNullState state;
99     return kit(WTF::getPtr(IMPL->doctype()));
100 }
101
102 - (DOMImplementation *)implementation
103 {
104     WebCore::JSMainThreadNullState state;
105     return kit(WTF::getPtr(IMPL->implementation()));
106 }
107
108 - (DOMElement *)documentElement
109 {
110     WebCore::JSMainThreadNullState state;
111     return kit(WTF::getPtr(IMPL->documentElement()));
112 }
113
114 - (NSString *)inputEncoding
115 {
116     WebCore::JSMainThreadNullState state;
117     return IMPL->characterSetWithUTF8Fallback();
118 }
119
120 - (NSString *)xmlEncoding
121 {
122     WebCore::JSMainThreadNullState state;
123     return IMPL->xmlEncoding();
124 }
125
126 - (NSString *)xmlVersion
127 {
128     WebCore::JSMainThreadNullState state;
129     return IMPL->xmlVersion();
130 }
131
132 - (void)setXmlVersion:(NSString *)newXmlVersion
133 {
134     WebCore::JSMainThreadNullState state;
135     raiseOnDOMError(IMPL->setXMLVersion(newXmlVersion));
136 }
137
138 - (BOOL)xmlStandalone
139 {
140     WebCore::JSMainThreadNullState state;
141     return IMPL->xmlStandalone();
142 }
143
144 - (void)setXmlStandalone:(BOOL)newXmlStandalone
145 {
146     WebCore::JSMainThreadNullState state;
147     IMPL->setXMLStandalone(newXmlStandalone);
148 }
149
150 - (NSString *)documentURI
151 {
152     WebCore::JSMainThreadNullState state;
153     return IMPL->documentURI();
154 }
155
156 - (void)setDocumentURI:(NSString *)newDocumentURI
157 {
158     WebCore::JSMainThreadNullState state;
159     IMPL->setDocumentURI(newDocumentURI);
160 }
161
162 - (DOMAbstractView *)defaultView
163 {
164     WebCore::JSMainThreadNullState state;
165     return kit(WTF::getPtr(IMPL->windowProxy()));
166 }
167
168 - (DOMStyleSheetList *)styleSheets
169 {
170     WebCore::JSMainThreadNullState state;
171     return kit(WTF::getPtr(IMPL->styleSheets()));
172 }
173
174 - (NSString *)contentType
175 {
176     WebCore::JSMainThreadNullState state;
177     return IMPL->contentType();
178 }
179
180 - (NSString *)title
181 {
182     WebCore::JSMainThreadNullState state;
183     return IMPL->title();
184 }
185
186 - (void)setTitle:(NSString *)newTitle
187 {
188     WebCore::JSMainThreadNullState state;
189     IMPL->setTitle(newTitle);
190 }
191
192 - (NSString *)dir
193 {
194     WebCore::JSMainThreadNullState state;
195     return IMPL->dir();
196 }
197
198 - (void)setDir:(NSString *)newDir
199 {
200     WebCore::JSMainThreadNullState state;
201     IMPL->setDir(newDir);
202 }
203
204 - (NSString *)referrer
205 {
206     WebCore::JSMainThreadNullState state;
207     return IMPL->referrer();
208 }
209
210 - (NSString *)domain
211 {
212     WebCore::JSMainThreadNullState state;
213     return IMPL->domain();
214 }
215
216 - (NSString *)URL
217 {
218     WebCore::JSMainThreadNullState state;
219     return IMPL->urlForBindings();
220 }
221
222 - (NSString *)cookie
223 {
224     WebCore::JSMainThreadNullState state;
225     return raiseOnDOMError(IMPL->cookie());
226 }
227
228 - (void)setCookie:(NSString *)newCookie
229 {
230     WebCore::JSMainThreadNullState state;
231     raiseOnDOMError(IMPL->setCookie(newCookie));
232 }
233
234 - (DOMHTMLElement *)body
235 {
236     WebCore::JSMainThreadNullState state;
237     return kit(WTF::getPtr(IMPL->bodyOrFrameset()));
238 }
239
240 - (void)setBody:(DOMHTMLElement *)newBody
241 {
242     WebCore::JSMainThreadNullState state;
243     raiseOnDOMError(IMPL->setBodyOrFrameset(core(newBody)));
244 }
245
246 - (DOMHTMLHeadElement *)head
247 {
248     WebCore::JSMainThreadNullState state;
249     return kit(WTF::getPtr(IMPL->head()));
250 }
251
252 - (DOMHTMLCollection *)images
253 {
254     WebCore::JSMainThreadNullState state;
255     return kit(WTF::getPtr(IMPL->images()));
256 }
257
258 - (DOMHTMLCollection *)applets
259 {
260     WebCore::JSMainThreadNullState state;
261     return kit(WTF::getPtr(IMPL->applets()));
262 }
263
264 - (DOMHTMLCollection *)links
265 {
266     WebCore::JSMainThreadNullState state;
267     return kit(WTF::getPtr(IMPL->links()));
268 }
269
270 - (DOMHTMLCollection *)forms
271 {
272     WebCore::JSMainThreadNullState state;
273     return kit(WTF::getPtr(IMPL->forms()));
274 }
275
276 - (DOMHTMLCollection *)anchors
277 {
278     WebCore::JSMainThreadNullState state;
279     return kit(WTF::getPtr(IMPL->anchors()));
280 }
281
282 - (NSString *)lastModified
283 {
284     WebCore::JSMainThreadNullState state;
285     return IMPL->lastModified();
286 }
287
288 - (NSString *)charset
289 {
290     WebCore::JSMainThreadNullState state;
291     return IMPL->charset();
292 }
293
294 - (void)setCharset:(NSString *)newCharset
295 {
296     WebCore::JSMainThreadNullState state;
297     IMPL->setCharset(newCharset);
298 }
299
300 - (NSString *)defaultCharset
301 {
302     return IMPL->defaultCharsetForLegacyBindings();
303 }
304
305 - (NSString *)readyState
306 {
307     WebCore::JSMainThreadNullState state;
308     auto readyState = IMPL->readyState();
309     switch (readyState) {
310     case WebCore::Document::Loading:
311         return @"loading";
312     case WebCore::Document::Interactive:
313         return @"interactive";
314     case WebCore::Document::Complete:
315         return @"complete";
316     }
317     ASSERT_NOT_REACHED();
318     return @"complete";
319 }
320
321 - (NSString *)characterSet
322 {
323     WebCore::JSMainThreadNullState state;
324     return IMPL->characterSetWithUTF8Fallback();
325 }
326
327 - (NSString *)preferredStylesheetSet
328 {
329     return nil;
330 }
331
332 - (NSString *)selectedStylesheetSet
333 {
334     return nil;
335 }
336
337 - (void)setSelectedStylesheetSet:(NSString *)newSelectedStylesheetSet
338 {
339 }
340
341 - (DOMElement *)activeElement
342 {
343     WebCore::JSMainThreadNullState state;
344     return kit(WTF::getPtr(IMPL->activeElement()));
345 }
346
347 - (NSString *)compatMode
348 {
349     WebCore::JSMainThreadNullState state;
350     return IMPL->compatMode();
351 }
352
353 #if ENABLE(FULLSCREEN_API)
354
355 - (BOOL)webkitIsFullScreen
356 {
357     WebCore::JSMainThreadNullState state;
358     return IMPL->webkitIsFullScreen();
359 }
360
361 - (BOOL)webkitFullScreenKeyboardInputAllowed
362 {
363     WebCore::JSMainThreadNullState state;
364     return IMPL->webkitFullScreenKeyboardInputAllowed();
365 }
366
367 - (DOMElement *)webkitCurrentFullScreenElement
368 {
369     WebCore::JSMainThreadNullState state;
370     return kit(WTF::getPtr(IMPL->webkitCurrentFullScreenElementForBindings()));
371 }
372
373 - (BOOL)webkitFullscreenEnabled
374 {
375     WebCore::JSMainThreadNullState state;
376     return IMPL->webkitFullscreenEnabled();
377 }
378
379 - (DOMElement *)webkitFullscreenElement
380 {
381     WebCore::JSMainThreadNullState state;
382     return kit(WTF::getPtr(IMPL->webkitFullscreenElementForBindings()));
383 }
384
385 #endif
386
387 - (NSString *)visibilityState
388 {
389     WebCore::JSMainThreadNullState state;
390     switch (IMPL->visibilityState()) {
391     case WebCore::VisibilityState::Hidden:
392         return @"hidden";
393     case WebCore::VisibilityState::Visible:
394         return @"visible";
395     case WebCore::VisibilityState::Prerender:
396         return @"prerender";
397     }
398 }
399
400 - (BOOL)hidden
401 {
402     WebCore::JSMainThreadNullState state;
403     return IMPL->hidden();
404 }
405
406 - (DOMHTMLScriptElement *)currentScript
407 {
408     WebCore::JSMainThreadNullState state;
409     return kit(WTF::getPtr(IMPL->currentScript()));
410 }
411
412 - (NSString *)origin
413 {
414     WebCore::JSMainThreadNullState state;
415     return IMPL->origin();
416 }
417
418 - (DOMElement *)scrollingElement
419 {
420     WebCore::JSMainThreadNullState state;
421     return kit(WTF::getPtr(IMPL->scrollingElementForAPI()));
422 }
423
424 - (DOMHTMLCollection *)children
425 {
426     WebCore::JSMainThreadNullState state;
427     return kit(WTF::getPtr(IMPL->children()));
428 }
429
430 - (DOMElement *)firstElementChild
431 {
432     WebCore::JSMainThreadNullState state;
433     return kit(WTF::getPtr(IMPL->firstElementChild()));
434 }
435
436 - (DOMElement *)lastElementChild
437 {
438     WebCore::JSMainThreadNullState state;
439     return kit(WTF::getPtr(IMPL->lastElementChild()));
440 }
441
442 - (unsigned)childElementCount
443 {
444     WebCore::JSMainThreadNullState state;
445     return IMPL->childElementCount();
446 }
447
448 - (DOMElement *)createElement:(NSString *)tagName
449 {
450     WebCore::JSMainThreadNullState state;
451     return kit(raiseOnDOMError(IMPL->createElementForBindings(tagName)).ptr());
452 }
453
454 - (DOMDocumentFragment *)createDocumentFragment
455 {
456     WebCore::JSMainThreadNullState state;
457     return kit(WTF::getPtr(IMPL->createDocumentFragment()));
458 }
459
460 - (DOMText *)createTextNode:(NSString *)data
461 {
462     WebCore::JSMainThreadNullState state;
463     return kit(WTF::getPtr(IMPL->createTextNode(data)));
464 }
465
466 - (DOMComment *)createComment:(NSString *)data
467 {
468     WebCore::JSMainThreadNullState state;
469     return kit(WTF::getPtr(IMPL->createComment(data)));
470 }
471
472 - (DOMCDATASection *)createCDATASection:(NSString *)data
473 {
474     WebCore::JSMainThreadNullState state;
475     return kit(raiseOnDOMError(IMPL->createCDATASection(data)).ptr());
476 }
477
478 - (DOMProcessingInstruction *)createProcessingInstruction:(NSString *)target data:(NSString *)data
479 {
480     WebCore::JSMainThreadNullState state;
481     return kit(raiseOnDOMError(IMPL->createProcessingInstruction(target, data)).ptr());
482 }
483
484 - (DOMAttr *)createAttribute:(NSString *)name
485 {
486     WebCore::JSMainThreadNullState state;
487     return kit(raiseOnDOMError(IMPL->createAttribute(name)).ptr());
488 }
489
490 - (DOMEntityReference *)createEntityReference:(NSString *)name
491 {
492     UNUSED_PARAM(name);
493     raiseNotSupportedErrorException();
494 }
495
496 - (DOMNodeList *)getElementsByTagName:(NSString *)tagname
497 {
498     if (!tagname)
499         return nullptr;
500
501     WebCore::JSMainThreadNullState state;
502     return kit(static_cast<WebCore::NodeList*>(WTF::getPtr(IMPL->getElementsByTagName(tagname))));
503 }
504
505 - (DOMNode *)importNode:(DOMNode *)importedNode deep:(BOOL)deep
506 {
507     WebCore::JSMainThreadNullState state;
508     if (!importedNode)
509         raiseTypeErrorException();
510     return kit(raiseOnDOMError(IMPL->importNode(*core(importedNode), deep)).ptr());
511 }
512
513 - (DOMElement *)createElementNS:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
514 {
515     WebCore::JSMainThreadNullState state;
516     return kit(raiseOnDOMError(IMPL->createElementNS(namespaceURI, qualifiedName)).ptr());
517 }
518
519 - (DOMAttr *)createAttributeNS:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
520 {
521     WebCore::JSMainThreadNullState state;
522     return kit(raiseOnDOMError(IMPL->createAttributeNS(namespaceURI, qualifiedName)).ptr());
523 }
524
525 - (DOMNodeList *)getElementsByTagNameNS:(NSString *)namespaceURI localName:(NSString *)localName
526 {
527     if (!localName)
528         return nullptr;
529     WebCore::JSMainThreadNullState state;
530     return kit(static_cast<WebCore::NodeList*>(WTF::getPtr(IMPL->getElementsByTagNameNS(namespaceURI, localName))));
531 }
532
533 - (DOMNode *)adoptNode:(DOMNode *)source
534 {
535     WebCore::JSMainThreadNullState state;
536     if (!source)
537         raiseTypeErrorException();
538     return kit(raiseOnDOMError(IMPL->adoptNode(*core(source))).ptr());
539 }
540
541 - (DOMEvent *)createEvent:(NSString *)eventType
542 {
543     WebCore::JSMainThreadNullState state;
544     return kit(raiseOnDOMError(IMPL->createEvent(eventType)).ptr());
545 }
546
547 - (DOMRange *)createRange
548 {
549     WebCore::JSMainThreadNullState state;
550     return kit(WTF::getPtr(IMPL->createRange()));
551 }
552
553 - (DOMNodeIterator *)createNodeIterator:(DOMNode *)root whatToShow:(unsigned)whatToShow filter:(id <DOMNodeFilter>)filter expandEntityReferences:(BOOL)expandEntityReferences
554 {
555     WebCore::JSMainThreadNullState state;
556     if (!root)
557         raiseTypeErrorException();
558     RefPtr<WebCore::NodeFilter> nativeNodeFilter;
559     if (filter)
560         nativeNodeFilter = WebCore::NativeNodeFilter::create(IMPL, WebCore::ObjCNodeFilterCondition::create(filter));
561     return kit(WTF::getPtr(IMPL->createNodeIterator(*core(root), whatToShow, WTF::getPtr(nativeNodeFilter), expandEntityReferences)));
562 }
563
564 - (DOMTreeWalker *)createTreeWalker:(DOMNode *)root whatToShow:(unsigned)whatToShow filter:(id <DOMNodeFilter>)filter expandEntityReferences:(BOOL)expandEntityReferences
565 {
566     WebCore::JSMainThreadNullState state;
567     if (!root)
568         raiseTypeErrorException();
569     RefPtr<WebCore::NodeFilter> nativeNodeFilter;
570     if (filter)
571         nativeNodeFilter = WebCore::NativeNodeFilter::create(IMPL, WebCore::ObjCNodeFilterCondition::create(filter));
572     return kit(WTF::getPtr(IMPL->createTreeWalker(*core(root), whatToShow, WTF::getPtr(nativeNodeFilter), expandEntityReferences)));
573 }
574
575 - (DOMCSSStyleDeclaration *)getOverrideStyle:(DOMElement *)element pseudoElement:(NSString *)pseudoElement
576 {
577     WebCore::JSMainThreadNullState state;
578     return kit(WTF::getPtr(IMPL->getOverrideStyle(core(element), pseudoElement)));
579 }
580
581 static RefPtr<WebCore::XPathNSResolver> wrap(id <DOMXPathNSResolver> resolver)
582 {
583     if (!resolver)
584         return nullptr;
585     if ([resolver isMemberOfClass:[DOMNativeXPathNSResolver class]])
586         return core(static_cast<DOMNativeXPathNSResolver *>(resolver));
587     return DOMCustomXPathNSResolver::create(resolver);
588 }
589
590 - (DOMXPathExpression *)createExpression:(NSString *)expression resolver:(id <DOMXPathNSResolver>)resolver
591 {
592     WebCore::JSMainThreadNullState state;
593     return kit(raiseOnDOMError(IMPL->createExpression(expression, wrap(resolver))).ptr());
594 }
595
596 - (id <DOMXPathNSResolver>)createNSResolver:(DOMNode *)nodeResolver
597 {
598     WebCore::JSMainThreadNullState state;
599     return kit(WTF::getPtr(IMPL->createNSResolver(core(nodeResolver))));
600 }
601
602 - (DOMXPathResult *)evaluate:(NSString *)expression contextNode:(DOMNode *)contextNode resolver:(id <DOMXPathNSResolver>)resolver type:(unsigned short)type inResult:(DOMXPathResult *)inResult
603 {
604     WebCore::JSMainThreadNullState state;
605     return kit(raiseOnDOMError(IMPL->evaluate(expression, core(contextNode), wrap(resolver), type, core(inResult))).ptr());
606 }
607
608 - (BOOL)execCommand:(NSString *)command userInterface:(BOOL)userInterface value:(NSString *)value
609 {
610     WebCore::JSMainThreadNullState state;
611     return IMPL->execCommand(command, userInterface, value);
612 }
613
614 - (BOOL)execCommand:(NSString *)command userInterface:(BOOL)userInterface
615 {
616     return [self execCommand:command userInterface:userInterface value:nullptr];
617 }
618
619 - (BOOL)execCommand:(NSString *)command
620 {
621     return [self execCommand:command userInterface:NO value:nullptr];
622 }
623
624 - (BOOL)queryCommandEnabled:(NSString *)command
625 {
626     WebCore::JSMainThreadNullState state;
627     return IMPL->queryCommandEnabled(command);
628 }
629
630 - (BOOL)queryCommandIndeterm:(NSString *)command
631 {
632     WebCore::JSMainThreadNullState state;
633     return IMPL->queryCommandIndeterm(command);
634 }
635
636 - (BOOL)queryCommandState:(NSString *)command
637 {
638     WebCore::JSMainThreadNullState state;
639     return IMPL->queryCommandState(command);
640 }
641
642 - (BOOL)queryCommandSupported:(NSString *)command
643 {
644     WebCore::JSMainThreadNullState state;
645     return IMPL->queryCommandSupported(command);
646 }
647
648 - (NSString *)queryCommandValue:(NSString *)command
649 {
650     WebCore::JSMainThreadNullState state;
651     return IMPL->queryCommandValue(command);
652 }
653
654 - (DOMNodeList *)getElementsByName:(NSString *)elementName
655 {
656     WebCore::JSMainThreadNullState state;
657     return kit(WTF::getPtr(IMPL->getElementsByName(elementName)));
658 }
659
660 - (DOMElement *)elementFromPoint:(int)x y:(int)y
661 {
662     WebCore::JSMainThreadNullState state;
663     return kit(WTF::getPtr(IMPL->elementFromPoint(x, y)));
664 }
665
666 - (DOMRange *)caretRangeFromPoint:(int)x y:(int)y
667 {
668     WebCore::JSMainThreadNullState state;
669     return kit(WTF::getPtr(IMPL->caretRangeFromPoint(x, y)));
670 }
671
672 - (DOMCSSStyleDeclaration *)createCSSStyleDeclaration
673 {
674     WebCore::JSMainThreadNullState state;
675     return kit(WTF::getPtr(IMPL->createCSSStyleDeclaration()));
676 }
677
678 - (DOMCSSStyleDeclaration *)getComputedStyle:(DOMElement *)element pseudoElement:(NSString *)pseudoElement
679 {
680     WebCore::JSMainThreadNullState state;
681     if (!element)
682         raiseTypeErrorException();
683     WebCore::DOMWindow* dv = IMPL->domWindow();
684     if (!dv)
685         return nil;
686     return kit(WTF::getPtr(dv->getComputedStyle(*core(element), pseudoElement)));
687 }
688
689 - (DOMCSSRuleList *)getMatchedCSSRules:(DOMElement *)element pseudoElement:(NSString *)pseudoElement
690 {
691     return [self getMatchedCSSRules:element pseudoElement:pseudoElement authorOnly:YES];
692 }
693
694 - (DOMCSSRuleList *)getMatchedCSSRules:(DOMElement *)element pseudoElement:(NSString *)pseudoElement authorOnly:(BOOL)authorOnly
695 {
696     WebCore::JSMainThreadNullState state;
697     WebCore::DOMWindow* dv = IMPL->domWindow();
698     if (!dv)
699         return nil;
700     return kit(WTF::getPtr(dv->getMatchedCSSRules(core(element), pseudoElement, authorOnly)));
701 }
702
703 - (DOMNodeList *)getElementsByClassName:(NSString *)classNames
704 {
705     WebCore::JSMainThreadNullState state;
706     return kit(static_cast<WebCore::NodeList*>(WTF::getPtr(IMPL->getElementsByClassName(classNames))));
707 }
708
709 - (BOOL)hasFocus
710 {
711     WebCore::JSMainThreadNullState state;
712     return IMPL->hasFocus();
713 }
714
715 #if ENABLE(FULLSCREEN_API)
716
717 - (void)webkitCancelFullScreen
718 {
719     WebCore::JSMainThreadNullState state;
720     IMPL->webkitCancelFullScreen();
721 }
722
723 - (void)webkitExitFullscreen
724 {
725     WebCore::JSMainThreadNullState state;
726     IMPL->webkitExitFullscreen();
727 }
728
729 #endif
730
731 - (DOMElement *)getElementById:(NSString *)elementId
732 {
733     WebCore::JSMainThreadNullState state;
734     return kit(WTF::getPtr(IMPL->getElementById(AtomicString(elementId))));
735 }
736
737 - (DOMElement *)querySelector:(NSString *)selectors
738 {
739     WebCore::JSMainThreadNullState state;
740     return kit(raiseOnDOMError(IMPL->querySelector(selectors)));
741 }
742
743 - (DOMNodeList *)querySelectorAll:(NSString *)selectors
744 {
745     WebCore::JSMainThreadNullState state;
746     return kit(raiseOnDOMError(IMPL->querySelectorAll(selectors)).ptr());
747 }
748
749 @end
750
751 @implementation DOMDocument (DOMDocumentDeprecated)
752
753 - (DOMProcessingInstruction *)createProcessingInstruction:(NSString *)target :(NSString *)data
754 {
755     return [self createProcessingInstruction:target data:data];
756 }
757
758 - (DOMNode *)importNode:(DOMNode *)importedNode :(BOOL)deep
759 {
760     return [self importNode:importedNode deep:deep];
761 }
762
763 - (DOMElement *)createElementNS:(NSString *)namespaceURI :(NSString *)qualifiedName
764 {
765     return [self createElementNS:namespaceURI qualifiedName:qualifiedName];
766 }
767
768 - (DOMAttr *)createAttributeNS:(NSString *)namespaceURI :(NSString *)qualifiedName
769 {
770     return [self createAttributeNS:namespaceURI qualifiedName:qualifiedName];
771 }
772
773 - (DOMNodeList *)getElementsByTagNameNS:(NSString *)namespaceURI :(NSString *)localName
774 {
775     return [self getElementsByTagNameNS:namespaceURI localName:localName];
776 }
777
778 - (DOMNodeIterator *)createNodeIterator:(DOMNode *)root :(unsigned)whatToShow :(id <DOMNodeFilter>)filter :(BOOL)expandEntityReferences
779 {
780     return [self createNodeIterator:root whatToShow:whatToShow filter:filter expandEntityReferences:expandEntityReferences];
781 }
782
783 - (DOMTreeWalker *)createTreeWalker:(DOMNode *)root :(unsigned)whatToShow :(id <DOMNodeFilter>)filter :(BOOL)expandEntityReferences
784 {
785     return [self createTreeWalker:root whatToShow:whatToShow filter:filter expandEntityReferences:expandEntityReferences];
786 }
787
788 - (DOMCSSStyleDeclaration *)getOverrideStyle:(DOMElement *)element :(NSString *)pseudoElement
789 {
790     return [self getOverrideStyle:element pseudoElement:pseudoElement];
791 }
792
793 - (DOMXPathExpression *)createExpression:(NSString *)expression :(id <DOMXPathNSResolver>)resolver
794 {
795     return [self createExpression:expression resolver:resolver];
796 }
797
798 - (DOMXPathResult *)evaluate:(NSString *)expression :(DOMNode *)contextNode :(id <DOMXPathNSResolver>)resolver :(unsigned short)type :(DOMXPathResult *)inResult
799 {
800     return [self evaluate:expression contextNode:contextNode resolver:resolver type:type inResult:inResult];
801 }
802
803 - (DOMCSSStyleDeclaration *)getComputedStyle:(DOMElement *)element :(NSString *)pseudoElement
804 {
805     return [self getComputedStyle:element pseudoElement:pseudoElement];
806 }
807
808 @end
809
810 WebCore::Document* core(DOMDocument *wrapper)
811 {
812     return wrapper ? reinterpret_cast<WebCore::Document*>(wrapper->_internal) : 0;
813 }
814
815 DOMDocument *kit(WebCore::Document* value)
816 {
817     WebCoreThreadViolationCheckRoundOne();
818     return static_cast<DOMDocument*>(kit(static_cast<WebCore::Node*>(value)));
819 }