15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocument.h"
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/Dictionary.h"
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptState.h"
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptValue.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheetContents.h"
401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/CSSSelectorWatch.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentType.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
449e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/dom/Fullscreen.h"
459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/dom/StyleEngine.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLAllCollection.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLBodyElement.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCollection.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLElement.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLHeadElement.h"
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/HTMLLinkElement.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
55d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/rendering/RenderView.h"
5651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h"
578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "public/platform/WebURL.h"
58f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebAXObject.h"
59f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDOMEvent.h"
60f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocumentType.h"
61f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebElement.h"
62f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebElementCollection.h"
63f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFormElement.h"
64f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNodeList.h"
65f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "wtf/PassRefPtr.h"
67e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include <v8.h>
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebURL WebDocument::url() const
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->url();
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebSecurityOrigin WebDocument::securityOrigin() const
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!constUnwrap<Document>())
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebSecurityOrigin();
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebSecurityOrigin(constUnwrap<Document>()->securityOrigin());
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebDocument::encoding() const
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
85c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return constUnwrap<Document>()->encodingName();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebDocument::contentLanguage() const
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->contentLanguage();
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)WebString WebDocument::referrer() const
94f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
95f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return constUnwrap<Document>()->referrer();
96f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
97f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
98197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebColor WebDocument::themeColor() const
995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return constUnwrap<Document>()->themeColor().rgb();
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebURL WebDocument::openSearchDescriptionURL() const
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return const_cast<Document*>(constUnwrap<Document>())->openSearchDescriptionURL();
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
108a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochWebLocalFrame* WebDocument::frame() const
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return WebLocalFrameImpl::fromFrame(constUnwrap<Document>()->frame());
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebDocument::isHTMLDocument() const
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->isHTMLDocument();
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebDocument::isXHTMLDocument() const
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->isXHTMLDocument();
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebDocument::isPluginDocument() const
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->isPluginDocument();
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebURL WebDocument::baseURL() const
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->baseURL();
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebURL WebDocument::firstPartyForCookies() const
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->firstPartyForCookies();
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebDocument::documentElement() const
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebElement(constUnwrap<Document>()->documentElement());
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebDocument::body() const
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebElement(constUnwrap<Document>()->body());
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebDocument::head()
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebElement(unwrap<Document>()->head());
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebDocument::title() const
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebString(constUnwrap<Document>()->title());
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebElementCollection WebDocument::all()
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return WebElementCollection(unwrap<Document>()->all());
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDocument::images(WebVector<WebElement>& results)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
165d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLCollection> images = unwrap<Document>()->images();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t sourceLength = images->length();
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<WebElement> temp;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    temp.reserveCapacity(sourceLength);
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < sourceLength; ++i) {
17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        Element* element = images->item(i);
17109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (element && element->isHTMLElement())
17209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            temp.append(WebElement(element));
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    results.assign(temp);
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDocument::forms(WebVector<WebFormElement>& results) const
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
179d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLCollection> forms = const_cast<Document*>(constUnwrap<Document>())->forms();
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t sourceLength = forms->length();
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<WebFormElement> temp;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    temp.reserveCapacity(sourceLength);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < sourceLength; ++i) {
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        Element* element = forms->item(i);
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Strange but true, sometimes node can be 0.
18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (element && element->isHTMLElement())
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            temp.append(WebFormElement(toHTMLFormElement(element)));
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    results.assign(temp);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebURL WebDocument::completeURL(const WebString& partialURL) const
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return constUnwrap<Document>()->completeURL(partialURL);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebDocument::getElementById(const WebString& id) const
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebElement(constUnwrap<Document>()->getElementById(id));
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
202d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)WebElement WebDocument::focusedElement() const
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
204d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebElement(constUnwrap<Document>()->focusedElement());
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDocumentType WebDocument::doctype() const
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebDocumentType(constUnwrap<Document>()->doctype());
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void WebDocument::insertStyleSheet(const WebString& sourceCode)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
214d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Document> document = unwrap<Document>();
2158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(document);
216d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<StyleSheetContents> parsedSheet = StyleSheetContents::create(CSSParserContext(*document, 0));
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parsedSheet->parseString(sourceCode);
21851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    document->styleEngine()->addAuthorSheet(parsedSheet);
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void WebDocument::watchCSSSelectors(const WebVector<WebString>& webSelectors)
2221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
223d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Document> document = unwrap<Document>();
2241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    Vector<String> selectors;
2251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    selectors.append(webSelectors.data(), webSelectors.size());
2261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    CSSSelectorWatch::from(*document).watchCSSSelectors(selectors);
2271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
2281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebDocument::cancelFullScreen()
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2319e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    Fullscreen::fullyExitFullscreen(*unwrap<Document>());
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebDocument::fullScreenElement() const
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* fullScreenElement = 0;
2379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (Fullscreen* fullscreen = Fullscreen::fromIfExists(*const_cast<WebDocument*>(this)->unwrap<Document>()))
238521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        fullScreenElement = fullscreen->webkitCurrentFullScreenElement();
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebElement(fullScreenElement);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDOMEvent WebDocument::createEvent(const WebString& eventType)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
245f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WebDOMEvent event(unwrap<Document>()->createEvent(eventType, exceptionState));
24651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebDOMEvent();
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return event;
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebReferrerPolicy WebDocument::referrerPolicy() const
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebReferrerPolicy>(constUnwrap<Document>()->referrerPolicy());
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebDocument::createElement(const WebString& tagName)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
25951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebElement element(unwrap<Document>()->createElement(tagName, exceptionState));
26051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebElement();
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebSize WebDocument::scrollOffset() const
2667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (FrameView* view = constUnwrap<Document>()->view())
2687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return view->scrollOffset();
2697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return WebSize();
2707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebSize WebDocument::minimumScrollOffset() const
2737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (FrameView* view = constUnwrap<Document>()->view())
2757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return toIntSize(view->minimumScrollPosition());
2767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return WebSize();
2777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebSize WebDocument::maximumScrollOffset() const
2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
2817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (FrameView* view = constUnwrap<Document>()->view())
2827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return toIntSize(view->maximumScrollPosition());
2837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return WebSize();
2847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
2857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebDocument::setIsTransitionDocument()
287c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
288c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // This ensures the transition UA stylesheet gets applied.
289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    unwrap<Document>()->setIsTransitionDocument();
290c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
291c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
292c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void WebDocument::beginExitTransition(const WebString& cssSelector)
293c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
294c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RefPtrWillBeRawPtr<Document> document = unwrap<Document>();
295c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    document->hideTransitionElements(cssSelector);
296c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    document->styleEngine()->enableExitTransitionStylesheets();
297c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
298c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)WebAXObject WebDocument::accessibilityObject() const
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Document* document = constUnwrap<Document>();
3027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    AXObjectCache* cache = document->axObjectCache();
3037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return cache ? WebAXObject(cache->getOrCreate(document->renderView())) : WebAXObject();
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)WebAXObject WebDocument::accessibilityObjectFromID(int axID) const
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Document* document = constUnwrap<Document>();
3097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    AXObjectCache* cache = document->axObjectCache();
3107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return cache ? WebAXObject(cache->objectFromAXID(axID)) : WebAXObject();
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebVector<WebDraggableRegion> WebDocument::draggableRegions() const
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebVector<WebDraggableRegion> draggableRegions;
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Document* document = constUnwrap<Document>();
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (document->hasAnnotatedRegions()) {
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const Vector<AnnotatedRegionValue>& regions = document->annotatedRegions();
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        draggableRegions = WebVector<WebDraggableRegion>(regions.size());
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < regions.size(); i++) {
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const AnnotatedRegionValue& value = regions[i];
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            draggableRegions[i].draggable = value.draggable;
3239e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            draggableRegions[i].bounds = IntRect(value.bounds);
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return draggableRegions;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
329e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)v8::Handle<v8::Value> WebDocument::registerEmbedderCustomElement(const WebString& name, v8::Handle<v8::Value> options, WebExceptionCode& ec)
330e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
331a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    v8::Isolate* isolate = v8::Isolate::GetCurrent();
332e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Document* document = unwrap<Document>();
333a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    Dictionary dictionary(options, isolate);
33451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
335f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ScriptValue constructor = document->registerElement(ScriptState::current(isolate), name, dictionary, exceptionState, CustomElement::EmbedderNames);
33651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ec = exceptionState.code();
33751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
338e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return v8::Handle<v8::Value>();
339e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return constructor.v8Value();
340e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
341e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebURL WebDocument::manifestURL() const
3437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const Document* document = constUnwrap<Document>();
3457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    HTMLLinkElement* linkElement = document->linkManifest();
3467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!linkElement)
3477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return WebURL();
3487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return linkElement->href();
3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
3507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
351323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebDocument::WebDocument(const PassRefPtrWillBeRawPtr<Document>& elem)
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : WebNode(elem)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
356323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebDocument& WebDocument::operator=(const PassRefPtrWillBeRawPtr<Document>& elem)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private = elem;
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *this;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
362323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebDocument::operator PassRefPtrWillBeRawPtr<Document>() const
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
364591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return toDocument(m_private.get());
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
368