/* * Copyright (C) 2009 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "public/web/WebDocument.h" #include "bindings/v8/Dictionary.h" #include "bindings/v8/ExceptionState.h" #include "bindings/v8/ScriptState.h" #include "bindings/v8/ScriptValue.h" #include "core/accessibility/AXObjectCache.h" #include "core/css/CSSParserMode.h" #include "core/css/StyleSheetContents.h" #include "core/dom/CSSSelectorWatch.h" #include "core/dom/Document.h" #include "core/dom/DocumentType.h" #include "core/dom/Element.h" #include "core/dom/FullscreenElementStack.h" #include "core/dom/NodeList.h" #include "core/dom/StyleEngine.h" #include "core/html/HTMLAllCollection.h" #include "core/html/HTMLBodyElement.h" #include "core/html/HTMLCollection.h" #include "core/html/HTMLElement.h" #include "core/html/HTMLFormElement.h" #include "core/html/HTMLHeadElement.h" #include "core/loader/DocumentLoader.h" #include "core/rendering/RenderObject.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/WebURL.h" #include "public/web/WebAXObject.h" #include "public/web/WebDOMEvent.h" #include "public/web/WebDocumentType.h" #include "public/web/WebElement.h" #include "public/web/WebElementCollection.h" #include "public/web/WebFormElement.h" #include "public/web/WebNodeList.h" #include "web/WebLocalFrameImpl.h" #include "wtf/PassRefPtr.h" #include using namespace WebCore; namespace blink { WebURL WebDocument::url() const { return constUnwrap()->url(); } WebSecurityOrigin WebDocument::securityOrigin() const { if (!constUnwrap()) return WebSecurityOrigin(); return WebSecurityOrigin(constUnwrap()->securityOrigin()); } WebString WebDocument::encoding() const { return constUnwrap()->encodingName(); } WebString WebDocument::contentLanguage() const { return constUnwrap()->contentLanguage(); } WebString WebDocument::referrer() const { return constUnwrap()->referrer(); } WebURL WebDocument::openSearchDescriptionURL() const { return const_cast(constUnwrap())->openSearchDescriptionURL(); } WebLocalFrame* WebDocument::frame() const { return WebLocalFrameImpl::fromFrame(constUnwrap()->frame()); } bool WebDocument::isHTMLDocument() const { return constUnwrap()->isHTMLDocument(); } bool WebDocument::isXHTMLDocument() const { return constUnwrap()->isXHTMLDocument(); } bool WebDocument::isPluginDocument() const { return constUnwrap()->isPluginDocument(); } WebURL WebDocument::baseURL() const { return constUnwrap()->baseURL(); } WebURL WebDocument::firstPartyForCookies() const { return constUnwrap()->firstPartyForCookies(); } WebElement WebDocument::documentElement() const { return WebElement(constUnwrap()->documentElement()); } WebElement WebDocument::body() const { return WebElement(constUnwrap()->body()); } WebElement WebDocument::head() { return WebElement(unwrap()->head()); } WebString WebDocument::title() const { return WebString(constUnwrap()->title()); } WebElementCollection WebDocument::all() { return WebElementCollection(unwrap()->all()); } void WebDocument::images(WebVector& results) { RefPtr images = unwrap()->images(); size_t sourceLength = images->length(); Vector temp; temp.reserveCapacity(sourceLength); for (size_t i = 0; i < sourceLength; ++i) { Element* element = images->item(i); if (element && element->isHTMLElement()) temp.append(WebElement(element)); } results.assign(temp); } void WebDocument::forms(WebVector& results) const { RefPtr forms = const_cast(constUnwrap())->forms(); size_t sourceLength = forms->length(); Vector temp; temp.reserveCapacity(sourceLength); for (size_t i = 0; i < sourceLength; ++i) { Element* element = forms->item(i); // Strange but true, sometimes node can be 0. if (element && element->isHTMLElement()) temp.append(WebFormElement(toHTMLFormElement(element))); } results.assign(temp); } WebURL WebDocument::completeURL(const WebString& partialURL) const { return constUnwrap()->completeURL(partialURL); } WebElement WebDocument::getElementById(const WebString& id) const { return WebElement(constUnwrap()->getElementById(id)); } WebElement WebDocument::focusedElement() const { return WebElement(constUnwrap()->focusedElement()); } WebDocumentType WebDocument::doctype() const { return WebDocumentType(constUnwrap()->doctype()); } void WebDocument::insertStyleSheet(const WebString& sourceCode) { RefPtr document = unwrap(); ASSERT(document); RefPtrWillBeRawPtr parsedSheet = StyleSheetContents::create(CSSParserContext(*document.get(), 0)); parsedSheet->parseString(sourceCode); document->styleEngine()->addAuthorSheet(parsedSheet); } void WebDocument::watchCSSSelectors(const WebVector& webSelectors) { RefPtr document = unwrap(); Vector selectors; selectors.append(webSelectors.data(), webSelectors.size()); CSSSelectorWatch::from(*document).watchCSSSelectors(selectors); } void WebDocument::cancelFullScreen() { if (FullscreenElementStack* fullscreen = FullscreenElementStack::fromIfExists(*unwrap())) fullscreen->webkitCancelFullScreen(); } WebElement WebDocument::fullScreenElement() const { Element* fullScreenElement = 0; if (FullscreenElementStack* fullscreen = FullscreenElementStack::fromIfExists(*const_cast(this)->unwrap())) fullScreenElement = fullscreen->webkitCurrentFullScreenElement(); return WebElement(fullScreenElement); } WebDOMEvent WebDocument::createEvent(const WebString& eventType) { TrackExceptionState exceptionState; WebDOMEvent event(unwrap()->createEvent(eventType, exceptionState)); if (exceptionState.hadException()) return WebDOMEvent(); return event; } WebReferrerPolicy WebDocument::referrerPolicy() const { return static_cast(constUnwrap()->referrerPolicy()); } WebElement WebDocument::createElement(const WebString& tagName) { TrackExceptionState exceptionState; WebElement element(unwrap()->createElement(tagName, exceptionState)); if (exceptionState.hadException()) return WebElement(); return element; } WebAXObject WebDocument::accessibilityObject() const { const Document* document = constUnwrap(); return WebAXObject(document->axObjectCache()->getOrCreate(document->renderer())); } WebAXObject WebDocument::accessibilityObjectFromID(int axID) const { const Document* document = constUnwrap(); return WebAXObject(document->axObjectCache()->objectFromAXID(axID)); } WebVector WebDocument::draggableRegions() const { WebVector draggableRegions; const Document* document = constUnwrap(); if (document->hasAnnotatedRegions()) { const Vector& regions = document->annotatedRegions(); draggableRegions = WebVector(regions.size()); for (size_t i = 0; i < regions.size(); i++) { const AnnotatedRegionValue& value = regions[i]; draggableRegions[i].draggable = value.draggable; draggableRegions[i].bounds = WebCore::IntRect(value.bounds); } } return draggableRegions; } v8::Handle WebDocument::registerEmbedderCustomElement(const WebString& name, v8::Handle options, WebExceptionCode& ec) { v8::Isolate* isolate = v8::Isolate::GetCurrent(); Document* document = unwrap(); Dictionary dictionary(options, isolate); TrackExceptionState exceptionState; ScriptValue constructor = document->registerElement(ScriptState::current(isolate), name, dictionary, exceptionState, CustomElement::EmbedderNames); ec = exceptionState.code(); if (exceptionState.hadException()) return v8::Handle(); return constructor.v8Value(); } WebDocument::WebDocument(const PassRefPtr& elem) : WebNode(elem) { } WebDocument& WebDocument::operator=(const PassRefPtr& elem) { m_private = elem; return *this; } WebDocument::operator PassRefPtr() const { return toDocument(m_private.get()); } } // namespace blink