15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// How ownership works
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// -------------------
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Big oh represents a refcounted relationship: owner O--- ownee
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebView (for the toplevel frame only)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//    O
3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)//    |           WebFrame
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)//    |              O
4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)//    |              |
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)//   Page O------- LocalFrame (m_mainFrame) O-------O FrameView
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//                   ||
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//                   ||
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)//               FrameLoader
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// FrameLoader and LocalFrame are formerly one object that was split apart because
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// it got too big. They basically have the same lifetime, hence the double line.
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// From the perspective of the embedder, WebFrame is simply an object that it
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// allocates by calling WebFrame::create() and must be freed by calling close().
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Internally, WebFrame is actually refcounted and it holds a reference to its
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// corresponding LocalFrame in blink.
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci//
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Oilpan: the middle objects + Page in the above diagram are Oilpan heap allocated,
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// WebView and FrameView are currently not. In terms of ownership and control, the
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// relationships stays the same, but the references from the off-heap WebView to the
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// on-heap Page is handled by a Persistent<>, not a RefPtr<>. Similarly, the mutual
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// strong references between the on-heap LocalFrame and the off-heap FrameView
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// is through a RefPtr (from LocalFrame to FrameView), and a Persistent refers
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// to the LocalFrame in the other direction.
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci//
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// From the embedder's point of view, the use of Oilpan brings no changes. close()
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// must still be used to signal that the embedder is through with the WebFrame.
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Calling it will bring about the release and finalization of the frame object,
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// and everything underneath.
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// How frames are destroyed
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ------------------------
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The main frame is never destroyed and is re-used. The FrameLoader is re-used
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// and a reference to the main frame is kept by the Page.
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// When frame content is replaced, all subframes are destroyed. This happens
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// in FrameLoader::detachFromParent for each subframe in a pre-order depth-first
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// traversal. Note that child node order may not match DOM node order!
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// detachFromParent() calls FrameLoaderClient::detachedFromParent(), which calls
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// WebFrame::frameDetached(). This triggers WebFrame to clear its reference to
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// LocalFrame, and also notifies the embedder via WebFrameClient that the frame is
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// detached. Most embedders will invoke close() on the WebFrame at this point,
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// triggering its deletion unless something else is still retaining a reference.
811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)//
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// The client is expected to be set whenever the WebLocalFrameImpl is attached to
831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)// the DOM.
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
86f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/DOMWrapperWorld.h"
89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
90197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionStatePlaceholder.h"
91197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptController.h"
92197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptSourceCode.h"
93197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptValue.h"
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/V8Binding.h"
95197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8GCController.h"
96197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8PerIsolateData.h"
9776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/HTMLNames.h"
9853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/IconURL.h"
10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/MessagePort.h"
10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
10253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h"
103e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/Editor.h"
10553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
1063c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/editing/InputMethodController.h"
107f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/editing/PlainTextRange.h"
1081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/editing/SpellChecker.h"
10953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextAffinity.h"
11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h"
11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/htmlediting.h"
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/markup.h"
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/fetch/ResourceFetcher.h"
1141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Console.h"
11576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h"
1165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/frame/FrameHost.h"
117bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/frame/FrameView.h"
11810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/frame/Settings.h"
119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/HTMLAnchorElement.h"
12053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCollection.h"
12153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h"
12243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)#include "core/html/HTMLFrameElementBase.h"
12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h"
12453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLHeadElement.h"
12553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
12653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLLinkElement.h"
12753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/PluginDocument.h"
128e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h"
12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorController.h"
13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
13153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
13253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoadRequest.h"
13353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/loader/HistoryItem.h"
13553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/SubstituteData.h"
13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
13753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
13853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
13953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
14153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PrintContext.h"
14253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
14353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h"
14453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderFrame.h"
14553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
14653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
14753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTreeAsText.h"
14853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
14953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/StyleInheritedData.h"
1501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/timing/Performance.h"
151f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "modules/geolocation/GeolocationController.h"
1526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "modules/notifications/NotificationController.h"
153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "modules/notifications/NotificationPermissionClient.h"
1545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "modules/screen_orientation/ScreenOrientationController.h"
1551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
1561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h"
1571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/clipboard/ClipboardUtilities.h"
158a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h"
159a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayerClient.h"
161a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/skia/SkiaUtils.h"
162a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "platform/heap/Handle.h"
163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/ResourceRequest.h"
1641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/scroll/ScrollTypes.h"
16510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/scroll/ScrollbarTheme.h"
16651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURL.h"
16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SchemeRegistry.h"
16851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityPolicy.h"
169e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/Platform.h"
170e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebFloatPoint.h"
171e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebFloatRect.h"
17209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebLayer.h"
173e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebPoint.h"
174e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebRect.h"
175e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebSize.h"
176e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebURLError.h"
177e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebVector.h"
178f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebConsoleMessage.h"
179f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDOMEvent.h"
180f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocument.h"
181f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFindOptions.h"
182f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFormElement.h"
183f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFrameClient.h"
184f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebHistoryItem.h"
185f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebIconURL.h"
186f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputElement.h"
187f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h"
188f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPerformance.h"
189f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPlugin.h"
190f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPrintParams.h"
191f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebRange.h"
192f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebScriptSource.h"
193f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebSecurityOrigin.h"
194f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebSerializedScriptValue.h"
195f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/AssociatedURLLoader.h"
196f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/CompositionUnderlineVectorBuilder.h"
197f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/FindInPageCoordinates.h"
198f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "web/GeolocationClientProxy.h"
1995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/LocalFileSystemClient.h"
2005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/MIDIClientProxy.h"
201197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "web/NotificationPermissionClientImpl.h"
202f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PageOverlay.h"
203f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/SharedWorkerRepositoryClientImpl.h"
204f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/TextFinder.h"
205f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDataSourceImpl.h"
206f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDevToolsAgentPrivate.h"
207f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h"
208f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
209e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/CurrentTime.h"
210e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/HashMap.h"
21110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include <algorithm>
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int frameCount = 0;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Key for a StatsCounter tracking how many WebFrames are active.
218f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static const char webFrameActiveCount[] = "WebFrameActiveCount";
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
220d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static void frameContentAsPlainText(size_t maxChars, LocalFrame* frame, StringBuilder& output)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = frame->document();
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame->view())
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Select the document body.
230a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range(document->createRange());
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    range->selectNodeContents(document->body(), exceptionState);
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!exceptionState.hadException()) {
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The text iterator will walk nodes giving us text. This is similar to
23653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // the plainText() function in core/editing/TextIterator.h, but we implement the maximum
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // size and also copy the results directly into a wstring, avoiding the
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // string conversion.
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (TextIterator it(range.get()); !it.atEnd(); it.advance()) {
2407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            it.appendTextToStringBuilder(output, 0, maxChars - output.length());
2417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            if (output.length() >= maxChars)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return; // Filled up the buffer.
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The separator between frames when the frames are converted to plain text.
2477757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    const LChar frameSeparator[] = { '\n', '\n' };
2487757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    const size_t frameSeparatorLength = WTF_ARRAY_LENGTH(frameSeparator);
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Recursively walk the children.
251f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    const FrameTree& frameTree = frame->tree();
2525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* curChild = frameTree.firstChild(); curChild; curChild = curChild->tree().nextSibling()) {
2535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!curChild->isLocalFrame())
2545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            continue;
2555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        LocalFrame* curLocalChild = toLocalFrame(curChild);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ignore the text of non-visible frames.
2575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RenderView* contentRenderer = curLocalChild->contentRenderer();
2585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RenderPart* ownerRenderer = curLocalChild->ownerRenderer();
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!contentRenderer || !contentRenderer->width() || !contentRenderer->height()
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || (contentRenderer->x() + contentRenderer->width() <= 0) || (contentRenderer->y() + contentRenderer->height() <= 0)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || (ownerRenderer && ownerRenderer->style() && ownerRenderer->style()->visibility() != VISIBLE)) {
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make sure the frame separator won't fill up the buffer, and give up if
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // it will. The danger is if the separator will make the buffer longer than
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // maxChars. This will cause the computation above:
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //   maxChars - output->size()
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // to be a negative number which will crash when the subframe is added.
2707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (output.length() >= maxChars - frameSeparatorLength)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        output.append(frameSeparator, frameSeparatorLength);
2745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        frameContentAsPlainText(maxChars, curLocalChild, output);
2757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (output.length() >= maxChars)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return; // Filled up the buffer.
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebPluginContainerImpl* WebLocalFrameImpl::pluginContainerFromFrame(LocalFrame* frame)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame->document() || !frame->document()->isPluginDocument())
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    PluginDocument* pluginDocument = toPluginDocument(frame->document());
28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return toWebPluginContainerImpl(pluginDocument->pluginWidget());
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
290e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebPluginContainerImpl* WebLocalFrameImpl::pluginContainerFromNode(LocalFrame* frame, const WebNode& node)
2915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
2925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame);
2935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (pluginContainer)
2945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return pluginContainer;
29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return toWebPluginContainerImpl(node.pluginContainer());
2965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Simple class to override some of PrintContext behavior. Some of the methods
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// made virtual so that they can be overridden by ChromePluginPrintContext.
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ChromePrintContext : public PrintContext {
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(ChromePrintContext);
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
303d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ChromePrintContext(LocalFrame* frame)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : PrintContext(frame)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_printedPageWidth(0)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~ChromePrintContext() { }
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void begin(float width, float height)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_printedPageWidth);
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_printedPageWidth = width;
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PrintContext::begin(m_printedPageWidth, height);
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float getPageShrink(int pageNumber) const
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect pageRect = m_pageRects[pageNumber];
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_printedPageWidth / pageRect.width();
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
324e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    float spoolSinglePage(GraphicsContext& graphicsContext, int pageNumber)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
326018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        // FIXME: Why is it ok to proceed without all the null checks that
327018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        // spoolAllPagesWithBoundaries does?
328e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        frame()->view()->updateLayoutAndStyleForPainting();
329e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return spoolPage(graphicsContext, pageNumber);
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void spoolAllPagesWithBoundaries(GraphicsContext& graphicsContext, const FloatSize& pageSizeInPixels)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
334018c2aa55614eda57c6617f8d0747eacefc389a3Ben Murdoch        if (!frame()->document() || !frame()->view() || !frame()->document()->renderView())
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
337e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        frame()->view()->updateLayoutAndStyleForPainting();
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        float pageHeight;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        computePageRects(FloatRect(FloatPoint(0, 0), pageSizeInPixels), 0, 0, 1, pageHeight);
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const float pageWidth = pageSizeInPixels.width();
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size_t numPages = pageRects().size();
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int totalHeight = numPages * (pageSizeInPixels.height() + 1) - 1;
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Fill the whole background by white.
3475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        graphicsContext.setFillColor(Color::white);
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        graphicsContext.fillRect(FloatRect(0, 0, pageWidth, totalHeight));
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int currentHeight = 0;
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t pageIndex = 0; pageIndex < numPages; pageIndex++) {
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Draw a line for a page boundary if this isn't the first page.
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (pageIndex > 0) {
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                graphicsContext.save();
3555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                graphicsContext.setStrokeColor(Color(0, 0, 255));
3565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                graphicsContext.setFillColor(Color(0, 0, 255));
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                graphicsContext.drawLine(IntPoint(0, currentHeight), IntPoint(pageWidth, currentHeight));
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                graphicsContext.restore();
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            graphicsContext.save();
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            graphicsContext.translate(0, currentHeight);
3648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) || OS(MACOSX)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Account for the disabling of scaling in spoolPage. In the context
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // of spoolAllPagesWithBoundaries the scale HAS NOT been pre-applied.
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            float scale = getPageShrink(pageIndex);
3685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            graphicsContext.scale(scale, scale);
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            spoolPage(graphicsContext, pageIndex);
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            graphicsContext.restore();
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currentHeight += pageSizeInPixels.height() + 1;
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
377e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)protected:
378e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // Spools the printed page, a subrect of frame(). Skip the scale step.
379e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // NativeTheme doesn't play well with scaling. Scaling is done browser side
380e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // instead. Returns the scale to be applied.
381e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // On Linux, we don't have the problem with NativeTheme, hence we let WebKit
382e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // do the scaling and ignore the return value.
383e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual float spoolPage(GraphicsContext& context, int pageNumber)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
385e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        IntRect pageRect = m_pageRects[pageNumber];
386e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        float scale = m_printedPageWidth / pageRect.width();
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
388e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        context.save();
389e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#if OS(POSIX) && !OS(MACOSX)
390e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        context.scale(scale, scale);
391e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#endif
392e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        context.translate(static_cast<float>(-pageRect.x()), static_cast<float>(-pageRect.y()));
393e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        context.clip(pageRect);
394e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        frame()->view()->paintContents(&context, pageRect);
3957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        outputLinkAndLinkedDestinations(context, frame()->document(), pageRect);
396e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        context.restore();
397e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return scale;
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set when printing.
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float m_printedPageWidth;
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Simple class to override some of PrintContext behavior. This is used when
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the frame hosts a plugin that supports custom printing. In this case, we
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// want to delegate all printing related calls to the plugin.
408197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass ChromePluginPrintContext FINAL : public ChromePrintContext {
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ChromePluginPrintContext(LocalFrame* frame, WebPluginContainerImpl* plugin, const WebPrintParams& printParams)
411e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        : ChromePrintContext(frame), m_plugin(plugin), m_printParams(printParams)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~ChromePluginPrintContext() { }
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
417e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void begin(float width, float height) OVERRIDE
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
421e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void end() OVERRIDE
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_plugin->printEnd();
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
426e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual float getPageShrink(int pageNumber) const OVERRIDE
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We don't shrink the page (maybe we should ask the widget ??)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 1.0;
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
432e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight) OVERRIDE
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_printParams.printContentArea = IntRect(printRect);
435e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_pageRects.fill(IntRect(printRect), m_plugin->printBegin(m_printParams));
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
438e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual void computePageRectsWithPageSize(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling) OVERRIDE
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
440e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        ASSERT_NOT_REACHED();
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
443e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)protected:
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Spools the printed page, a subrect of frame(). Skip the scale step.
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // NativeTheme doesn't play well with scaling. Scaling is done browser side
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // instead. Returns the scale to be applied.
447e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    virtual float spoolPage(GraphicsContext& context, int pageNumber) OVERRIDE
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_plugin->printPage(pageNumber, &context);
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 1.0;
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set when printing.
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* m_plugin;
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPrintParams m_printParams;
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebDataSource* DataSourceForDocLoader(DocumentLoader* loader)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return loader ? WebDataSourceImpl::fromDocumentLoader(loader) : 0;
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebFrame -------------------------------------------------------------------
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int WebFrame::instanceCount()
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frameCount;
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4716f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::frameForCurrentContext()
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
473a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::Handle<v8::Context> context = v8::Isolate::GetCurrent()->GetCurrentContext();
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (context.IsEmpty())
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frameForContext(context);
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4796f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::frameForContext(v8::Handle<v8::Context> context)
480e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
48110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return WebLocalFrameImpl::fromFrame(toFrameIfNotDetached(context));
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4846f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::fromFrameOwnerElement(const WebElement& element)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
486323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return WebLocalFrameImpl::fromFrameOwnerElement(PassRefPtrWillBeRawPtr<Element>(element).get());
48710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
48810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
48910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isWebLocalFrame() const
49010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
49110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return true;
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrame* WebLocalFrameImpl::toWebLocalFrame()
49510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
49610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return this;
49710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
49810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
49910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isWebRemoteFrame() const
50010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
50110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return false;
50210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
50310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
50410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRemoteFrame* WebLocalFrameImpl::toWebRemoteFrame()
50510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
50610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ASSERT_NOT_REACHED();
50710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return 0;
50810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
50910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
51010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::close()
5111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
5121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_client = 0;
5135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
5147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN)
5157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_selfKeepAlive.clear();
5167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#else
5171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    deref(); // Balances ref() acquired in WebFrame::create
5187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
5191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
5201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
52110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::uniqueName() const
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
523f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->tree().uniqueName();
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::assignedName() const
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
528f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->tree().name();
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setName(const WebString& name)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
533f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->tree().setName(name);
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebVector<WebIconURL> WebLocalFrameImpl::iconURLs(int iconTypesMask) const
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The URL to the icon may be in the header. As such, only
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ask the loader for the icon if it's finished loading.
540f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (frame()->loader().state() == FrameStateComplete)
54151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return frame()->document()->iconURLs(iconTypesMask);
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebVector<WebIconURL>();
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setIsRemote(bool isRemote)
54609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
54709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_isRemote = isRemote;
54809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isRemote)
54909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        client()->initializeChildFrame(frame()->view()->frameRect(), frame()->view()->visibleContentScaleFactor());
55009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
55109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
55210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setRemoteWebLayer(WebLayer* webLayer)
55309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
55409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!frame())
55509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
55609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
55709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame()->setRemotePlatformLayer(webLayer);
55809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
55909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
56010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setPermissionClient(WebPermissionClient* permissionClient)
56109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
56209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_permissionClient = permissionClient;
56309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
56409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
56510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setSharedWorkerRepositoryClient(WebSharedWorkerRepositoryClient* client)
56609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
56709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_sharedWorkerRepositoryClient = SharedWorkerRepositoryClientImpl::create(client);
56809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
56909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
57010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::scrollOffset() const
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frameView();
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebSize();
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view->scrollOffset();
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57810f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::minimumScrollOffset() const
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frameView();
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebSize();
583926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return toIntSize(view->minimumScrollPosition());
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::maximumScrollOffset() const
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frameView();
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebSize();
591926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return toIntSize(view->maximumScrollPosition());
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setScrollOffset(const WebSize& offset)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = frameView())
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        view->setScrollOffset(IntPoint(offset.width, offset.height));
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::contentsSize() const
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (FrameView* view = frameView())
6037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return view->contentsSize();
6047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return WebSize();
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasVisibleContent() const
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
609323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (RenderPart* renderer = frame()->ownerRenderer()) {
610323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (renderer->style()->visibility() != VISIBLE)
611323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return false;
612323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
6137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
6147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (FrameView* view = frameView())
6157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return view->visibleWidth() > 0 && view->visibleHeight() > 0;
6167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return false;
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
61910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRect WebLocalFrameImpl::visibleContentRect() const
620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
6217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (FrameView* view = frameView())
6227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return view->visibleContentRect();
6237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return WebRect();
624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
62610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasHorizontalScrollbar() const
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame() && frame()->view() && frame()->view()->horizontalScrollbar();
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasVerticalScrollbar() const
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame() && frame()->view() && frame()->view()->verticalScrollbar();
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebView* WebLocalFrameImpl::view() const
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return viewImpl();
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setOpener(WebFrame* opener)
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
643323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // FIXME: Does this need to move up into WebFrame too?
644323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (WebFrame::opener() && !opener && m_client)
645d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_client->didDisownOpener(this);
646d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
647323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WebFrame::setOpener(opener);
648d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
649d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(m_frame);
650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_frame && m_frame->document())
651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_frame->document()->initSecurityContext();
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDocument WebLocalFrameImpl::document() const
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame() || !frame()->document())
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebDocument();
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebDocument(frame()->document());
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebPerformance WebLocalFrameImpl::performance() const
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebPerformance();
665d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebPerformance(&frame()->domWindow()->performance());
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::dispatchBeforeUnloadEvent()
66907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
67007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!frame())
67107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return true;
67207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return frame()->loader().shouldClose();
67307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
67407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
67510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::dispatchUnloadEvent()
676aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
677aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (!frame())
678aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return;
679aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    frame()->loader().closeURL();
680aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
681aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
68210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochNPObject* WebLocalFrameImpl::windowObject() const
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
686f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->script().windowScriptNPObject();
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::bindToWindowObject(const WebString& name, NPObject* object)
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
691e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bindToWindowObject(name, object, 0);
692e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
693e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
69410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::bindToWindowObject(const WebString& name, NPObject* object, void*)
695e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
696f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!frame() || !frame()->script().canExecuteScripts(NotAboutToExecuteScript))
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
698f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->script().bindToWindowObject(frame(), String(name), object);
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
70110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::executeScript(const WebScriptSource& source)
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextPosition position(OrdinalNumber::fromOneBasedInt(source.startLine), OrdinalNumber::first());
7055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::HandleScope handleScope(toIsolate(frame()));
706f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->script().executeScriptInMainWorld(ScriptSourceCode(source.code, source.url, position));
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
70910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::executeScriptInIsolatedWorld(int worldID, const WebScriptSource* sourcesIn, unsigned numSources, int extensionGroup)
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
712e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID > 0);
713e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID < EmbedderWorldIdLimit);
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<ScriptSourceCode> sources;
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < numSources; ++i) {
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TextPosition position(OrdinalNumber::fromOneBasedInt(sourcesIn[i].startLine), OrdinalNumber::first());
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sources.append(ScriptSourceCode(sourcesIn[i].code, sourcesIn[i].url, position));
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::HandleScope handleScope(toIsolate(frame()));
722f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->script().executeScriptInIsolatedWorld(worldID, sources, extensionGroup, 0);
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
72510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setIsolatedWorldSecurityOrigin(int worldID, const WebSecurityOrigin& securityOrigin)
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOMWrapperWorld::setIsolatedWorldSecurityOrigin(worldID, securityOrigin.get());
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setIsolatedWorldContentSecurityPolicy(int worldID, const WebString& policy)
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOMWrapperWorld::setIsolatedWorldContentSecurityPolicy(worldID, policy);
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebLocalFrameImpl::setIsolatedWorldHumanReadableName(int worldID, const WebString& humanReadableName)
7387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
7397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(frame());
7407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DOMWrapperWorld::setIsolatedWorldHumanReadableName(worldID, humanReadableName);
7417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
7427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
74310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::addMessageToConsole(const WebConsoleMessage& message)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MessageLevel webCoreMessageLevel;
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (message.level) {
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case WebConsoleMessage::LevelDebug:
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        webCoreMessageLevel = DebugMessageLevel;
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebConsoleMessage::LevelLog:
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webCoreMessageLevel = LogMessageLevel;
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebConsoleMessage::LevelWarning:
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webCoreMessageLevel = WarningMessageLevel;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebConsoleMessage::LevelError:
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webCoreMessageLevel = ErrorMessageLevel;
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
766e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    frame()->document()->addConsoleMessage(ConsoleMessage::create(OtherMessageSource, webCoreMessageLevel, message.text));
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::collectGarbage()
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
77309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!frame()->settings()->scriptEnabled())
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
77593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    V8GCController::collectGarbage(v8::Isolate::GetCurrent());
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::checkIfRunInsecureContent(const WebURL& url) const
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
781197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return frame()->loader().mixedContentChecker()->canFrameInsecureContent(frame()->document()->securityOrigin(), url);
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochv8::Handle<v8::Value> WebLocalFrameImpl::executeScriptAndReturnValue(const WebScriptSource& source)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextPosition position(OrdinalNumber::fromOneBasedInt(source.startLine), OrdinalNumber::first());
7895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return frame()->script().executeScriptInMainWorldAndReturnValue(ScriptSourceCode(source.code, source.url, position));
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::executeScriptInIsolatedWorld(int worldID, const WebScriptSource* sourcesIn, unsigned numSources, int extensionGroup, WebVector<v8::Local<v8::Value> >* results)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
795e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID > 0);
796e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID < EmbedderWorldIdLimit);
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<ScriptSourceCode> sources;
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < numSources; ++i) {
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TextPosition position(OrdinalNumber::fromOneBasedInt(sourcesIn[i].startLine), OrdinalNumber::first());
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sources.append(ScriptSourceCode(sourcesIn[i].code, sourcesIn[i].url, position));
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (results) {
8065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        Vector<v8::Local<v8::Value> > scriptResults;
807f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        frame()->script().executeScriptInIsolatedWorld(worldID, sources, extensionGroup, &scriptResults);
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebVector<v8::Local<v8::Value> > v8Results(scriptResults.size());
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < scriptResults.size(); i++)
8105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            v8Results[i] = v8::Local<v8::Value>::New(toIsolate(frame()), scriptResults[i]);
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results->swap(v8Results);
812f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    } else {
8135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        v8::HandleScope handleScope(toIsolate(frame()));
814f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        frame()->script().executeScriptInIsolatedWorld(worldID, sources, extensionGroup, 0);
815f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
81810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochv8::Handle<v8::Value> WebLocalFrameImpl::callFunctionEvenIfScriptDisabled(v8::Handle<v8::Function> function, v8::Handle<v8::Value> receiver, int argc, v8::Handle<v8::Value> argv[])
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
821f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->script().callFunction(function, receiver, argc, argv);
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochv8::Local<v8::Context> WebLocalFrameImpl::mainWorldScriptContext() const
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
826f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return toV8Context(frame(), DOMWrapperWorld::mainWorld());
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::reload(bool ignoreCache)
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
832f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().reload(ignoreCache ? EndToEndReload : NormalReload);
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
83510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::reloadWithOverrideURL(const WebURL& overrideUrl, bool ignoreCache)
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
838f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().reload(ignoreCache ? EndToEndReload : NormalReload, overrideUrl);
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadRequest(const WebURLRequest& request)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!request.isNull());
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ResourceRequest& resourceRequest = request.toResourceRequest();
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceRequest.url().protocolIs("javascript")) {
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        loadJavaScriptURL(resourceRequest.url());
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
852f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().load(FrameLoadRequest(0, resourceRequest));
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadHistoryItem(const WebHistoryItem& item, WebHistoryLoadType loadType, WebURLRequest::CachePolicy cachePolicy)
856a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
857a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT(frame());
858a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtr<HistoryItem> historyItem = PassRefPtr<HistoryItem>(item);
859a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT(historyItem);
860a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    frame()->loader().loadHistoryItem(historyItem.get(), static_cast<HistoryLoadType>(loadType), static_cast<ResourceRequestCachePolicy>(cachePolicy));
861a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
862a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
86310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadData(const WebData& data, const WebString& mimeType, const WebString& textEncoding, const WebURL& baseURL, const WebURL& unreachableURL, bool replace)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we are loading substitute data to replace an existing load, then
86810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // inherit all of the properties of that original request. This way,
86910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // reload will re-attempt the original request. It is essential that
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we only do this when there is an unreachableURL since a non-empty
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // unreachableURL informs FrameLoader::reload to load unreachableURL
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // instead of the currently loaded URL.
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceRequest request;
87409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (replace && !unreachableURL.isEmpty() && frame()->loader().provisionalDocumentLoader())
87509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        request = frame()->loader().provisionalDocumentLoader()->originalRequest();
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    request.setURL(baseURL);
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
878e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    FrameLoadRequest frameRequest(0, request, SubstituteData(data, mimeType, textEncoding, unreachableURL));
879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(frameRequest.substituteData().isValid());
880fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    frameRequest.setLockBackForwardList(replace);
881f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().load(frameRequest);
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadHTMLString(const WebData& data, const WebURL& baseURL, const WebURL& unreachableURL, bool replace)
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    loadData(data, WebString::fromUTF8("text/html"), WebString::fromUTF8("UTF-8"), baseURL, unreachableURL, replace);
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::stopLoading()
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
89410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // FIXME: Figure out what we should really do here. It seems like a bug
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // that FrameLoader::stopLoading doesn't call stopAllLoaders.
896f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().stopAllLoaders();
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSource* WebLocalFrameImpl::provisionalDataSource() const
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We regard the policy document loader as still provisional.
904f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    DocumentLoader* documentLoader = frame()->loader().provisionalDocumentLoader();
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentLoader)
906f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        documentLoader = frame()->loader().policyDocumentLoader();
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return DataSourceForDocLoader(documentLoader);
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSource* WebLocalFrameImpl::dataSource() const
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
914f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return DataSourceForDocLoader(frame()->loader().documentLoader());
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::enableViewSourceMode(bool enable)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frame())
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame()->setInViewSourceMode(enable);
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isViewSourceModeEnabled() const
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->inViewSourceMode();
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setReferrerForRequest(WebURLRequest& request, const WebURL& referrerURL)
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
93209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    String referrer = referrerURL.isEmpty() ? frame()->document()->outgoingReferrer() : String(referrerURL.spec().utf16());
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    referrer = SecurityPolicy::generateReferrerHeader(frame()->document()->referrerPolicy(), request.url(), referrer);
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (referrer.isEmpty())
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
93609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    request.setHTTPReferrer(referrer, static_cast<WebReferrerPolicy>(frame()->document()->referrerPolicy()));
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::dispatchWillSendRequest(WebURLRequest& request)
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceResponse response;
942f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().client()->dispatchWillSendRequest(0, 0, request.toMutableResourceRequest(), response);
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
94510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebURLLoader* WebLocalFrameImpl::createAssociatedURLLoader(const WebURLLoaderOptions& options)
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new AssociatedURLLoader(this, options);
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochunsigned WebLocalFrameImpl::unloadListenerCount() const
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return frame()->domWindow()->pendingUnloadEventListeners();
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::replaceSelection(const WebString& text)
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool selectReplacement = false;
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool smartReplace = true;
959c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    frame()->editor().replaceSelectionWithText(text, selectReplacement, smartReplace);
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::insertText(const WebString& text)
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9643c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (frame()->inputMethodController().hasComposition())
9653c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        frame()->inputMethodController().confirmComposition(text);
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
967c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        frame()->editor().insertText(text, 0);
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setMarkedText(const WebString& text, unsigned location, unsigned length)
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<CompositionUnderline> decorations;
9733c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    frame()->inputMethodController().setComposition(text, decorations, location, length);
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::unmarkText()
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9783c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    frame()->inputMethodController().cancelComposition();
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasMarkedText() const
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9833c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    return frame()->inputMethodController().hasComposition();
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRange WebLocalFrameImpl::markedRange() const
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9883c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    return frame()->inputMethodController().compositionRange();
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::firstRectForCharacterRange(unsigned location, unsigned length, WebRect& rect) const
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((location + length < location) && (location + length))
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = 0;
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
996f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Element* editable = frame()->selection().rootEditableElementOrDocumentElement();
997f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(editable);
998a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = PlainTextRange(location, location + length).createRange(*editable);
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1001c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    IntRect intRect = frame()->editor().firstRectForRange(range.get());
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect = WebRect(intRect);
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect = frame()->view()->contentsToWindow(rect);
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochsize_t WebLocalFrameImpl::characterIndexForPoint(const WebPoint& webPoint) const
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
101006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point = frame()->view()->windowToContents(webPoint);
1013197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HitTestResult result = frame()->eventHandler().hitTestResultAtPoint(point, HitTestRequest::ReadOnly | HitTestRequest::Active);
1014a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = frame()->rangeForPoint(result.roundedPointInInnerNodeFrame());
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
101606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
1017f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Element* editable = frame()->selection().rootEditableElementOrDocumentElement();
1018f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(editable);
1019f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return PlainTextRange::create(*editable, *range.get()).start();
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
102210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::executeCommand(const WebString& name, const WebNode& node)
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name.length() <= 2)
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Since we don't have NSControl, we will convert the format of command
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // string and call the function on Editor directly.
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String command = name;
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure the first letter is upper case.
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    command.replace(0, 1, command.substring(0, 1).upper());
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Remove the trailing ':' if existing.
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (command[command.length() - 1] == UChar(':'))
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        command = command.substring(0, command.length() - 1);
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromNode(frame(), node);
104153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (pluginContainer && pluginContainer->executeEditCommand(name))
104253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1044197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return frame()->editor().executeCommand(command);
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::executeCommand(const WebString& name, const WebString& value, const WebNode& node)
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromNode(frame(), node);
10525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (pluginContainer && pluginContainer->executeEditCommand(name, value))
10535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return true;
10545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1055197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return frame()->editor().executeCommand(name, value);
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isCommandEnabled(const WebString& name) const
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
1061c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return frame()->editor().command(name).isEnabled();
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::enableContinuousSpellChecking(bool enable)
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (enable == isContinuousSpellCheckingEnabled())
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->spellChecker().toggleContinuousSpellChecking();
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
107110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isContinuousSpellCheckingEnabled() const
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return frame()->spellChecker().isContinuousSpellCheckingEnabled();
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
107610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::requestTextChecking(const WebElement& webElement)
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webElement.isNull())
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->spellChecker().requestTextChecking(*webElement.constUnwrap<Element>());
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
108310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::replaceMisspelledRange(const WebString& text)
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this caret selection has two or more markers, this function replace the range covered by the first marker with the specified word as Microsoft Word does.
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainerFromFrame(frame()))
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1088197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    frame()->spellChecker().replaceMisspelledRange(text);
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
109110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::removeSpellingMarkers()
109253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1093197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    frame()->spellChecker().removeSpellingMarkers();
109453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
109553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
109610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasSelection() const
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->plugin()->hasSelection();
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // frame()->selection()->isNone() never returns true.
11038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return frame()->selection().start() != frame()->selection().end();
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRange WebLocalFrameImpl::selectionRange() const
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return frame()->selection().toNormalizedRange();
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::selectionAsText() const
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->plugin()->selectionAsText();
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1117a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = frame()->selection().toNormalizedRange();
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String text = range->text();
11228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replaceNewlinesWithWindowsStyleNewlines(text);
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replaceNBSPWithSpace(text);
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return text;
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::selectionAsMarkup() const
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->plugin()->selectionAsMarkup();
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = frame()->selection().toNormalizedRange();
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return createMarkup(range.get(), 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
114210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::selectWordAroundPosition(LocalFrame* frame, VisiblePosition position)
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisibleSelection selection(position);
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selection.expandUsingGranularity(WordGranularity);
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    TextGranularity granularity = selection.isRange() ? WordGranularity : CharacterGranularity;
11481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame->selection().setSelection(selection, granularity);
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
115110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::selectWordAroundCaret()
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameSelection& selection = frame()->selection();
11548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (selection.isNone() || selection.isRange())
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
11568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    selectWordAroundPosition(frame(), selection.selection().visibleStart());
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
116010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::selectRange(const WebPoint& base, const WebPoint& extent)
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
116293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    moveRangeSelection(base, extent);
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
116510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::selectRange(const WebRange& webRange)
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1167a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (RefPtrWillBeRawPtr<Range> range = static_cast<PassRefPtrWillBeRawPtr<Range> >(webRange))
1168e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        frame()->selection().setSelectedRange(range.get(), VP_DEFAULT_AFFINITY, FrameSelection::NonDirectional, NotUserTriggered);
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
117110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::moveRangeSelection(const WebPoint& base, const WebPoint& extent)
117293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
117393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisiblePosition basePosition = visiblePositionForWindowPoint(base);
117493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisiblePosition extentPosition = visiblePositionForWindowPoint(extent);
117593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisibleSelection newSelection = VisibleSelection(basePosition, extentPosition);
11761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->selection().setSelection(newSelection, CharacterGranularity);
117793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
117893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
117910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::moveCaretSelection(const WebPoint& point)
118093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
11818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* editable = frame()->selection().rootEditableElement();
1182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!editable)
1183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
118593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisiblePosition position = visiblePositionForWindowPoint(point);
11861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->selection().moveTo(position, UserTriggered);
1187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
118910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::setEditableSelectionOffsets(int start, int end)
119007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
119107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return frame()->inputMethodController().setEditableSelectionOffsets(PlainTextRange(start, end));
119207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
119307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
119410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::setCompositionFromExistingText(int compositionStart, int compositionEnd, const WebVector<WebCompositionUnderline>& underlines)
119507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
119607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!frame()->editor().canEdit())
119707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return false;
119807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
119907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    InputMethodController& inputMethodController = frame()->inputMethodController();
120007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    inputMethodController.cancelComposition();
120107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
120207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (compositionStart == compositionEnd)
120307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return true;
120407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
120507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    inputMethodController.setCompositionFromExistingText(CompositionUnderlineVectorBuilder(underlines), compositionStart, compositionEnd);
120607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
120707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
120807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
120907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
121010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::extendSelectionAndDelete(int before, int after)
121107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
121207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (WebPlugin* plugin = focusedPluginIfInputMethodSupported()) {
121307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        plugin->extendSelectionAndDelete(before, after);
121407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
121507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
121607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    frame()->inputMethodController().extendSelectionAndDelete(before, after);
121707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
121807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
121910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setCaretVisible(bool visible)
1220e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
12218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    frame()->selection().setCaretVisible(visible);
1222e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
1223e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
122410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochVisiblePosition WebLocalFrameImpl::visiblePositionForWindowPoint(const WebPoint& point)
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // FIXME(bokan): crbug.com/371902 - These scale/pinch transforms shouldn't
12275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // be ad hoc and explicit.
12285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    PinchViewport& pinchViewport = frame()->page()->frameHost().pinchViewport();
122993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    FloatPoint unscaledPoint(point);
123093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    unscaledPoint.scale(1 / view()->pageScaleFactor(), 1 / view()->pageScaleFactor());
12315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    unscaledPoint.moveBy(pinchViewport.visibleRect().location());
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1233197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HitTestRequest request = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping;
123493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HitTestResult result(frame()->view()->windowToContents(roundedIntPoint(unscaledPoint)));
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->document()->renderView()->layer()->hitTest(request, result);
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (Node* node = result.innerNode())
12388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return frame()->selection().selection().visiblePositionRespectingEditingBoundary(result.localPoint(), node);
12398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return VisiblePosition();
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
124210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebPlugin* WebLocalFrameImpl::focusedPluginIfInputMethodSupported()
124307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
124410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebPluginContainerImpl* container = WebLocalFrameImpl::pluginContainerFromNode(frame(), WebNode(frame()->document()->focusedElement()));
124507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (container && container->supportsInputMethod())
124607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return container->plugin();
124707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
124807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
124907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
125010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint WebLocalFrameImpl::printBegin(const WebPrintParams& printParams, const WebNode& constrainToNode)
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!frame()->document()->isFrameSet());
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = 0;
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (constrainToNode.isNull()) {
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If this is a plugin document, check if the plugin supports its own
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // printing. If it does, we will delegate all printing to that.
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pluginContainer = pluginContainerFromFrame(frame());
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We only support printing plugin nodes for now.
126009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        pluginContainer = toWebPluginContainerImpl(constrainToNode.pluginContainer());
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer && pluginContainer->supportsPaginatedPrint())
1264197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_printContext = adoptPtrWillBeNoop(new ChromePluginPrintContext(frame(), pluginContainer, printParams));
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1266197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_printContext = adoptPtrWillBeNoop(new ChromePrintContext(frame()));
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect rect(0, 0, static_cast<float>(printParams.printContentArea.width), static_cast<float>(printParams.printContentArea.height));
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->begin(rect.width(), rect.height());
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float pageHeight;
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We ignore the overlays calculation for now since they are generated in the
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // browser. pageHeight is actually an output parameter.
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->computePageRects(rect, 0, 0, 1.0, pageHeight);
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return static_cast<int>(m_printContext->pageCount());
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
127810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochfloat WebLocalFrameImpl::getPrintPageShrink(int page)
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext && page >= 0);
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_printContext->getPageShrink(page);
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochfloat WebLocalFrameImpl::printPage(int page, WebCanvas* canvas)
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(PRINTING)
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext && page >= 0 && frame() && frame()->document());
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext graphicsContext(canvas);
129053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    graphicsContext.setPrinting(true);
1291e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return m_printContext->spoolSinglePage(graphicsContext, page);
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
129710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::printEnd()
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext);
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->end();
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext.clear();
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
130410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isPrintScalingDisabledForPlugin(const WebNode& node)
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
130609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer =  node.isNull() ? pluginContainerFromFrame(frame()) : toWebPluginContainerImpl(node.pluginContainer());
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!pluginContainer || !pluginContainer->supportsPaginatedPrint())
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return pluginContainer->isPrintScalingDisabled();
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1314c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)int WebLocalFrameImpl::getPrintCopiesForPlugin(const WebNode& node)
1315c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1316c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = node.isNull() ? pluginContainerFromFrame(frame()) : toWebPluginContainerImpl(node.pluginContainer());
1317c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1318c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (!pluginContainer || !pluginContainer->supportsPaginatedPrint())
1319c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return 1;
1320c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1321c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return pluginContainer->getCopiesToPrint();
1322c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1323c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
132410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasCustomPageSizeStyle(int pageIndex)
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->document()->styleForPage(pageIndex)->pageSizeType() != PAGE_SIZE_AUTO;
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
132910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isPageBoxVisible(int pageIndex)
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->document()->isPageBoxVisible(pageIndex);
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
133410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::pageSizeAndMarginsInPixels(int pageIndex, WebSize& pageSize, int& marginTop, int& marginRight, int& marginBottom, int& marginLeft)
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize size = pageSize;
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->document()->pageSizeAndMarginsInPixels(pageIndex, size, marginTop, marginRight, marginBottom, marginLeft);
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pageSize = size;
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
134110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::pageProperty(const WebString& propertyName, int pageIndex)
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext);
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_printContext->pageProperty(frame(), propertyName.utf8().data(), pageIndex);
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
134710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::find(int identifier, const WebString& searchText, const WebFindOptions& options, bool wrapWithinFrame, WebRect* selectionRect)
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
134907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return ensureTextFinder().find(identifier, searchText, options, wrapWithinFrame, selectionRect);
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::stopFinding(bool clearSelection)
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
135407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder) {
135507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (!clearSelection)
135607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            setFindEndstateFocusAndSelection();
135707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->stopFindingAndClearSelection();
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::scopeStringMatches(int identifier, const WebString& searchText, const WebFindOptions& options, bool reset)
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
136307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ensureTextFinder().scopeStringMatches(identifier, searchText, options, reset);
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::cancelPendingScopingEffort()
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
136807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
136907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->cancelPendingScopingEffort();
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::increaseMatchCount(int count, int identifier)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This function should only be called on the mainframe.
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
1376f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ensureTextFinder().increaseMatchCount(identifier, count);
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::resetMatchCount()
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1381f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ensureTextFinder().resetMatchCount();
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
138410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::dispatchMessageEventWithOriginCheck(const WebSecurityOrigin& intendedTargetOrigin, const WebDOMEvent& event)
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!event.isNull());
1387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame()->domWindow()->dispatchMessageEventWithOriginCheck(intendedTargetOrigin.get(), event, nullptr);
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint WebLocalFrameImpl::findMatchMarkersVersion() const
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
139507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->findMatchMarkersVersion();
139607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint WebLocalFrameImpl::selectNearestFindMatch(const WebFloatPoint& point, WebRect* selectionRect)
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
140107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(!parent());
1402f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return ensureTextFinder().selectNearestFindMatch(point, selectionRect);
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
140510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebFloatRect WebLocalFrameImpl::activeFindMatchRect()
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
140907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
141007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->activeFindMatchRect();
141107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return WebFloatRect();
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
141410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::findMatchRects(WebVector<WebFloatRect>& outputRects)
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
1417f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ensureTextFinder().findMatchRects(outputRects);
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
142010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setTickmarks(const WebVector<WebRect>& tickmarks)
142143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
142243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (frameView()) {
142343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        Vector<IntRect> tickmarksConverted(tickmarks.size());
142443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        for (size_t i = 0; i < tickmarks.size(); ++i)
142543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            tickmarksConverted[i] = tickmarks[i];
142643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        frameView()->setTickmarks(tickmarksConverted);
142707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        invalidateScrollbar();
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
143110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::contentAsText(size_t maxChars) const
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
14357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    StringBuilder text;
14367757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    frameContentAsPlainText(maxChars, frame(), text);
14377757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return text.toString();
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::contentAsMarkup() const
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
1444c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return createMarkup(frame()->document());
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::renderTreeAsText(RenderAsTextControls toShow) const
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderAsTextBehavior behavior = RenderAsTextBehaviorNormal;
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (toShow & RenderAsTextDebug)
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        behavior |= RenderAsTextShowCompositedLayers | RenderAsTextShowAddresses | RenderAsTextShowIDAndClass | RenderAsTextShowLayerNesting;
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (toShow & RenderAsTextPrinting)
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        behavior |= RenderAsTextPrintingMode;
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return externalRepresentation(frame(), behavior);
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::markerTextForListItem(const WebElement& webElement) const
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1462c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return blink::markerTextForListItem(const_cast<Element*>(webElement.constUnwrap<Element>()));
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::printPagesWithBoundaries(WebCanvas* canvas, const WebSize& pageSizeInPixels)
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext);
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext graphicsContext(canvas);
147053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    graphicsContext.setPrinting(true);
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->spoolAllPagesWithBoundaries(graphicsContext, FloatSize(pageSizeInPixels.width, pageSizeInPixels.height));
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
147510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRect WebLocalFrameImpl::selectionBoundsRect() const
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return hasSelection() ? WebRect(IntRect(frame()->selection().bounds())) : WebRect();
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
148010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::selectionStartHasSpellingMarkerFor(int from, int length) const
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1484197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return frame()->spellChecker().selectionStartHasSpellingMarkerFor(from, length);
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
148710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::layerTreeAsText(bool showDebugInfo) const
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
1491e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1492521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return WebString(frame()->layerTreeAsText(showDebugInfo ? LayerTreeIncludesDebugInfo : LayerTreeNormal));
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
149510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch// WebLocalFrameImpl public ---------------------------------------------------------
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14976f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::create(WebFrameClient* client)
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
149910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return WebLocalFrameImpl::create(client);
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::create(WebFrameClient* client)
15031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
15047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebLocalFrameImpl* frame = new WebLocalFrameImpl(client);
15057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN)
15067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return frame;
15077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#else
15087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return adoptRef(frame).leakRef();
15097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
15101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
15111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
151210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl::WebLocalFrameImpl(WebFrameClient* client)
1513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_frameLoaderClientImpl(this)
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_client(client)
151509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_permissionClient(0)
15161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_inputEventsScaleFactorForEmulation(1)
1517f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_userMediaClientImpl(this)
15187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_geolocationClientProxy(GeolocationClientProxy::create(client ? client->geolocationClient() : 0))
15197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN)
15207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_selfKeepAlive(this)
15217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1523e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->incrementStatsCounter(webFrameActiveCount);
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameCount++;
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
152710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl::~WebLocalFrameImpl()
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1529e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->decrementStatsCounter(webFrameActiveCount);
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameCount--;
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelPendingScopingEffort();
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebLocalFrameImpl::trace(Visitor* visitor)
15367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
15377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN)
15387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    visitor->trace(m_frame);
15397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    visitor->trace(m_printContext);
15407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    visitor->trace(m_geolocationClientProxy);
15417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
15427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WebFrame::traceChildren(visitor, this);
15437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
15447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
15457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
15467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebLocalFrameImpl::setCoreFrame(PassRefPtrWillBeRawPtr<LocalFrame> frame)
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
154809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_frame = frame;
15496f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
15506f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // FIXME: we shouldn't add overhead to every frame by registering these objects when they're not used.
1551f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (m_frame) {
1552323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        OwnPtr<NotificationPresenterImpl> notificationPresenter = adoptPtr(new NotificationPresenterImpl());
1553323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (m_client)
1554323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            notificationPresenter->initialize(m_client->notificationPresenter());
1555323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
1556323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        provideNotification(*m_frame, notificationPresenter.release());
15579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        provideNotificationPermissionClientTo(*m_frame, NotificationPermissionClientImpl::create());
1558f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        provideUserMediaTo(*m_frame, &m_userMediaClientImpl);
1559f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        provideGeolocationTo(*m_frame, m_geolocationClientProxy.get());
1560f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_geolocationClientProxy->setController(GeolocationController::from(m_frame.get()));
15615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        provideMIDITo(*m_frame, MIDIClientProxy::create(m_client ? m_client->webMIDIClient() : 0));
1562197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        provideLocalFileSystemTo(*m_frame, LocalFileSystemClient::create());
1563197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
15645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (RuntimeEnabledFeatures::screenOrientationEnabled())
15655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            ScreenOrientationController::provideTo(*m_frame, m_client ? m_client->webScreenOrientationClient() : 0);
1566f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<LocalFrame> WebLocalFrameImpl::initializeCoreFrame(FrameHost* host, FrameOwner* owner, const AtomicString& name, const AtomicString& fallbackName)
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<LocalFrame> frame = LocalFrame::create(&m_frameLoaderClientImpl, host, owner);
1572e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    setCoreFrame(frame);
1573197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    frame->tree().setName(name, fallbackName);
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We must call init() after m_frame is assigned because it is referenced
1575197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // during init(). Note that this may dispatch JS events; the frame may be
1576197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // detached after init() returns.
1577197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    frame->init();
1578197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return frame;
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<LocalFrame> WebLocalFrameImpl::createChildFrame(const FrameLoadRequest& request, HTMLFrameOwnerElement* ownerElement)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(m_client);
15845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WebLocalFrameImpl* webframeChild = toWebLocalFrameImpl(m_client->createChildFrame(this, request.frameName()));
15855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!webframeChild)
1586d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
15871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1588a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // FIXME: Using subResourceAttributeName as fallback is not a perfect
1589a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // solution. subResourceAttributeName returns just one attribute name. The
1590a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // element might not have the attribute, and there might be other attributes
1591a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // which can identify the element.
15927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<LocalFrame> child = webframeChild->initializeCoreFrame(frame()->host(), ownerElement, request.frameName(), ownerElement->getAttribute(ownerElement->subResourceAttributeName()));
1593e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // Initializing the core frame may cause the new child to be detached, since
1594e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // it may dispatch a load event in the parent.
15955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!child->tree().parent())
1596d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15987757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // If we're moving in the back/forward list, we might want to replace the content
15997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // of this child frame with whatever was there at that point.
1600aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    RefPtr<HistoryItem> childItem;
1601a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (isBackForwardLoadType(frame()->loader().loadType()) && !frame()->document()->loadEventFinished())
16025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        childItem = PassRefPtr<HistoryItem>(webframeChild->client()->historyItemForNewChildFrame(webframeChild));
1603a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1604a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (childItem)
16055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        child->loader().loadHistoryItem(childItem.get());
16067757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    else
16075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        child->loader().load(FrameLoadRequest(0, request.resourceRequest(), "_self"));
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Note a synchronous navigation (about:blank) would have already processed
16105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // onload, so it is possible for the child frame to have already been
16115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // detached by script in the page.
16125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!child->tree().parent())
1613d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
16145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return child;
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
161710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::didChangeContentsSize(const IntSize& size)
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is only possible on the main frame.
162007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder && m_textFinder->totalMatchCount() > 0) {
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!parent());
162207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->increaseMarkerVersion();
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
162610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::createFrameView()
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1628197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT0("blink", "WebLocalFrameImpl::createFrameView");
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame()); // If frame() doesn't exist, we probably didn't init properly.
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewImpl* webView = viewImpl();
1633197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool isLocalRoot = frame()->isLocalRoot();
1634197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (isLocalRoot)
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webView->suppressInvalidations(true);
1636e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1637bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    frame()->createView(webView->size(), webView->baseBackgroundColor(), webView->isTransparent());
1638197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (webView->shouldAutoResize() && isLocalRoot)
16399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        frame()->view()->enableAutoSizeMode(webView->minAutoSize(), webView->maxAutoSize());
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
164119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    frame()->view()->setInputEventsTransformForEmulation(m_inputEventsOffsetForEmulation, m_inputEventsScaleFactorForEmulation);
16421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1643197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (isLocalRoot)
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webView->suppressInvalidations(false);
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
164710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::fromFrame(LocalFrame* frame)
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
165176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    return fromFrame(*frame);
165276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
165376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
165476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)WebLocalFrameImpl* WebLocalFrameImpl::fromFrame(LocalFrame& frame)
165576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
165676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    FrameLoaderClient* client = frame.loader().client();
1657d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!client || !client->isFrameLoaderClientImpl())
1658d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
1659d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return toFrameLoaderClientImpl(client)->webFrame();
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
166210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::fromFrameOwnerElement(Element* element)
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
166410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // FIXME: Why do we check specifically for <iframe> and <frame> here? Why can't we get the WebLocalFrameImpl from an <object> element, for example.
166543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (!isHTMLFrameElementBase(element))
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
166707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return fromFrame(toLocalFrame(toHTMLFrameElementBase(element)->contentFrame()));
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
167010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebViewImpl* WebLocalFrameImpl::viewImpl() const
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebViewImpl::fromPage(frame()->page());
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
167710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSourceImpl* WebLocalFrameImpl::dataSourceImpl() const
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebDataSourceImpl*>(dataSource());
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
168210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSourceImpl* WebLocalFrameImpl::provisionalDataSourceImpl() const
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebDataSourceImpl*>(provisionalDataSource());
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
168710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setFindEndstateFocusAndSelection()
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
168910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* mainFrameImpl = viewImpl()->mainFrameImpl();
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
169107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (this != mainFrameImpl->activeMatchFrame())
169207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
169307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
169407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (Range* activeMatch = m_textFinder->activeMatch()) {
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the user has set the selection since the match was found, we
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // don't focus anything.
16978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        VisibleSelection selection(frame()->selection().selection());
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!selection.isNone())
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Need to clean out style and layout state before querying Element::isFocusable().
17027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        frame()->document()->updateLayoutIgnorePendingStylesheets();
17037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Try to find the first focusable node up the chain, which will, for
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // example, focus links if we have found text within the link.
170607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        Node* node = activeMatch->firstNode();
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node && node->isInShadowTree()) {
1708d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (Node* host = node->shadowHost()) {
1709d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (isHTMLInputElement(*host) || isHTMLTextAreaElement(*host))
1710d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    node = host;
1711d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1713e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        for (; node; node = node->parentNode()) {
1714df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (!node->isElementNode())
1715df95704c49daea886ddad70775bda23618d6274dBen Murdoch                continue;
1716df95704c49daea886ddad70775bda23618d6274dBen Murdoch            Element* element = toElement(node);
1717df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (element->isFocusable()) {
1718e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                // Found a focusable parent node. Set the active match as the
1719e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                // selection and focus to the focusable node.
172007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                frame()->selection().setSelection(VisibleSelection(activeMatch));
1721df95704c49daea886ddad70775bda23618d6274dBen Murdoch                frame()->document()->setFocusedElement(element);
1722e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                return;
1723e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            }
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Iterate over all the nodes in the range until we find a focusable node.
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This, for example, sets focus to the first link if you search for
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // text and text that is within one or more links.
172907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        node = activeMatch->firstNode();
173007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        for (; node && node != activeMatch->pastLastNode(); node = NodeTraversal::next(*node)) {
1731df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (!node->isElementNode())
1732df95704c49daea886ddad70775bda23618d6274dBen Murdoch                continue;
1733df95704c49daea886ddad70775bda23618d6274dBen Murdoch            Element* element = toElement(node);
1734df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (element->isFocusable()) {
1735df95704c49daea886ddad70775bda23618d6274dBen Murdoch                frame()->document()->setFocusedElement(element);
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // No node related to the active match was focusable, so set the
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // active match as the selection (so that when you end the Find session,
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // you'll have the last thing you found highlighted) and make sure that
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // we have nothing focused (otherwise you might have text selected but
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // a link focused, which is weird).
174507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        frame()->selection().setSelection(VisibleSelection(activeMatch));
1746d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        frame()->document()->setFocusedElement(nullptr);
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Finally clear the active match, for two reasons:
17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We just finished the find 'session' and we don't want future (potentially
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // unrelated) find 'sessions' operations to start at the same place.
175110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // The WebLocalFrameImpl could get reused and the activeMatch could end up pointing
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // to a document that is no longer valid. Keeping an invalid reference around
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // is just asking for trouble.
175407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->resetActiveMatch();
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::didFail(const ResourceError& error, bool wasProvisional)
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client())
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURLError webError = error;
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (wasProvisional)
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        client()->didFailProvisionalLoad(this, webError);
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        client()->didFailLoad(this, webError);
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
176910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setCanHaveScrollbars(bool canHaveScrollbars)
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->view()->setCanHaveScrollbars(canHaveScrollbars);
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
177410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setInputEventsTransformForEmulation(const IntSize& offset, float contentScaleFactor)
17751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
177619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    m_inputEventsOffsetForEmulation = offset;
17771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_inputEventsScaleFactorForEmulation = contentScaleFactor;
17781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (frame()->view())
177919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        frame()->view()->setInputEventsTransformForEmulation(m_inputEventsOffsetForEmulation, m_inputEventsScaleFactorForEmulation);
17801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
17811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
178210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadJavaScriptURL(const KURL& url)
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
178493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // This is copied from ScriptController::executeScriptIfJavaScriptURL.
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Unfortunately, we cannot just use that method since it is private, and
178610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // it also doesn't quite behave as we require it to for bookmarklets. The
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // key difference is that we need to suppress loading the string result
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // from evaluating the JS URL if executing the JS URL resulted in a
178910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // location change. We also allow a JS URL to be loaded even if scripts on
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the page are otherwise disabled.
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame()->document() || !frame()->page())
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Document> ownerDocument(frame()->document());
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Protect privileged pages against bookmarklets and other javascript manipulations.
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (SchemeRegistry::shouldTreatURLSchemeAsNotAllowingJavascriptURLs(frame()->document()->url().protocol()))
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String script = decodeURLEscapeSequences(url.string().substring(strlen("javascript:")));
18021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture);
18035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::HandleScope handleScope(toIsolate(frame()));
18045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::Local<v8::Value> result = frame()->script().executeScriptInMainWorldAndReturnValue(ScriptSourceCode(script));
18055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (result.IsEmpty() || !result->IsString())
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    String scriptResult = toCoreString(v8::Handle<v8::String>::Cast(result));
1808f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!frame()->navigationScheduler().locationChangePending())
18097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        frame()->loader().replaceDocumentWhileExecutingJavaScriptURL(scriptResult, ownerDocument.get());
18107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
18117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebLocalFrameImpl::sendPings(const WebNode& linkNode, const WebURL& destinationURL)
18137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
18147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(frame());
18157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const Node* node = linkNode.constUnwrap<Node>();
18167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (isHTMLAnchorElement(node))
18177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        toHTMLAnchorElement(node)->sendPings(destinationURL);
18187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
18197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool WebLocalFrameImpl::isLoading() const
18217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
18227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!frame() || !frame()->document())
18237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
18247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return frame()->loader().stateMachine()->isDisplayingInitialEmptyDocument() || !frame()->document()->loadEventFinished();
18257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
18267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool WebLocalFrameImpl::isResourceLoadInProgress() const
18287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
18297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!frame() || !frame()->document())
18307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return false;
18317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return frame()->document()->fetcher()->requestCount();
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void WebLocalFrameImpl::addStyleSheetByURL(const WebString& url)
183576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
183676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    RefPtrWillBeRawPtr<Element> styleElement = frame()->document()->createElement(HTMLNames::linkTag, false);
183776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
183876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    styleElement->setAttribute(HTMLNames::typeAttr, "text/css");
183976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    styleElement->setAttribute(HTMLNames::relAttr, "stylesheet");
184076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    styleElement->setAttribute(HTMLNames::hrefAttr, url);
184176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
184276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    frame()->document()->head()->appendChild(styleElement.release(), IGNORE_EXCEPTION);
184376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
184476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
18457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebLocalFrameImpl::navigateToSandboxedMarkup(const WebData& markup)
18467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
18477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(document().securityOrigin().isUnique());
18487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    frame()->loader().forceSandboxFlags(SandboxAll);
18497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    loadHTMLString(markup, document().url(), WebURL(), true);
18507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
18517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WebLocalFrameImpl::sendOrientationChangeEvent()
18537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
18547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!frame())
18557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
18567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Screen Orientation API
18587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (ScreenOrientationController::from(*frame()))
18597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ScreenOrientationController::from(*frame())->notifyOrientationChanged();
18607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Legacy window.orientation API.
18627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (RuntimeEnabledFeatures::orientationEventEnabled() && frame()->domWindow())
18637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        frame()->domWindow()->dispatchEvent(Event::create(EventTypeNames::orientationchange));
18647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
18657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciv8::Handle<v8::Value> WebLocalFrameImpl::executeScriptAndReturnValueForTests(const WebScriptSource& source)
18677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
18687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: This fake UserGestureIndicator is required for a bunch of browser
18697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // tests to pass. We should update the tests to simulate input and get rid
18707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // of this.
18717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // http://code.google.com/p/chromium/issues/detail?id=86397
18727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture);
18737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return executeScriptAndReturnValue(source);
18747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
18757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
187610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::willDetachParent()
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Do not expect string scoping results from any frames that got detached
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in the middle of the operation.
188007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder && m_textFinder->scopingInProgress()) {
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // There is a possibility that the frame being detached was the only
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // pending one. We need to make sure final replies can be sent.
188407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->flushCurrentScoping();
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
188607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->cancelPendingScopingEffort();
18875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
189010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::activeMatchFrame() const
189107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
189207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(!parent());
189307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
189407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
189507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->activeMatchFrame();
189607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
189707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
189807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1899e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)Range* WebLocalFrameImpl::activeMatch() const
190007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
190107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
190207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->activeMatch();
190307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
190407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
190507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
190610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochTextFinder& WebLocalFrameImpl::ensureTextFinder()
190707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
190807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!m_textFinder)
190907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder = TextFinder::create(*this);
191007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
191107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return *m_textFinder;
191207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
191307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
191410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::invalidateScrollbar() const
191507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
191607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(frame() && frame()->view());
191707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FrameView* view = frame()->view();
191807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Invalidate the vertical scroll bar region for the view.
191907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    Scrollbar* scrollbar = view->verticalScrollbar();
192007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (scrollbar)
192107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        scrollbar->invalidate();
192207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
192307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
192410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::invalidateAll() const
192507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
192607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(frame() && frame()->view());
192707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FrameView* view = frame()->view();
192807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    view->invalidateRect(view->frameRect());
192907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    invalidateScrollbar();
193007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
193107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
193251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
1933