15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/Internals.h"
295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionMessages.h"
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptFunction.h"
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptPromise.h"
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptPromiseResolver.h"
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/SerializedScriptValue.h"
36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8ThrowException.h"
375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/InternalRuntimeFlags.h"
38d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/animation/AnimationTimeline.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/StyleSheetContents.h"
407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/css/resolver/StyleResolver.h"
4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/css/resolver/StyleResolverStats.h"
427757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/css/resolver/ViewportStyleResolver.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ClientRect.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ClientRectList.h"
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/dom/DOMPoint.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DOMStringList.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarker.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/dom/Iterator.h"
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/NodeRenderStyle.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/PseudoElement.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Range.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/StaticNodeList.h"
57197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/StyleEngine.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/TreeScope.h"
591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ViewportDescription.h"
60c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/dom/shadow/ComposedTreeWalker.h"
61e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ElementShadow.h"
62e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/SelectRuleFeatureSet.h"
63e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/Editor.h"
65f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/editing/PlainTextRange.h"
66e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/editing/SpellCheckRequester.h"
671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/editing/SpellChecker.h"
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/editing/SurroundingText.h"
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h"
70e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/MemoryCache.h"
71e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ResourceFetcher.h"
72323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/frame/EventHandlerRegistry.h"
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/FrameConsole.h"
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/FrameView.h"
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/LocalDOMWindow.h"
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/Settings.h"
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLContentElement.h"
7951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/html/HTMLIFrameElement.h"
8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
8107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "core/html/HTMLMediaElement.h"
829e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/html/HTMLPlugInElement.h"
8353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLSelectElement.h"
8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLTextAreaElement.h"
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/canvas/CanvasRenderingContext2D.h"
8606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/FormController.h"
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/shadow/PluginPlaceholderElement.h"
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/shadow/ShadowElementNames.h"
89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/shadow/TextControlInnerElements.h"
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/inspector/ConsoleMessageStorage.h"
9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorClient.h"
9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorConsoleAgent.h"
9353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorController.h"
9453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorCounters.h"
9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorFrontendChannel.h"
9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
9753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorOverlay.h"
9853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h"
9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/loader/HistoryItem.h"
10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
10253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/ChromeClient.h"
10353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/page/FocusController.h"
105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/page/NetworkStateNotifier.h"
10653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
107f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "core/page/PagePopupController.h"
10853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PrintContext.h"
109e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderMenuList.h"
11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTreeAsText.h"
11353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/CompositedLayerMapping.h"
115d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/rendering/compositing/RenderLayerCompositor.h"
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/testing/DictionaryTest.h"
117f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)#include "core/testing/GCObservation.h"
1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/InternalProfilers.h"
1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/InternalSettings.h"
1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/LayerRect.h"
1215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/LayerRectList.h"
1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/MockPagePopupDriver.h"
123197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/testing/PrivateScriptTest.h"
1245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/testing/TypeConversions.h"
12553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/workers/WorkerThread.h"
126a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/Cursor.h"
1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Language.h"
1285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
1291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
1301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h"
131f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/geometry/LayoutRect.h"
132a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
133a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FilterOperation.h"
134a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/FilterOperations.h"
13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SchemeRegistry.h"
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/Platform.h"
137d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "public/platform/WebConnectionType.h"
13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebGraphicsContext3D.h"
13909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebGraphicsContext3DProvider.h"
140e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "public/platform/WebLayer.h"
141a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "wtf/InstanceCounter.h"
14209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/PassOwnPtr.h"
14381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/dtoa.h"
14481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "wtf/text/StringBuffer.h"
145f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include <v8.h>
146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace {
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass InternalsIterator FINAL : public Iterator {
1527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccipublic:
1537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    InternalsIterator() : m_current(0) { }
1547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ScriptValue next(ScriptState* scriptState, ExceptionState& exceptionState) OVERRIDE
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        v8::Isolate* isolate = scriptState->isolate();
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        int value = m_current * m_current;
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_current >= 5)
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            return ScriptValue(scriptState, v8DoneIteratorResult(isolate));
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ++m_current;
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return ScriptValue(scriptState, v8IteratorResult(scriptState, value));
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual ScriptValue next(ScriptState* scriptState, ScriptValue value, ExceptionState& exceptionState) OVERRIDE
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        exceptionState.throwTypeError("Not implemented");
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return ScriptValue();
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprivate:
1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    int m_current;
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci};
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// FIXME: oilpan: These will be removed soon.
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static MockPagePopupDriver* s_pagePopupDriver = 0;
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool markerTypesFrom(const String& markerType, DocumentMarker::MarkerTypes& result)
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (markerType.isEmpty() || equalIgnoringCase(markerType, "all"))
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = DocumentMarker::AllMarkers();
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (equalIgnoringCase(markerType, "Spelling"))
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result =  DocumentMarker::Spelling;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (equalIgnoringCase(markerType, "Grammar"))
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result =  DocumentMarker::Grammar;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (equalIgnoringCase(markerType, "TextMatch"))
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result =  DocumentMarker::TextMatch;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
198e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)static SpellCheckRequester* spellCheckRequester(Document* document)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
200c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!document || !document->frame())
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return &document->frame()->spellChecker().spellCheckRequester();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char* Internals::internalsId = "internals";
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciInternals* Internals::create(Document* document)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return new Internals(document);
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Internals::~Internals()
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Internals::resetToConsistentState(Page* page)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(page);
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
220e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    page->setDeviceScaleFactor(1);
221bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    page->setIsCursorVisible(true);
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    page->setPageScaleFactor(1, IntPoint(0, 0));
223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    blink::overrideUserPreferredLanguages(Vector<AtomicString>());
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    delete s_pagePopupDriver;
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    s_pagePopupDriver = 0;
226e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    page->chrome().client().resetPagePopupDriver();
2275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!page->deprecatedLocalMainFrame()->spellChecker().isContinuousSpellCheckingEnabled())
2285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        page->deprecatedLocalMainFrame()->spellChecker().toggleContinuousSpellChecking();
2295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (page->deprecatedLocalMainFrame()->editor().isOverwriteModeEnabled())
2305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        page->deprecatedLocalMainFrame()->editor().toggleOverwriteModeEnabled();
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
23351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        scrollingCoordinator->reset();
23451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
2355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    page->deprecatedLocalMainFrame()->view()->clear();
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Internals::Internals(Document* document)
239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    : ContextLifecycleObserver(document)
24081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    , m_runtimeFlags(InternalRuntimeFlags::create())
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Document* Internals::contextDocument() const
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return toDocument(executionContext());
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)LocalFrame* Internals::frame() const
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!contextDocument())
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return contextDocument()->frame();
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InternalSettings* Internals::settings() const
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = contextDocument();
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = document->page();
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!page)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return InternalSettings::from(*page);
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)InternalRuntimeFlags* Internals::runtimeFlags() const
26881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles){
26981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    return m_runtimeFlags.get();
27081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)}
27181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
272e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochInternalProfilers* Internals::profilers()
273e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
274e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!m_profilers)
275e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        m_profilers = InternalProfilers::create();
276e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return m_profilers.get();
277e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
278e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)unsigned Internals::workerThreadCount() const
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return WorkerThread::workerThreadCount();
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String Internals::address(Node* node)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    char buf[32];
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sprintf(buf, "%p", node);
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String(buf);
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciGCObservation* Internals::observeGC(ScriptValue scriptValue)
293f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
294f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    v8::Handle<v8::Value> observedValue = scriptValue.v8Value();
295f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    ASSERT(!observedValue.IsEmpty());
296f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (observedValue->IsNull() || observedValue->IsUndefined()) {
297f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        V8ThrowException::throwTypeError("value to observe is null or undefined", v8::Isolate::GetCurrent());
298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
299f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
300f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
301f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return GCObservation::create(observedValue);
302f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
303f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
30451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)unsigned Internals::updateStyleAndReturnAffectedElementCount(ExceptionState& exceptionState) const
30551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
30651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Document* document = contextDocument();
30751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!document) {
30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No context document is available.");
30951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return 0;
31051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
31151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
31251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    unsigned beforeCount = document->styleEngine()->resolverAccessCount();
31307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    document->updateRenderTreeIfNeeded();
31451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return document->styleEngine()->resolverAccessCount() - beforeCount;
31551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
31651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)unsigned Internals::needsLayoutCount(ExceptionState& exceptionState) const
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* contextFrame = frame();
32009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!contextFrame) {
32109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No context frame is available.");
32209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return 0;
32309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
32409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
32509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool isPartial;
32609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned needsLayoutObjects;
32709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned totalObjects;
32809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    contextFrame->countObjectsNeedingLayout(needsLayoutObjects, totalObjects, isPartial);
32909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return needsLayoutObjects;
33009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
33109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
332197021e6b966cfb06891637935ef33fff06433d1Ben Murdochunsigned Internals::hitTestCount(Document* doc, ExceptionState& exceptionState) const
333197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
334197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!doc) {
335197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        exceptionState.throwDOMException(InvalidAccessError, "Must supply document to check");
336197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return 0;
337197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
338197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
339197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return doc->renderView()->hitTestCount();
340197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
341197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
342197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Internals::isPreloaded(const String& url)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Document* document = contextDocument();
3463464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    return document->fetcher()->isPreloaded(url);
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool Internals::isLoadingFromMemoryCache(const String& url)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!contextDocument())
352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return false;
353fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    Resource* resource = memoryCache()->resourceForURL(contextDocument()->completeURL(url));
354fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    return resource && resource->status() == Resource::Cached;
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
357e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool Internals::isSharingStyle(Element* element1, Element* element2) const
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
359e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element1 && element2);
36009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return element1->renderStyle() == element2->renderStyle();
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::isValidContentSelect(Element* insertionPoint, ExceptionState& exceptionState)
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
365e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(insertionPoint);
366e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!insertionPoint->isInsertionPoint()) {
367e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The element is not an insertion point.");
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return isHTMLContentElement(*insertionPoint) && toHTMLContentElement(*insertionPoint).isSelectValid();
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
374e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Node* Internals::treeScopeRootNode(Node* node)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
376e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return &node->treeScope().rootNode();
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
380e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Node* Internals::parentTreeScope(Node* node)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
382e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
3838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    const TreeScope* parentTreeScope = node->treeScope().parentTreeScope();
38409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return parentTreeScope ? &parentTreeScope->rootNode() : 0;
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Internals::hasSelectorForIdInShadow(Element* host, const AtomicString& idValue, ExceptionState& exceptionState)
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
389e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(host);
390e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!host->shadow()) {
391e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The host element does not have a shadow.");
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
395e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return host->shadow()->ensureSelectFeatureSet().hasSelectorForId(idValue);
396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
39809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Internals::hasSelectorForClassInShadow(Element* host, const AtomicString& className, ExceptionState& exceptionState)
399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
400e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(host);
401e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!host->shadow()) {
402e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The host element does not have a shadow.");
403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
406e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return host->shadow()->ensureSelectFeatureSet().hasSelectorForClass(className);
407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
40909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Internals::hasSelectorForAttributeInShadow(Element* host, const AtomicString& attributeName, ExceptionState& exceptionState)
410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
411e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(host);
412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!host->shadow()) {
413e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The host element does not have a shadow.");
414926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
417e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return host->shadow()->ensureSelectFeatureSet().hasSelectorForAttribute(attributeName);
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
42051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::hasSelectorForPseudoClassInShadow(Element* host, const String& pseudoClass, ExceptionState& exceptionState)
421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
422e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(host);
423e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!host->shadow()) {
424e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The host element does not have a shadow.");
425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
426926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
4277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return host->shadow()->ensureSelectFeatureSet().hasSelectorForPseudoType(CSSSelector::parsePseudoType(AtomicString(pseudoClass), false));
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
43051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)unsigned short Internals::compareTreeScopePosition(const Node* node1, const Node* node2, ExceptionState& exceptionState) const
4315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
432e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node1 && node2);
4335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    const TreeScope* treeScope1 = node1->isDocumentNode() ? static_cast<const TreeScope*>(toDocument(node1)) :
4345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        node1->isShadowRoot() ? static_cast<const TreeScope*>(toShadowRoot(node1)) : 0;
4355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    const TreeScope* treeScope2 = node2->isDocumentNode() ? static_cast<const TreeScope*>(toDocument(node2)) :
4365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        node2->isShadowRoot() ? static_cast<const TreeScope*>(toShadowRoot(node2)) : 0;
4375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (!treeScope1 || !treeScope2) {
43809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, String::format("The %s node is neither a document node, nor a shadow root.", treeScope1 ? "second" : "first"));
4395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return 0;
4405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
4418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return treeScope1->comparePosition(*treeScope2);
4425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
4435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
44451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::pauseAnimations(double pauseTime, ExceptionState& exceptionState)
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
44681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (pauseTime < 0) {
447d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::indexExceedsMinimumBound("pauseTime", pauseTime, 0.0));
44881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return;
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
451d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame()->view()->updateLayoutAndStyleForPainting();
452d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame()->document()->timeline().pauseAnimationsForTesting(pauseTime);
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
45551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::hasShadowInsertionPoint(const Node* root, ExceptionState& exceptionState) const
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
457e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(root);
458e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!root->isShadowRoot()) {
459e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The node argument is not a shadow root.");
460e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return 0;
461e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
462e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return toShadowRoot(root)->containsShadowElements();
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::hasContentElement(const Node* root, ExceptionState& exceptionState) const
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
467e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(root);
468e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!root->isShadowRoot()) {
469e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The node argument is not a shadow root.");
470e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return 0;
471e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
472e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return toShadowRoot(root)->containsContentElements();
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)size_t Internals::countElementShadow(const Node* root, ExceptionState& exceptionState) const
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
477e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(root);
478e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!root->isShadowRoot()) {
479e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The node argument is not a shadow root.");
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
482c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return toShadowRoot(root)->childShadowRootCount();
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Node* Internals::nextSiblingByWalker(Node* node)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
487e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
488c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ComposedTreeWalker walker(node);
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    walker.nextSibling();
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return walker.get();
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
493e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Node* Internals::firstChildByWalker(Node* node)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
495e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
496c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ComposedTreeWalker walker(node);
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    walker.firstChild();
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return walker.get();
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
501e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Node* Internals::lastChildByWalker(Node* node)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
503e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
504c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ComposedTreeWalker walker(node);
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    walker.lastChild();
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return walker.get();
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
509e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Node* Internals::nextNodeByWalker(Node* node)
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
511e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
512c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ComposedTreeWalker walker(node);
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    walker.next();
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return walker.get();
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
517e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Node* Internals::previousNodeByWalker(Node* node)
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
519e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
520c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ComposedTreeWalker walker(node);
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    walker.previous();
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return walker.get();
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::elementRenderTreeAsText(Element* element, ExceptionState& exceptionState)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
527e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String representation = externalRepresentation(element);
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (representation.isEmpty()) {
53009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The element provided has no external representation.");
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return representation;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
537e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)PassRefPtrWillBeRawPtr<CSSStyleDeclaration> Internals::computedStyleIncludingVisitedInfo(Node* node) const
538926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
539e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool allowVisitedStyle = true;
541926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return CSSComputedStyleDeclaration::create(node, allowVisitedStyle);
542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
544e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ShadowRoot* Internals::shadowRoot(Element* host)
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Internals::shadowRoot() in tests should be converted to youngestShadowRoot() or oldestShadowRoot().
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // https://bugs.webkit.org/show_bug.cgi?id=78465
548e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return youngestShadowRoot(host);
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
551e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ShadowRoot* Internals::youngestShadowRoot(Element* host)
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
553e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(host);
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ElementShadow* shadow = host->shadow())
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return shadow->youngestShadowRoot();
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
559e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ShadowRoot* Internals::oldestShadowRoot(Element* host)
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
561e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(host);
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ElementShadow* shadow = host->shadow())
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return shadow->oldestShadowRoot();
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)ShadowRoot* Internals::youngerShadowRoot(Node* shadow, ExceptionState& exceptionState)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
569e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(shadow);
570e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!shadow->isShadowRoot()) {
571e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The node provided is not a shadow root.");
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return toShadowRoot(shadow)->youngerShadowRoot();
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::shadowRootType(const Node* root, ExceptionState& exceptionState) const
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
580e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(root);
581e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!root->isShadowRoot()) {
582e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The node provided is not a shadow root.");
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (toShadowRoot(root)->type()) {
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ShadowRoot::UserAgentShadowRoot:
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String("UserAgentShadowRoot");
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ShadowRoot::AuthorShadowRoot:
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String("AuthorShadowRoot");
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String("Unknown");
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
597e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)const AtomicString& Internals::shadowPseudoId(Element* element)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
599e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
60009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return element->shadowPseudoId();
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String Internals::visiblePlaceholder(Element* element)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
60509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (element && isHTMLTextFormControlElement(*element)) {
606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (toHTMLTextFormControlElement(element)->placeholderShouldBeVisible())
607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return toHTMLTextFormControlElement(element)->placeholderElement()->textContent();
608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String();
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Internals::selectColorInColorChooser(Element* element, const String& colorValue)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
615d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(element);
616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isHTMLInputElement(*element))
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
61809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color color;
61909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!color.setFromString(colorValue))
62009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    toHTMLInputElement(*element).selectColorInColorChooser(color);
62209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
62309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid Internals::endColorChooser(Element* element)
6257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
6267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(element);
6277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!isHTMLInputElement(*element))
6287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
6297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    toHTMLInputElement(*element).endColorChooser();
6307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
6317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
63209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Internals::hasAutofocusRequest(Document* document)
63309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
63409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document)
63509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        document = contextDocument();
63609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return document->autofocusElement();
63709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
63809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
63909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool Internals::hasAutofocusRequest()
64009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
64109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return hasAutofocusRequest(0);
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Vector<String> Internals::formControlStateOfHistoryItem(ExceptionState& exceptionState)
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
64651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    HistoryItem* mainItem = frame()->loader().currentItem();
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!mainItem) {
64809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No history item is available.");
649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return Vector<String>();
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
65151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return mainItem->documentState();
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setFormControlStateOfHistoryItem(const Vector<String>& state, ExceptionState& exceptionState)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
65651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    HistoryItem* mainItem = frame()->loader().currentItem();
657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!mainItem) {
65809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No history item is available.");
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
66110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    mainItem->clearDocumentState();
66251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    mainItem->setDocumentState(state);
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setEnableMockPagePopup(bool enabled, ExceptionState& exceptionState)
666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Document* document = contextDocument();
66893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (!document || !document->page())
669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Page* page = document->page();
671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!enabled) {
672e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        page->chrome().client().resetPagePopupDriver();
673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!s_pagePopupDriver)
6765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        s_pagePopupDriver = MockPagePopupDriver::create(page->deprecatedLocalMainFrame()).leakPtr();
677e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    page->chrome().client().setPagePopupDriver(s_pagePopupDriver);
678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
680d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<PagePopupController> Internals::pagePopupController()
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return s_pagePopupDriver ? s_pagePopupDriver->pagePopupController() : 0;
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<ClientRect> Internals::absoluteCaretBounds(ExceptionState& exceptionState)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Document* document = contextDocument();
6888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document || !document->frame()) {
68909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, document ? "The document's frame cannot be retrieved." : "No context document can be obtained.");
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ClientRect::create();
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return ClientRect::create(document->frame()->selection().absoluteCaretBounds());
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
696e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)PassRefPtrWillBeRawPtr<ClientRect> Internals::boundingBox(Element* element)
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
698e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    element->document().updateLayoutIgnorePendingStylesheets();
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = element->renderer();
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer)
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ClientRect::create();
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ClientRect::create(renderer->absoluteBoundingBoxRectIgnoringTransforms());
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
70751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)unsigned Internals::markerCountForNode(Node* node, const String& markerType, ExceptionState& exceptionState)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
709e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DocumentMarker::MarkerTypes markerTypes = 0;
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!markerTypesFrom(markerType, markerTypes)) {
71209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(SyntaxError, "The marker type provided ('" + markerType + "') is invalid.");
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
716d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return node->document().markers().markersFor(node, markerTypes).size();
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
719e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::activeMarkerCountForNode(Node* node)
720e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
721e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
722e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
723e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // Only TextMatch markers can be active.
724e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    DocumentMarker::MarkerType markerType = DocumentMarker::TextMatch;
725197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DocumentMarkerVector markers = node->document().markers().markersFor(node, markerType);
726e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
727e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    unsigned activeMarkerCount = 0;
728197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (DocumentMarkerVector::iterator iter = markers.begin(); iter != markers.end(); ++iter) {
729e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if ((*iter)->activeMatch())
730e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            activeMarkerCount++;
731e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
732e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
733e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return activeMarkerCount;
734e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
735e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
73651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DocumentMarker* Internals::markerAt(Node* node, const String& markerType, unsigned index, ExceptionState& exceptionState)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
738e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DocumentMarker::MarkerTypes markerTypes = 0;
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!markerTypesFrom(markerType, markerTypes)) {
74109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(SyntaxError, "The marker type provided ('" + markerType + "') is invalid.");
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    DocumentMarkerVector markers = node->document().markers().markersFor(node, markerTypes);
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (markers.size() <= index)
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return markers[index];
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
751a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<Range> Internals::markerRangeForNode(Node* node, const String& markerType, unsigned index, ExceptionState& exceptionState)
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
753e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
75451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    DocumentMarker* marker = markerAt(node, markerType, index, exceptionState);
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!marker)
756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Range::create(node->document(), node, marker->startOffset(), node, marker->endOffset());
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::markerDescriptionForNode(Node* node, const String& markerType, unsigned index, ExceptionState& exceptionState)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
76251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    DocumentMarker* marker = markerAt(node, markerType, index, exceptionState);
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!marker)
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return marker->description();
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Internals::addTextMatchMarker(const Range* range, bool isActive)
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
770e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(range);
7718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    range->ownerDocument().updateLayoutIgnorePendingStylesheets();
772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    range->ownerDocument().markers().addTextMatchMarker(range, isActive);
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void Internals::setMarkersActive(Node* node, unsigned startOffset, unsigned endOffset, bool active)
776e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
777e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(node);
778d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    node->document().markers().setMarkersActive(node, startOffset, endOffset, active);
779e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
780e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
781e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void Internals::setMarkedTextMatchesAreHighlighted(Document* document, bool highlight)
78209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
78309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document || !document->frame())
78409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
78509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
78609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    document->frame()->editor().setMarkedTextMatchesAreHighlighted(highlight);
78709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
78809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
78951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setScrollViewPosition(Document* document, long x, long y, ExceptionState& exceptionState)
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
791e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
792e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->view()) {
793e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* frameView = document->view();
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool constrainsScrollingToContentEdgeOldValue = frameView->constrainsScrollingToContentEdge();
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool scrollbarsSuppressedOldValue = frameView->scrollbarsSuppressed();
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->setConstrainsScrollingToContentEdge(false);
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->setScrollbarsSuppressed(false);
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->setScrollOffsetFromInternals(IntPoint(x, y));
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->setScrollbarsSuppressed(scrollbarsSuppressedOldValue);
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->setConstrainsScrollingToContentEdge(constrainsScrollingToContentEdgeOldValue);
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
80851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::viewportAsText(Document* document, float, int availableWidth, int availableHeight, ExceptionState& exceptionState)
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
810e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
811e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->page()) {
812e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return String();
814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
81551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
81651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    document->updateLayoutIgnorePendingStylesheets();
81751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Page* page = document->page();
819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8207757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // Update initial viewport size.
8217757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    IntSize initialViewportSize(availableWidth, availableHeight);
8225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    document->page()->deprecatedLocalMainFrame()->view()->setFrameRect(IntRect(IntPoint::zero(), initialViewportSize));
82393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
8241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ViewportDescription description = page->viewportDescription();
825aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    PageScaleConstraints constraints = description.resolve(initialViewportSize, Length());
8267757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
82793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    constraints.fitToContentsWidth(constraints.layoutSize.width(), availableWidth);
828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    StringBuilder builder;
8307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
8317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.appendLiteral("viewport size ");
8327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.append(String::number(constraints.layoutSize.width()));
8337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.append('x');
8347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.append(String::number(constraints.layoutSize.height()));
8357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
8367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.appendLiteral(" scale ");
8377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.append(String::number(constraints.initialScale));
8387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.appendLiteral(" with limits [");
8397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.append(String::number(constraints.minimumScale));
8407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.appendLiteral(", ");
8417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.append(String::number(constraints.maximumScale));
8427757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
8437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    builder.appendLiteral("] and userScalable ");
8441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    builder.append(description.userZoom ? "true" : "false");
8457757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
8467757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return builder.toString();
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::wasLastChangeUserEdit(Element* textField, ExceptionState& exceptionState)
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
851e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(textField);
852d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLInputElement(*textField))
853d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return toHTMLInputElement(*textField).lastChangeWasUserEdit();
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLTextAreaElement(*textField))
856d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return toHTMLTextAreaElement(*textField).lastChangeWasUserEdit();
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not a TEXTAREA.");
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::elementShouldAutoComplete(Element* element, ExceptionState& exceptionState)
863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
864e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
865d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLInputElement(*element))
866d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return toHTMLInputElement(*element).shouldAutocomplete();
867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
86809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not an INPUT.");
869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return false;
870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
871926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::suggestedValue(Element* element, ExceptionState& exceptionState)
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
874e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
87509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!element->isFormControlElement()) {
87609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not a form control element.");
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    String suggestedValue;
881d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLInputElement(*element))
882d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        suggestedValue = toHTMLInputElement(*element).suggestedValue();
88309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
884d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLTextAreaElement(*element))
885d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        suggestedValue = toHTMLTextAreaElement(*element).suggestedValue();
88643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
88743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLSelectElement(*element))
88843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        suggestedValue = toHTMLSelectElement(*element).suggestedValue();
88943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
89009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return suggestedValue;
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setSuggestedValue(Element* element, const String& value, ExceptionState& exceptionState)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
89609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!element->isFormControlElement()) {
89709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not a form control element.");
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
901d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLInputElement(*element))
902d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        toHTMLInputElement(*element).setSuggestedValue(value);
90309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
904d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLTextAreaElement(*element))
905d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        toHTMLTextAreaElement(*element).setSuggestedValue(value);
90643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
90743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (isHTMLSelectElement(*element))
90843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        toHTMLSelectElement(*element).setSuggestedValue(value);
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setEditingValue(Element* element, const String& value, ExceptionState& exceptionState)
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
913e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
914d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isHTMLInputElement(*element)) {
91509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not an INPUT.");
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
919d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    toHTMLInputElement(*element).setEditingValue(value);
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setAutofilled(Element* element, bool enabled, ExceptionState& exceptionState)
923926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
924e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
9251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!element->isFormControlElement()) {
92609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not a form control element.");
927926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
928926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
9291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    toHTMLFormControlElement(element)->setAutofilled(enabled);
930926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
931926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
93251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::scrollElementToRect(Element* element, long x, long y, long w, long h, ExceptionState& exceptionState)
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
934e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
935e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!element->document().view()) {
936d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exceptionState.throwDOMException(InvalidNodeTypeError, element ? "No view can be obtained from the provided element's document." : ExceptionMessages::argumentNullOrIncorrectType(1, "Element"));
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameView* frameView = element->document().view();
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameView->scrollElementToRect(element, IntRect(x, y, w, h));
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
943e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)PassRefPtrWillBeRawPtr<Range> Internals::rangeFromLocationAndLength(Element* scope, int rangeLocation, int rangeLength)
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
945e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(scope);
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
947e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // TextIterator depends on Layout information, make sure layout it up to date.
9488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    scope->document().updateLayoutIgnorePendingStylesheets();
949e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
950f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return PlainTextRange(rangeLocation, rangeLocation + rangeLength).createRange(*scope);
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
953e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::locationFromRange(Element* scope, const Range* range)
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(scope && range);
956f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // PlainTextRange depends on Layout information, make sure layout it up to date.
9578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    scope->document().updateLayoutIgnorePendingStylesheets();
958e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
959f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return PlainTextRange::create(*scope, *range).start();
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
962e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::lengthFromRange(Element* scope, const Range* range)
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
964e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(scope && range);
965f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    // PlainTextRange depends on Layout information, make sure layout it up to date.
9668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    scope->document().updateLayoutIgnorePendingStylesheets();
967e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
968f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return PlainTextRange::create(*scope, *range).length();
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
971e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)String Internals::rangeAsText(const Range* range)
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
973e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(range);
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return range->text();
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
977197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// FIXME: The next four functions are very similar - combine them once
978197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch// bestClickableNode/bestContextMenuNode have been combined..
979197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
9807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciDOMPoint* Internals::touchPositionAdjustedToBestClickableNode(long x, long y, long width, long height, Document* document, ExceptionState& exceptionState)
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
982e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
983e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
984e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
9857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return 0;
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    document->updateLayout();
98993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize radius(width / 2, height / 2);
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point(x + radius.width(), y + radius.height());
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
993197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EventHandler& eventHandler = document->frame()->eventHandler();
994197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IntPoint hitTestPoint = document->frame()->view()->windowToContents(point);
995197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HitTestResult result = eventHandler.hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active, radius);
996197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode;
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint adjustedPoint;
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1000197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool foundNode = eventHandler.bestClickableNodeForHitTestResult(result, adjustedPoint, targetNode);
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (foundNode)
10027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return DOMPoint::create(adjustedPoint.x(), adjustedPoint.y());
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return 0;
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Node* Internals::touchNodeAdjustedToBestClickableNode(long x, long y, long width, long height, Document* document, ExceptionState& exceptionState)
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1009e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1010e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1011e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
101593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    document->updateLayout();
101693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize radius(width / 2, height / 2);
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point(x + radius.width(), y + radius.height());
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1020197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EventHandler& eventHandler = document->frame()->eventHandler();
1021197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IntPoint hitTestPoint = document->frame()->view()->windowToContents(point);
1022197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HitTestResult result = eventHandler.hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active, radius);
1023197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode;
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint adjustedPoint;
1026197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    document->frame()->eventHandler().bestClickableNodeForHitTestResult(result, adjustedPoint, targetNode);
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return targetNode;
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciDOMPoint* Internals::touchPositionAdjustedToBestContextMenuNode(long x, long y, long width, long height, Document* document, ExceptionState& exceptionState)
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1032e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1033e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1034e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
10357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return 0;
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    document->updateLayout();
103993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize radius(width / 2, height / 2);
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point(x + radius.width(), y + radius.height());
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1043197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EventHandler& eventHandler = document->frame()->eventHandler();
1044197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IntPoint hitTestPoint = document->frame()->view()->windowToContents(point);
1045197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HitTestResult result = eventHandler.hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active, radius);
1046197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode = 0;
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint adjustedPoint;
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1050197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool foundNode = eventHandler.bestContextMenuNodeForHitTestResult(result, adjustedPoint, targetNode);
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (foundNode)
10527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return DOMPoint::create(adjustedPoint.x(), adjustedPoint.y());
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return DOMPoint::create(x, y);
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)Node* Internals::touchNodeAdjustedToBestContextMenuNode(long x, long y, long width, long height, Document* document, ExceptionState& exceptionState)
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1059e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1060e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1061e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    document->updateLayout();
106693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize radius(width / 2, height / 2);
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point(x + radius.width(), y + radius.height());
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1070197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    EventHandler& eventHandler = document->frame()->eventHandler();
1071197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    IntPoint hitTestPoint = document->frame()->view()->windowToContents(point);
1072197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HitTestResult result = eventHandler.hitTestResultAtPoint(hitTestPoint, HitTestRequest::ReadOnly | HitTestRequest::Active, radius);
1073197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode = 0;
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint adjustedPoint;
1076197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    eventHandler.bestContextMenuNodeForHitTestResult(result, adjustedPoint, targetNode);
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return targetNode;
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1080a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<ClientRect> Internals::bestZoomableAreaForTouchPoint(long x, long y, long width, long height, Document* document, ExceptionState& exceptionState)
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1082e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1083e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1084e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
1085d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
108893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    document->updateLayout();
108993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize radius(width / 2, height / 2);
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point(x + radius.width(), y + radius.height());
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode;
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect zoomableArea;
1095f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    bool foundNode = document->frame()->eventHandler().bestZoomableAreaForTouchPoint(point, radius, zoomableArea, targetNode);
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (foundNode)
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ClientRect::create(zoomableArea);
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1099d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return nullptr;
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)int Internals::lastSpellCheckRequestSequence(Document* document, ExceptionState& exceptionState)
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1105e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    SpellCheckRequester* requester = spellCheckRequester(document);
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1107e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!requester) {
110809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No spell check requestor can be obtained for the provided document.");
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return -1;
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1112e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return requester->lastRequestSequence();
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)int Internals::lastSpellCheckProcessedSequence(Document* document, ExceptionState& exceptionState)
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1117e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    SpellCheckRequester* requester = spellCheckRequester(document);
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1119e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!requester) {
112009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No spell check requestor can be obtained for the provided document.");
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return -1;
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1124e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return requester->lastProcessedSequence();
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Vector<AtomicString> Internals::userPreferredLanguages() const
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return blink::userPreferredLanguages();
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
113209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Optimally, the bindings generator would pass a Vector<AtomicString> here but
113309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// this is not supported yet.
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Internals::setUserPreferredLanguages(const Vector<String>& languages)
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
113609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<AtomicString> atomicLanguages;
113709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (size_t i = 0; i < languages.size(); ++i)
113809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        atomicLanguages.append(AtomicString(languages[i]));
1139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    blink::overrideUserPreferredLanguages(atomicLanguages);
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1142e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::activeDOMObjectCount(Document* document)
1143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1144e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return document->activeDOMObjectCount();
1146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
114810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochstatic unsigned eventHandlerCount(Document& document, EventHandlerRegistry::EventHandlerClass handlerClass)
114910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
1150323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (!document.frameHost())
1151323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return 0;
1152323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    EventHandlerRegistry* registry = &document.frameHost()->eventHandlerRegistry();
115310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    unsigned count = 0;
115410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    const EventTargetSet* targets = registry->eventHandlerTargets(handlerClass);
115510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (targets) {
115610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        for (EventTargetSet::const_iterator iter = targets->begin(); iter != targets->end(); ++iter)
115710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            count += iter->value;
115810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
115910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return count;
116010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
116110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1162e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::wheelEventHandlerCount(Document* document)
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1164e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1165f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return eventHandlerCount(*document, EventHandlerRegistry::WheelEvent);
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1168e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::scrollEventHandlerCount(Document* document)
116910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
1170e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
117110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return eventHandlerCount(*document, EventHandlerRegistry::ScrollEvent);
117210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
117310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1174e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::touchEventHandlerCount(Document* document)
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1176e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1177e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return eventHandlerCount(*document, EventHandlerRegistry::TouchEvent);
1178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1180a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochstatic RenderLayer* findRenderLayerForGraphicsLayer(RenderLayer* searchRoot, GraphicsLayer* graphicsLayer, IntSize* layerOffset, String* layerType)
1181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1182a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    *layerOffset = IntSize();
1183f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (searchRoot->hasCompositedLayerMapping() && graphicsLayer == searchRoot->compositedLayerMapping()->mainGraphicsLayer()) {
1184197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        LayoutRect rect;
1185197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        RenderLayer::mapRectToPaintBackingCoordinates(searchRoot->renderer(), rect);
1186197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        *layerOffset = IntSize(rect.x(), rect.y());
1187e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return searchRoot;
1188f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
1189e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
11901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    GraphicsLayer* layerForScrolling = searchRoot->scrollableArea() ? searchRoot->scrollableArea()->layerForScrolling() : 0;
11911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (graphicsLayer == layerForScrolling) {
1192e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        *layerType = "scrolling";
1193e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return searchRoot;
1194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1196a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (searchRoot->compositingState() == PaintsIntoGroupedBacking) {
1197a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        GraphicsLayer* squashingLayer = searchRoot->groupedMapping()->squashingLayer();
1198a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (graphicsLayer == squashingLayer) {
1199a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            *layerType ="squashing";
1200197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            LayoutRect rect;
1201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            RenderLayer::mapRectToPaintBackingCoordinates(searchRoot->renderer(), rect);
1202197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            *layerOffset = IntSize(rect.x(), rect.y());
1203a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return searchRoot;
1204a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
1205a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
1206a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
12071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    GraphicsLayer* layerForHorizontalScrollbar = searchRoot->scrollableArea() ? searchRoot->scrollableArea()->layerForHorizontalScrollbar() : 0;
12081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (graphicsLayer == layerForHorizontalScrollbar) {
1209e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        *layerType = "horizontalScrollbar";
1210e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return searchRoot;
1211e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
1212e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
12131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    GraphicsLayer* layerForVerticalScrollbar = searchRoot->scrollableArea() ? searchRoot->scrollableArea()->layerForVerticalScrollbar() : 0;
12141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (graphicsLayer == layerForVerticalScrollbar) {
1215e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        *layerType = "verticalScrollbar";
1216e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return searchRoot;
1217e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
1218e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
12191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    GraphicsLayer* layerForScrollCorner = searchRoot->scrollableArea() ? searchRoot->scrollableArea()->layerForScrollCorner() : 0;
12201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (graphicsLayer == layerForScrollCorner) {
1221e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        *layerType = "scrollCorner";
1222e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        return searchRoot;
1223e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
1224e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1225a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // Search right to left to increase the chances that we'll choose the top-most layers in a
1226a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // grouped mapping for squashing.
1227a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    for (RenderLayer* child = searchRoot->lastChild(); child; child = child->previousSibling()) {
1228a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RenderLayer* foundLayer = findRenderLayerForGraphicsLayer(child, graphicsLayer, layerOffset, layerType);
1229e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (foundLayer)
1230e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            return foundLayer;
1231e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
1232e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1233e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    return 0;
12347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch}
1235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1236e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// Given a vector of rects, merge those that are adjacent, leaving empty rects
1237e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// in the place of no longer used slots. This is intended to simplify the list
1238e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// of rects returned by an SkRegion (which have been split apart for sorting
1239e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// purposes). No attempt is made to do this efficiently (eg. by relying on the
1240e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)// sort criteria of SkRegion).
124151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static void mergeRects(blink::WebVector<blink::WebRect>& rects)
1242e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
1243e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    for (size_t i = 0; i < rects.size(); ++i) {
1244e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (rects[i].isEmpty())
1245e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            continue;
1246e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        bool updated;
1247e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        do {
1248e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            updated = false;
1249e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            for (size_t j = i+1; j < rects.size(); ++j) {
1250e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                if (rects[j].isEmpty())
1251e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    continue;
1252e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                // Try to merge rects[j] into rects[i] along the 4 possible edges.
1253e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                if (rects[i].y == rects[j].y && rects[i].height == rects[j].height) {
1254e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    if (rects[i].x + rects[i].width == rects[j].x) {
1255e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        rects[i].width += rects[j].width;
125651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                        rects[j] = blink::WebRect();
1257e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        updated = true;
1258e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    } else if (rects[i].x == rects[j].x + rects[j].width) {
1259e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        rects[i].x = rects[j].x;
1260e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        rects[i].width += rects[j].width;
126151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                        rects[j] = blink::WebRect();
1262e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        updated = true;
1263e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    }
1264e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                } else if (rects[i].x == rects[j].x && rects[i].width == rects[j].width) {
1265e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    if (rects[i].y + rects[i].height == rects[j].y) {
1266e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        rects[i].height += rects[j].height;
126751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                        rects[j] = blink::WebRect();
1268e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        updated = true;
1269e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    } else if (rects[i].y == rects[j].y + rects[j].height) {
1270e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        rects[i].y = rects[j].y;
1271e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        rects[i].height += rects[j].height;
127251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                        rects[j] = blink::WebRect();
1273e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                        updated = true;
1274e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                    }
1275e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                }
1276e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            }
1277e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        } while (updated);
1278e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
1279e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
1280e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1281e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)static void accumulateLayerRectList(RenderLayerCompositor* compositor, GraphicsLayer* graphicsLayer, LayerRectList* rects)
1282e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
128351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    blink::WebVector<blink::WebRect> layerRects = graphicsLayer->platformLayer()->touchEventHandlerRegion();
1284e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!layerRects.isEmpty()) {
1285e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        mergeRects(layerRects);
1286e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        String layerType;
1287a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        IntSize layerOffset;
1288a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        RenderLayer* renderLayer = findRenderLayerForGraphicsLayer(compositor->rootRenderLayer(), graphicsLayer, &layerOffset, &layerType);
1289e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        Node* node = renderLayer ? renderLayer->renderer()->node() : 0;
1290e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        for (size_t i = 0; i < layerRects.size(); ++i) {
1291a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (!layerRects[i].isEmpty()) {
1292a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                rects->append(node, layerType, layerOffset.width(), layerOffset.height(), ClientRect::create(layerRects[i]));
1293a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            }
1294e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        }
1295e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    }
1296e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1297e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    size_t numChildren = graphicsLayer->children().size();
1298e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    for (size_t i = 0; i < numChildren; ++i)
1299e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        accumulateLayerRectList(compositor, graphicsLayer->children()[i], rects);
1300e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
1301e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
13027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciLayerRectList* Internals::touchEventTargetLayerRects(Document* document, ExceptionState& exceptionState)
13037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch{
1304e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1305e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->view() || !document->page() || document != contextDocument()) {
130609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
1307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
13087757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
13097757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
131019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // Do any pending layout and compositing update (which may call touchEventTargetRectsChange) to ensure this
1311e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    // really takes any previous changes into account.
131251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    forceCompositingUpdate(document, exceptionState);
131351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
1314d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1316e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (RenderView* view = document->renderView()) {
1317e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        if (RenderLayerCompositor* compositor = view->compositor()) {
1318e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            if (GraphicsLayer* rootLayer = compositor->rootGraphicsLayer()) {
13197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                LayerRectList* rects = LayerRectList::create();
13207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                accumulateLayerRectList(compositor, rootLayer, rects);
1321e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)                return rects;
1322e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)            }
13237757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        }
13247757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
1325e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
1326d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return nullptr;
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
132976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)PassRefPtrWillBeRawPtr<StaticNodeList> Internals::nodesFromRect(Document* document, int centerX, int centerY, unsigned topPadding, unsigned rightPadding,
1330197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowChildFrameContent, ExceptionState& exceptionState) const
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1332e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1333e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame() || !document->frame()->view()) {
133409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No view can be obtained from the provided document.");
1335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1338d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = document->frame();
133953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FrameView* frameView = document->view();
134053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RenderView* renderView = document->renderView();
134153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
134253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!renderView)
1343d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
134453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
134553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    float zoomFactor = frame->pageZoomFactor();
134653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    LayoutPoint point = roundedLayoutPoint(FloatPoint(centerX * zoomFactor + frameView->scrollX(), centerY * zoomFactor + frameView->scrollY()));
134753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active;
1349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (ignoreClipping)
1350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        hitType |= HitTestRequest::IgnoreClipping;
1351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (allowChildFrameContent)
1352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        hitType |= HitTestRequest::AllowChildFrameContent;
1353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
135453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    HitTestRequest request(hitType);
135553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
135653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // When ignoreClipping is false, this method returns null for coordinates outside of the viewport.
135753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!request.ignoreClipping() && !frameView->visibleContentRect().intersects(HitTestLocation::rectForPoint(point, topPadding, rightPadding, bottomPadding, leftPadding)))
1358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
135953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1360f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<Node> > matches;
136153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
136253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Need padding to trigger a rect based hit test, but we want to return a NodeList
136353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // so we special case this.
136453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!topPadding && !rightPadding && !bottomPadding && !leftPadding) {
136553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        HitTestResult result(point);
136653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        renderView->hitTest(request, result);
1367197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1368197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (Node* innerNode = result.innerNode()) {
1369197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (innerNode->isInShadowTree())
1370197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                innerNode = innerNode->shadowHost();
1371197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            matches.append(innerNode);
1372197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
137353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    } else {
137453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        HitTestResult result(point, topPadding, rightPadding, bottomPadding, leftPadding);
137553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        renderView->hitTest(request, result);
137653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        copyToVector(result.rectBasedTestResult(), matches);
137753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
137853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
137953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return StaticNodeList::adopt(matches);
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1382e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool Internals::hasSpellingMarker(Document* document, int from, int length)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1384e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1385e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame())
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return document->frame()->spellChecker().selectionStartHasMarkerFor(DocumentMarker::Spelling, from, length);
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
139053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1391e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void Internals::setContinuousSpellCheckingEnabled(bool enabled)
1392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1393c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!contextDocument() || !contextDocument()->frame())
1394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
13961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (enabled != contextDocument()->frame()->spellChecker().isContinuousSpellCheckingEnabled())
13971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        contextDocument()->frame()->spellChecker().toggleContinuousSpellChecking();
1398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1400e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool Internals::isOverwriteModeEnabled(Document* document)
140153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1402e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1403e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame())
140453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return 0;
140553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1406c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return document->frame()->editor().isOverwriteModeEnabled();
140753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
140853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1409e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void Internals::toggleOverwriteModeEnabled(Document* document)
141053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1411e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame())
141353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
141453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1415c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    document->frame()->editor().toggleOverwriteModeEnabled();
141653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
141753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned Internals::numberOfLiveNodes() const
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return InspectorCounters::counterValue(InspectorCounters::NodeCounter);
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned Internals::numberOfLiveDocuments() const
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return InspectorCounters::counterValue(InspectorCounters::DocumentCounter);
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1428a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)String Internals::dumpRefCountedInstanceCounts() const
1429a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1430a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return WTF::dumpRefCountedInstanceCounts();
1431a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1432a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<String> Internals::consoleMessageArgumentCounts(Document* document) const
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LocalFrame* frame = document->frame();
14367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!frame)
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Vector<String>();
14387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
14397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Vector<unsigned> counts = frame->console().messageStorage()->argumentCounts();
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> result(counts.size());
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < counts.size(); i++)
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result[i] = String::number(counts[i]);
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1446e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochVector<unsigned long> Internals::setMemoryCacheCapacities(unsigned long minDeadBytes, unsigned long maxDeadBytes, unsigned long totalBytes)
1447e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
1448e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    Vector<unsigned long> result;
1449e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    result.append(memoryCache()->minDeadCapacity());
1450e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    result.append(memoryCache()->maxDeadCapacity());
1451e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    result.append(memoryCache()->capacity());
1452e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    memoryCache()->setCapacities(minDeadBytes, maxDeadBytes, totalBytes);
1453e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return result;
1454e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
1455e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
145651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setInspectorResourcesDataSizeLimits(int maximumResourcesContentSize, int maximumSingleResourceContentSize, ExceptionState& exceptionState)
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Page* page = contextDocument()->frame()->page();
1459e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (!page) {
146009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No page can be obtained from the current context document.");
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1463e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    page->inspectorController().setResourcesDataSizeLimitsFromInternals(maximumResourcesContentSize, maximumSingleResourceContentSize);
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1466e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool Internals::hasGrammarMarker(Document* document, int from, int length)
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1468e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1469e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame())
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return document->frame()->spellChecker().selectionStartHasMarkerFor(DocumentMarker::Grammar, from, length);
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)unsigned Internals::numberOfScrollableAreas(Document* document)
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1477e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1478e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame())
1479c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return 0;
1480c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned count = 0;
1482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = document->frame();
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frame->view()->scrollableAreas())
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        count += frame->view()->scrollableAreas()->size();
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* child = frame->tree().firstChild(); child; child = child->tree().nextSibling()) {
14875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (child->isLocalFrame() && toLocalFrame(child)->view() && toLocalFrame(child)->view()->scrollableAreas())
14885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            count += toLocalFrame(child)->view()->scrollableAreas()->size();
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return count;
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
149353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1494e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool Internals::isPageBoxVisible(Document* document, int pageNumber)
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1496e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return document->isPageBoxVisible(pageNumber);
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::layerTreeAsText(Document* document, ExceptionState& exceptionState) const
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
150251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return layerTreeAsText(document, 0, exceptionState);
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::elementLayerTreeAsText(Element* element, ExceptionState& exceptionState) const
1506521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1507e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
150843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    FrameView* frameView = element->document().view();
150943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    frameView->updateLayoutAndStyleForPainting();
151043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
151151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return elementLayerTreeAsText(element, 0, exceptionState);
1512521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
1513521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
151451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::scrollsWithRespectTo(Element* element1, Element* element2, ExceptionState& exceptionState)
1515c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
1516e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element1 && element2);
1517197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    element1->document().view()->updateLayoutAndStyleForPainting();
1518c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1519c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    RenderObject* renderer1 = element1->renderer();
1520c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    RenderObject* renderer2 = element2->renderer();
152109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!renderer1 || !renderer1->isBox()) {
152209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, renderer1 ? "The first provided element's renderer is not a box." : "The first provided element has no renderer.");
152309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return 0;
152409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
152509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!renderer2 || !renderer2->isBox()) {
152609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, renderer2 ? "The second provided element's renderer is not a box." : "The second provided element has no renderer.");
1527c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return 0;
1528c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
1529c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1530c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    RenderLayer* layer1 = toRenderBox(renderer1)->layer();
1531c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    RenderLayer* layer2 = toRenderBox(renderer2)->layer();
1532c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!layer1 || !layer2) {
153309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, String::format("No render layer can be obtained from the %s provided element.", layer1 ? "second" : "first"));
1534c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return 0;
1535c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
1536c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1537c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return layer1->scrollsWithRespectTo(layer2);
1538c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
1539c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
154051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool Internals::isUnclippedDescendant(Element* element, ExceptionState& exceptionState)
15419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1542e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
15436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    element->document().view()->updateLayoutAndStyleForPainting();
15449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
15459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    RenderObject* renderer = element->renderer();
15469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!renderer || !renderer->isBox()) {
154709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, renderer ? "The provided element's renderer is not a box." : "The provided element has no renderer.");
15489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return 0;
15499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
15509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
15519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    RenderLayer* layer = toRenderBox(renderer)->layer();
15529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!layer) {
155309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No render layer can be obtained from the provided element.");
15549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return 0;
15559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
15569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1557197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return layer->isUnclippedDescendant();
15589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
15599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
156051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::layerTreeAsText(Document* document, unsigned flags, ExceptionState& exceptionState) const
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1562e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1563e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1564e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
156843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    document->view()->updateLayoutAndStyleForPainting();
156943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
1570521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return document->frame()->layerTreeAsText(flags);
1571521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
1572521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
157351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::elementLayerTreeAsText(Element* element, unsigned flags, ExceptionState& exceptionState) const
1574521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){
1575e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
15768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    element->document().updateLayout();
1577521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1578521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    RenderObject* renderer = element->renderer();
1579521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (!renderer || !renderer->isBox()) {
158009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, renderer ? "The provided element's renderer is not a box." : "The provided element has no renderer.");
1581521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return String();
1582521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
1583521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
1584521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    RenderLayer* layer = toRenderBox(renderer)->layer();
158583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch    if (!layer
158651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        || !layer->hasCompositedLayerMapping()
15871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        || !layer->compositedLayerMapping()->mainGraphicsLayer()) {
1588521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        // Don't raise exception in these cases which may be normally used in tests.
1589521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        return String();
1590521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    }
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return layer->compositedLayerMapping()->mainGraphicsLayer()->layerTreeAsText(flags);
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)String Internals::scrollingStateTreeAsText(Document*) const
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
159753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return String();
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
160051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::mainThreadScrollingReasons(Document* document, ExceptionState& exceptionState) const
1601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1602e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1603e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1604e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
1605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return String();
1606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1608a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    document->frame()->view()->updateLayoutAndStyleForPainting();
160919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
1610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Page* page = document->page();
1611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!page)
1612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return String();
1613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return page->mainThreadScrollingReasonsAsText();
1615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1617a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<ClientRectList> Internals::nonFastScrollableRects(Document* document, ExceptionState& exceptionState) const
1618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1619e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1620e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1621e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
1622d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Page* page = document->page();
1626926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!page)
1627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return page->nonFastScrollableRects(document->frame());
1630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1632e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void Internals::garbageCollectDocumentResources(Document* document) const
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1634e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
16353464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    ResourceFetcher* fetcher = document->fetcher();
16363464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    if (!fetcher)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
16383464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    fetcher->garbageCollectDocumentResources();
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1641fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid Internals::evictAllResources() const
16420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{
16430019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    memoryCache()->evictResources();
16440019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch}
16450019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String Internals::counterValue(Element* element)
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element)
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return counterValueForElement(element);
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int Internals::pageNumber(Element* element, float pageWidth, float pageHeight)
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element)
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return PrintContext::pageNumberForElement(element, FloatSize(pageWidth, pageHeight));
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Vector<String> Internals::iconURLs(Document* document, int iconTypesMask) const
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Vector<IconURL> iconURLs = document->iconURLs(iconTypesMask);
1665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Vector<String> array;
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<IconURL>::const_iterator iter(iconURLs.begin());
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (; iter != iconURLs.end(); ++iter)
1669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        array.append(iter->m_iconURL.string());
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return array;
1672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Vector<String> Internals::shortcutIconURLs(Document* document) const
1675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return iconURLs(document, Favicon);
1677926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Vector<String> Internals::allIconURLs(Document* document) const
1680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return iconURLs(document, Favicon | TouchIcon | TouchPrecomposedIcon);
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int Internals::numberOfPages(float pageWidth, float pageHeight)
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return -1;
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return PrintContext::numberOfPages(frame(), FloatSize(pageWidth, pageHeight));
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
169251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::pageProperty(String propertyName, int pageNumber, ExceptionState& exceptionState) const
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame()) {
169509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No frame is available.");
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return PrintContext::pageProperty(frame(), propertyName.utf8().data(), pageNumber);
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::pageSizeAndMarginsInPixels(int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft, ExceptionState& exceptionState) const
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame()) {
170509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No frame is available.");
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return PrintContext::pageSizeAndMarginsInPixels(frame(), pageNumber, width, height, marginTop, marginRight, marginBottom, marginLeft);
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setDeviceScaleFactor(float scaleFactor, ExceptionState& exceptionState)
1713e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
1714e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    Document* document = contextDocument();
1715e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (!document || !document->page()) {
171609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, document ? "The document's page cannot be retrieved." : "No context document can be obtained.");
1717e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        return;
1718e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    }
1719e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    Page* page = document->page();
1720e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    page->setDeviceScaleFactor(scaleFactor);
1721e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
1722e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
172351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::setIsCursorVisible(Document* document, bool isVisible, ExceptionState& exceptionState)
172453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1725e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1726e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->page()) {
1727e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "No context document can be obtained.");
172853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
172953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
173053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    document->page()->setIsCursorVisible(isVisible);
173153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
173253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
173307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid Internals::mediaPlayerRequestFullscreen(HTMLMediaElement* mediaElement)
173407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
173507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    mediaElement->mediaPlayerRequestFullscreen();
173607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
173707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1738e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)double Internals::effectiveMediaVolume(HTMLMediaElement* mediaElement)
1739e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
1740e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return mediaElement->effectiveMediaVolume();
1741e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
1742e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
17437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid Internals::mediaPlayerRemoteRouteAvailabilityChanged(HTMLMediaElement* mediaElement, bool available)
17447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
17457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mediaElement->remoteRouteAvailabilityChanged(available);
17467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
17477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1748697ef0c10ac944be8499480c025020e4c282c980Ben Murdochvoid Internals::mediaPlayerPlayingRemotelyChanged(HTMLMediaElement* mediaElement, bool remote)
1749697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch{
1750697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch    if (remote)
1751697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch        mediaElement->connectedToRemoteDevice();
1752697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch    else
1753697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch        mediaElement->disconnectedFromRemoteDevice();
1754697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch}
1755697ef0c10ac944be8499480c025020e4c282c980Ben Murdoch
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Internals::registerURLSchemeAsBypassingContentSecurityPolicy(const String& scheme)
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SchemeRegistry::registerURLSchemeAsBypassingContentSecurityPolicy(scheme);
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void Internals::removeURLSchemeRegisteredAsBypassingContentSecurityPolicy(const String& scheme)
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SchemeRegistry::removeURLSchemeRegisteredAsBypassingContentSecurityPolicy(scheme);
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciTypeConversions* Internals::typeConversions() const
1767926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return TypeConversions::create();
1769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1770926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1771197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPrivateScriptTest* Internals::privateScriptTest() const
1772197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
1773197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return PrivateScriptTest::create(frame());
1774197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
1775197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
17767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciDictionaryTest* Internals::dictionaryTest() const
17777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
17787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return DictionaryTest::create();
17797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
17807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1781926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Vector<String> Internals::getReferencedFilePaths() const
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
178310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return frame()->loader().currentItem()->getReferencedFilePaths();
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
178651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::startTrackingRepaints(Document* document, ExceptionState& exceptionState)
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1788e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1789e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->view()) {
1790e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* frameView = document->view();
1795a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    frameView->updateLayoutAndStyleForPainting();
1796f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    frameView->setTracksPaintInvalidations(true);
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
179951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::stopTrackingRepaints(Document* document, ExceptionState& exceptionState)
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1801e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1802e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->view()) {
1803e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* frameView = document->view();
1808a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    frameView->updateLayoutAndStyleForPainting();
1809f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    frameView->setTracksPaintInvalidations(false);
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(ExceptionState& exceptionState)
181351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
181451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(0, exceptionState);
181551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
181651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
181751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(Node* node, ExceptionState& exceptionState)
181851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
181951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Document* document;
182051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!node) {
182151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        document = contextDocument();
182251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else if (node->isDocumentNode()) {
182351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        document = toDocument(node);
1824d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (isHTMLIFrameElement(*node)) {
1825d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        document = toHTMLIFrameElement(*node).contentDocument();
182651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else {
1827d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        exceptionState.throwTypeError("The node provided is neither a document nor an IFrame.");
182851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
182951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
183051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    document->updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasksSynchronously);
183151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
183251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
18335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void Internals::forceFullRepaint(Document* document, ExceptionState& exceptionState)
18345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1835e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1836e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->view()) {
1837e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
18385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
18395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
18405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
18415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (RenderView *renderView = document->renderView())
1842c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        renderView->invalidatePaintForViewAndCompositedLayers();
18435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
18445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
1845a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<ClientRectList> Internals::draggableRegions(Document* document, ExceptionState& exceptionState)
18461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
184751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return annotatedRegions(document, true, exceptionState);
18481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
18491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1850a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<ClientRectList> Internals::nonDraggableRegions(Document* document, ExceptionState& exceptionState)
18511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
185251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return annotatedRegions(document, false, exceptionState);
18531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
18541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1855a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<ClientRectList> Internals::annotatedRegions(Document* document, bool draggable, ExceptionState& exceptionState)
18561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1857e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1858e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->view()) {
1859e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
18601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return ClientRectList::create();
18611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
18621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
18631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    document->updateLayout();
18641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    document->view()->updateAnnotatedRegions();
18651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    Vector<AnnotatedRegionValue> regions = document->annotatedRegions();
18661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
18671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    Vector<FloatQuad> quads;
18681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    for (size_t i = 0; i < regions.size(); ++i) {
18691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (regions[i].draggable == draggable)
18701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            quads.append(FloatQuad(regions[i].bounds));
18711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
18721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return ClientRectList::create(quads);
18731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
18741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char* cursorTypeToString(Cursor::Type cursorType)
1876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    switch (cursorType) {
1878926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Pointer: return "Pointer";
1879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Cross: return "Cross";
1880926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Hand: return "Hand";
1881926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::IBeam: return "IBeam";
1882926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Wait: return "Wait";
1883926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Help: return "Help";
1884926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::EastResize: return "EastResize";
1885926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthResize: return "NorthResize";
1886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthEastResize: return "NorthEastResize";
1887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthWestResize: return "NorthWestResize";
1888926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::SouthResize: return "SouthResize";
1889926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::SouthEastResize: return "SouthEastResize";
1890926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::SouthWestResize: return "SouthWestResize";
1891926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::WestResize: return "WestResize";
1892926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthSouthResize: return "NorthSouthResize";
1893926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::EastWestResize: return "EastWestResize";
1894926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthEastSouthWestResize: return "NorthEastSouthWestResize";
1895926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthWestSouthEastResize: return "NorthWestSouthEastResize";
1896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::ColumnResize: return "ColumnResize";
1897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::RowResize: return "RowResize";
1898926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::MiddlePanning: return "MiddlePanning";
1899926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::EastPanning: return "EastPanning";
1900926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthPanning: return "NorthPanning";
1901926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthEastPanning: return "NorthEastPanning";
1902926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NorthWestPanning: return "NorthWestPanning";
1903926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::SouthPanning: return "SouthPanning";
1904926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::SouthEastPanning: return "SouthEastPanning";
1905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::SouthWestPanning: return "SouthWestPanning";
1906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::WestPanning: return "WestPanning";
1907926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Move: return "Move";
1908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::VerticalText: return "VerticalText";
1909926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Cell: return "Cell";
1910926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::ContextMenu: return "ContextMenu";
1911926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Alias: return "Alias";
1912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Progress: return "Progress";
1913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NoDrop: return "NoDrop";
1914926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Copy: return "Copy";
1915926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::None: return "None";
1916926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::NotAllowed: return "NotAllowed";
1917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::ZoomIn: return "ZoomIn";
1918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::ZoomOut: return "ZoomOut";
1919926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Grab: return "Grab";
1920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Grabbing: return "Grabbing";
1921926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case Cursor::Custom: return "Custom";
1922926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1923926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1924926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_NOT_REACHED();
1925926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return "UNKNOWN";
1926926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1927926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
192851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String Internals::getCurrentCursorInfo(Document* document, ExceptionState& exceptionState)
1929926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1930e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
1931e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->frame()) {
1932e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
1933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return String();
1934926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1935926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1936f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Cursor cursor = document->frame()->eventHandler().currentMouseCursor();
1937926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1938926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    StringBuilder result;
19399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    result.appendLiteral("type=");
1940926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    result.append(cursorTypeToString(cursor.type()));
19419e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    result.appendLiteral(" hotSpot=");
1942926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    result.appendNumber(cursor.hotSpot().x());
19439e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    result.append(',');
1944926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    result.appendNumber(cursor.hotSpot().y());
1945926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (cursor.image()) {
1946926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        IntSize size = cursor.image()->size();
19479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        result.appendLiteral(" image=");
1948926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        result.appendNumber(size.width());
19499e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        result.append('x');
1950926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        result.appendNumber(size.height());
1951926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1952926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (cursor.imageScaleFactor() != 1) {
19539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        result.appendLiteral(" scale=");
1954926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        NumberToStringBuffer buffer;
1955926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        result.append(numberToFixedPrecisionString(cursor.imageScaleFactor(), 8, buffer, true));
1956926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
195753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1958926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return result.toString();
1959926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1960926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1961926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<ArrayBuffer> Internals::serializeObject(PassRefPtr<SerializedScriptValue> value) const
1962926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1963926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String stringValue = value->toWireString();
1964591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<ArrayBuffer> buffer = ArrayBuffer::createUninitialized(stringValue.length(), sizeof(UChar));
1965e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    stringValue.copyTo(static_cast<UChar*>(buffer->data()), 0, stringValue.length());
1966591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return buffer.release();
1967926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1968926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1969926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<SerializedScriptValue> Internals::deserializeBuffer(PassRefPtr<ArrayBuffer> buffer) const
1970926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1971926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String value(static_cast<const UChar*>(buffer->data()), buffer->byteLength() / sizeof(UChar));
1972926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return SerializedScriptValue::createFromWire(value);
1973926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1974926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1975926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void Internals::forceReload(bool endToEnd)
1976926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1977f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().reload(endToEnd ? EndToEndReload : NormalReload);
1978926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1979926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1980a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben MurdochPassRefPtrWillBeRawPtr<ClientRect> Internals::selectionBounds(ExceptionState& exceptionState)
1981591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
1982591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    Document* document = contextDocument();
19838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document || !document->frame()) {
198409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, document ? "The document's frame cannot be retrieved." : "No context document can be obtained.");
1985d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
1986591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
1987591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
19888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return ClientRect::create(document->frame()->selection().bounds());
1989591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
1990591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
1991e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)String Internals::markerTextForListItem(Element* element)
1992926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1993e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
1994c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return blink::markerTextForListItem(element);
1995926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1996926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1997e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)String Internals::getImageSourceURL(Element* element)
1998926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1999e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
2000926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return element->imageSourceURL();
2001926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2002926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
200353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool Internals::isSelectPopupVisible(Node* node)
2004926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2005d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(node);
2006d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isHTMLSelectElement(*node))
200753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
200853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2009d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLSelectElement& select = toHTMLSelectElement(*node);
201053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2011d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RenderObject* renderer = select.renderer();
2012f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    if (!renderer || !renderer->isMenuList())
201353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
201453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
201553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RenderMenuList* menuList = toRenderMenuList(renderer);
201653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return menuList->popupIsVisible();
2017926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
2018926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2019c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)bool Internals::selectPopupItemStyleIsRtl(Node* node, int itemIndex)
2020c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
2021c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!node || !isHTMLSelectElement(*node))
2022c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return false;
2023c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2024c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    HTMLSelectElement& select = toHTMLSelectElement(*node);
2025c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2026c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RenderObject* renderer = select.renderer();
2027c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!renderer || !renderer->isMenuList())
2028c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return false;
2029c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2030c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RenderMenuList& menuList = toRenderMenuList(*renderer);
2031c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    PopupMenuStyle itemStyle = menuList.itemStyle(itemIndex);
2032c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return itemStyle.textDirection() == RTL;
2033c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
2034c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2035c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)int Internals::selectPopupItemStyleFontHeight(Node* node, int itemIndex)
2036c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
2037c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!node || !isHTMLSelectElement(*node))
2038c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return false;
2039c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2040c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    HTMLSelectElement& select = toHTMLSelectElement(*node);
2041c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2042c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RenderObject* renderer = select.renderer();
2043c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!renderer || !renderer->isMenuList())
2044c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return false;
2045c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2046c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RenderMenuList& menuList = toRenderMenuList(*renderer);
2047c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    PopupMenuStyle itemStyle = menuList.itemStyle(itemIndex);
2048c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return itemStyle.font().fontMetrics().height();
2049c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
2050c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
2051fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochbool Internals::loseSharedGraphicsContext3D()
2052fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch{
205309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    OwnPtr<blink::WebGraphicsContext3DProvider> sharedProvider = adoptPtr(blink::Platform::current()->createSharedOffscreenGraphicsContext3DProvider());
205409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!sharedProvider)
2055fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch        return false;
205609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    blink::WebGraphicsContext3D* sharedContext = sharedProvider->context3d();
205709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    sharedContext->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_EXT, GL_INNOCENT_CONTEXT_RESET_EXT);
2058fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    // To prevent tests that call loseSharedGraphicsContext3D from being
2059fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    // flaky, we call finish so that the context is guaranteed to be lost
2060fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    // synchronously (i.e. before returning).
2061fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    sharedContext->finish();
2062fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    return true;
2063fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch}
2064fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
206551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void Internals::forceCompositingUpdate(Document* document, ExceptionState& exceptionState)
206619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){
2067e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
2068e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!document->renderView()) {
2069e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidAccessError, "The document provided is invalid.");
207019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return;
207119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    }
207219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
2073a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    document->frame()->view()->updateLayoutAndStyleForPainting();
207409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
207509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
207609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void Internals::setZoomFactor(float factor)
207709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
207809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame()->setPageZoomFactor(factor);
207909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
208009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
208109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void Internals::setShouldRevealPassword(Element* element, bool reveal, ExceptionState& exceptionState)
208209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
2083e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(element);
2084d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isHTMLInputElement(element)) {
2085e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not an INPUT.");
208609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
208709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
208809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2089d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return toHTMLInputElement(*element).setShouldRevealPassword(reveal);
209009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
209109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
209209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)namespace {
209309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
209409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class AddOneFunction : public ScriptFunction {
209509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)public:
20967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static v8::Handle<v8::Function> createFunction(ScriptState* scriptState)
209709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
20987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        AddOneFunction* self = new AddOneFunction(scriptState);
20997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return self->bindToV8Function();
210009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
210109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
210209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private:
21037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    explicit AddOneFunction(ScriptState* scriptState)
21047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : ScriptFunction(scriptState)
210509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
210609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
210709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
210809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual ScriptValue call(ScriptValue value) OVERRIDE
210909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
211009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        v8::Local<v8::Value> v8Value = value.v8Value();
211109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(v8Value->IsNumber());
211209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int intValue = v8Value.As<v8::Integer>()->Value();
21137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return ScriptValue(scriptState(), v8::Integer::New(scriptState()->isolate(), intValue + 1));
211409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
211509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
211609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
211709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} // namespace
211809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2119323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)ScriptPromise Internals::createResolvedPromise(ScriptState* scriptState, ScriptValue value)
212043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
2121323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
212243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    ScriptPromise promise = resolver->promise();
212343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    resolver->resolve(value);
212443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return promise;
212543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
212643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
2127323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)ScriptPromise Internals::createRejectedPromise(ScriptState* scriptState, ScriptValue value)
212843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
2129323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
213043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    ScriptPromise promise = resolver->promise();
213143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    resolver->reject(value);
213243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return promise;
213343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
213443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
2135e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ScriptPromise Internals::addOneToPromise(ScriptState* scriptState, ScriptPromise promise)
2136e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
21377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return promise.then(AddOneFunction::createFunction(scriptState));
2138e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
2139e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
2140e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ScriptPromise Internals::promiseCheck(ScriptState* scriptState, long arg1, bool arg2, const Dictionary& arg3, const String& arg4, const Vector<String>& arg5, ExceptionState& exceptionState)
214109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
2142e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (arg2)
2143e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return ScriptPromise::cast(scriptState, v8String(scriptState->isolate(), "done"));
2144e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    exceptionState.throwDOMException(InvalidStateError, "Thrown from the native implementation.");
2145e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return ScriptPromise();
2146e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
2147e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
2148e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ScriptPromise Internals::promiseCheckWithoutExceptionState(ScriptState* scriptState, const Dictionary& arg1, const String& arg2, const Vector<String>& arg3)
2149e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
2150e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return ScriptPromise::cast(scriptState, v8String(scriptState->isolate(), "done"));
2151e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
2152e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
2153e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)ScriptPromise Internals::promiseCheckRange(ScriptState* scriptState, long arg1)
2154e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
2155e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return ScriptPromise::cast(scriptState, v8String(scriptState->isolate(), "done"));
215619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)}
215719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
2158d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void Internals::trace(Visitor* visitor)
2159d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    visitor->trace(m_runtimeFlags);
2161d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    visitor->trace(m_profilers);
2162d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2163d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2164d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void Internals::setValueForUser(Element* element, const String& value)
2165d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
2166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    toHTMLInputElement(element)->setValueForUser(value);
2167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2168d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2169d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)String Internals::textSurroundingNode(Node* node, int x, int y, unsigned long maxLength)
2170d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
217107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!node)
217207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return String();
2173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    blink::WebPoint point(x, y);
21745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    SurroundingText surroundingText(VisiblePosition(node->renderer()->positionForPoint(static_cast<IntPoint>(point))).deepEquivalent().parentAnchoredEquivalent(), maxLength);
2175d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return surroundingText.content();
2176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
2177d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
2178d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Internals::setFocused(bool focused)
2179d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
2180d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    frame()->page()->focusController().setFocused(focused);
2181d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
2182d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
2183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool Internals::ignoreLayoutWithPendingStylesheets(Document* document)
21845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
2185e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    ASSERT(document);
21865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return document->ignoreLayoutWithPendingStylesheets();
21875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
21885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
2189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Internals::setNetworkStateNotifierTestOnly(bool testOnly)
2190d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
2191d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    networkStateNotifier().setTestUpdatesOnly(testOnly);
2192d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
2193d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
2194d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void Internals::setNetworkConnectionInfo(const String& type, ExceptionState& exceptionState)
2195d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
2196d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    blink::WebConnectionType webtype;
2197d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (type == "cellular") {
2198d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        webtype = blink::ConnectionTypeCellular;
2199d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else if (type == "bluetooth") {
2200d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        webtype = blink::ConnectionTypeBluetooth;
2201d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else if (type == "ethernet") {
2202d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        webtype = blink::ConnectionTypeEthernet;
2203d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else if (type == "wifi") {
2204d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        webtype = blink::ConnectionTypeWifi;
2205d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else if (type == "other") {
2206d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        webtype = blink::ConnectionTypeOther;
2207d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else if (type == "none") {
2208d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        webtype = blink::ConnectionTypeNone;
2209197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    } else if (type == "unknown") {
2210197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        webtype = blink::ConnectionTypeUnknown;
2211d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    } else {
2212d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        exceptionState.throwDOMException(NotFoundError, ExceptionMessages::failedToEnumerate("connection type", type));
2213d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return;
2214d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    }
2215d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    networkStateNotifier().setWebConnectionTypeForTest(webtype);
22165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2217d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
2218197021e6b966cfb06891637935ef33fff06433d1Ben Murdochunsigned Internals::countHitRegions(CanvasRenderingContext2D* context)
2219197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
2220197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return context->hitRegionsCount();
2221197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
2222197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2223e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)String Internals::serializeNavigationMarkup()
2224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
2225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Vector<Document::TransitionElementData> elementData;
2226197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    frame()->document()->getTransitionElementData(elementData);
2227197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2228197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    StringBuilder markup;
2229197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    Vector<Document::TransitionElementData>::iterator iter = elementData.begin();
2230197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (; iter != elementData.end(); ++iter)
2231197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        markup.append(iter->markup);
2232197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2233197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return markup.toString();
2234197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
2235197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2236e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void Internals::hideAllTransitionElements()
2237e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
2238e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Vector<Document::TransitionElementData> elementData;
2239e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    frame()->document()->getTransitionElementData(elementData);
2240e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
2241e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Vector<Document::TransitionElementData>::iterator iter = elementData.begin();
2242e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    for (; iter != elementData.end(); ++iter)
2243e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        frame()->document()->hideTransitionElements(AtomicString(iter->selector));
2244e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
2245e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
22469e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)void Internals::forcePluginPlaceholder(HTMLElement* element, const String& htmlSource, ExceptionState& exceptionState)
22479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles){
22487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!element->isPluginElement()) {
22497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not a plugin.");
22509e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return;
22519e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    }
22527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
22537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    element->ensureUserAgentShadowRoot().setInnerHTML(htmlSource, exceptionState);
22547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (exceptionState.hadException())
22557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
22567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
22577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    toHTMLPlugInElement(element)->setUsePlaceholderContent(true);
22587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
22597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
22607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid Internals::forcePluginPlaceholder(HTMLElement* element, const Dictionary& options, ExceptionState& exceptionState)
22617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
22629e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!element->isPluginElement()) {
22639e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided is not a plugin.");
22649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        return;
22659e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    }
22667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
22677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<PluginPlaceholderElement> placeholder = PluginPlaceholderElement::create(element->document());
22687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String stringValue;
22697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (DictionaryHelper::get(options, "message", stringValue))
22707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        placeholder->setMessage(stringValue);
22717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
22727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ShadowRoot& shadowRoot = element->ensureUserAgentShadowRoot();
22737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    shadowRoot.removeChildren();
22747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    shadowRoot.appendChild(placeholder.release(), exceptionState);
22757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (exceptionState.hadException())
22767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
22777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
22789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    toHTMLPlugInElement(element)->setUsePlaceholderContent(true);
22799e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}
22809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
22817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciIterator* Internals::iterator(ScriptState* scriptState, ExceptionState& exceptionState)
22827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
22837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return new InternalsIterator;
22847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
22857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
2287