/* * 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 "public/web/WebDocument.h" #include "bindings/core/v8/ExceptionState.h" #include "bindings/core/v8/ScriptState.h" #include "bindings/core/v8/ScriptValue.h" #include "bindings/core/v8/V8ElementRegistrationOptions.h" #include "core/css/StyleSheetContents.h" #include "core/dom/CSSSelectorWatch.h" #include "core/dom/Document.h" #include "core/dom/DocumentStatisticsCollector.h" #include "core/dom/DocumentType.h" #include "core/dom/Element.h" #include "core/dom/Fullscreen.h" #include "core/dom/StyleEngine.h" #include "core/events/Event.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/html/HTMLLinkElement.h" #include "core/layout/LayoutObject.h" #include "core/layout/LayoutView.h" #include "core/loader/DocumentLoader.h" #include "modules/accessibility/AXObject.h" #include "modules/accessibility/AXObjectCacheImpl.h" #include "platform/weborigin/SecurityOrigin.h" #include "public/platform/WebDistillability.h" #include "public/platform/WebURL.h" #include "public/web/WebAXObject.h" #include "public/web/WebDOMEvent.h" #include "public/web/WebElement.h" #include "public/web/WebElementCollection.h" #include "public/web/WebFormElement.h" #include "web/WebLocalFrameImpl.h" #include "wtf/PassRefPtr.h" #include namespace blink { WebURL WebDocument::url() const { return constUnwrap()->url(); } WebSecurityOrigin WebDocument::securityOrigin() const { if (!constUnwrap()) return WebSecurityOrigin(); return WebSecurityOrigin(constUnwrap()->securityOrigin()); } bool WebDocument::isSecureContext(WebString& errorMessage) const { const Document* document = constUnwrap(); if (!document) return false; String message; bool result = document->isSecureContext(message); errorMessage = message; return result; } WebString WebDocument::encoding() const { return constUnwrap()->encodingName(); } WebString WebDocument::contentLanguage() const { return constUnwrap()->contentLanguage(); } WebString WebDocument::referrer() const { return constUnwrap()->referrer(); } WebColor WebDocument::themeColor() const { return constUnwrap()->themeColor().rgb(); } 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()); } WebString WebDocument::contentAsTextForTesting() const { if (Element* documentElement = constUnwrap()->documentElement()) return WebString(documentElement->innerText()); return WebString(); } WebElementCollection WebDocument::all() { return WebElementCollection(unwrap()->all()); } void WebDocument::forms(WebVector& results) const { RefPtrWillBeRawPtr 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()); } void WebDocument::insertStyleSheet(const WebString& sourceCode) { RefPtrWillBeRawPtr document = unwrap(); ASSERT(document); RefPtrWillBeRawPtr parsedSheet = StyleSheetContents::create(CSSParserContext(*document, 0)); parsedSheet->parseString(sourceCode); document->styleEngine().injectAuthorSheet(parsedSheet); } void WebDocument::watchCSSSelectors(const WebVector& webSelectors) { RefPtrWillBeRawPtr document = unwrap(); CSSSelectorWatch* watch = CSSSelectorWatch::fromIfExists(*document); if (!watch && webSelectors.isEmpty()) return; Vector selectors; selectors.append(webSelectors.data(), webSelectors.size()); CSSSelectorWatch::from(*document).watchCSSSelectors(selectors); } void WebDocument::cancelFullScreen() { Fullscreen::fullyExitFullscreen(*unwrap()); } WebElement WebDocument::fullScreenElement() const { Element* fullScreenElement = 0; if (Fullscreen* fullscreen = Fullscreen::fromIfExists(*const_cast(this)->unwrap())) fullScreenElement = fullscreen->webkitCurrentFullScreenElement(); return WebElement(fullScreenElement); } WebReferrerPolicy WebDocument::referrerPolicy() const { return static_cast(constUnwrap()->referrerPolicy()); } WebString WebDocument::outgoingReferrer() { return WebString(unwrap()->outgoingReferrer()); } WebAXObject WebDocument::accessibilityObject() const { const Document* document = constUnwrap(); AXObjectCacheImpl* cache = toAXObjectCacheImpl(document->axObjectCache()); return cache ? WebAXObject(cache->getOrCreate(document->layoutView())) : WebAXObject(); } WebAXObject WebDocument::accessibilityObjectFromID(int axID) const { const Document* document = constUnwrap(); AXObjectCacheImpl* cache = toAXObjectCacheImpl(document->axObjectCache()); return cache ? WebAXObject(cache->objectFromAXID(axID)) : WebAXObject(); } 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 = IntRect(value.bounds); } } return draggableRegions; } v8::Local WebDocument::registerEmbedderCustomElement(const WebString& name, v8::Local options, WebExceptionCode& ec) { v8::Isolate* isolate = v8::Isolate::GetCurrent(); Document* document = unwrap(); TrackExceptionState exceptionState; ElementRegistrationOptions registrationOptions; V8ElementRegistrationOptions::toImpl(isolate, options, registrationOptions, exceptionState); if (exceptionState.hadException()) return v8::Local(); ScriptValue constructor = document->registerElement(ScriptState::current(isolate), name, registrationOptions, exceptionState, CustomElement::EmbedderNames); ec = exceptionState.code(); if (exceptionState.hadException()) return v8::Local(); return constructor.v8Value(); } WebURL WebDocument::manifestURL() const { const Document* document = constUnwrap(); HTMLLinkElement* linkElement = document->linkManifest(); if (!linkElement) return WebURL(); return linkElement->href(); } bool WebDocument::manifestUseCredentials() const { const Document* document = constUnwrap(); HTMLLinkElement* linkElement = document->linkManifest(); if (!linkElement) return false; return equalIgnoringCase(linkElement->fastGetAttribute(HTMLNames::crossoriginAttr), "use-credentials"); } WebDistillabilityFeatures WebDocument::distillabilityFeatures() { return DocumentStatisticsCollector::collectStatistics(*unwrap()); } bool WebDocument::attemptedToDetermineEncodingFromContentSniffing() const { const Document* document = constUnwrap(); return document->attemptedToDetermineEncodingFromContentSniffing(); } bool WebDocument::encodingWasDetectedFromContentSniffing() const { const Document* document = constUnwrap(); return document->encodingWasDetectedFromContentSniffing(); } WebDocument::WebDocument(const PassRefPtrWillBeRawPtr& elem) : WebNode(elem) { } DEFINE_WEB_NODE_TYPE_CASTS(WebDocument, constUnwrap()->isDocumentNode()); WebDocument& WebDocument::operator=(const PassRefPtrWillBeRawPtr& elem) { m_private = elem; return *this; } WebDocument::operator PassRefPtrWillBeRawPtr() const { return toDocument(m_private.get()); } } // namespace blink