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
52d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// corresponding LocalFrame in WebCore.
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// How frames are destroyed
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// ------------------------
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The main frame is never destroyed and is re-used. The FrameLoader is re-used
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// and a reference to the main frame is kept by the Page.
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// When frame content is replaced, all subframes are destroyed. This happens
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// in FrameLoader::detachFromParent for each subframe in a pre-order depth-first
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// traversal. Note that child node order may not match DOM node order!
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// detachFromParent() calls FrameLoaderClient::detachedFromParent(), which calls
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// WebFrame::frameDetached(). This triggers WebFrame to clear its reference to
65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// LocalFrame, and also notifies the embedder via WebFrameClient that the frame is
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// detached. Most embedders will invoke close() on the WebFrame at this point,
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// triggering its deletion unless something else is still retaining a reference.
681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)//
6910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch// Thie client is expected to be set whenever the WebLocalFrameImpl is attached to
701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)// the DOM.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
73f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/DOMWrapperWorld.h"
76df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionState.h"
77df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h"
7853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptController.h"
7953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptSourceCode.h"
8053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptValue.h"
8153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/V8GCController.h"
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "bindings/v8/V8PerIsolateData.h"
8376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/HTMLNames.h"
8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
8553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarker.h"
8653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
8753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/IconURL.h"
8853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/MessagePort.h"
8953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
9053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h"
91e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
9253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/Editor.h"
9353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
943c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/editing/InputMethodController.h"
95f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/editing/PlainTextRange.h"
961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/editing/SpellChecker.h"
9753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextAffinity.h"
9853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h"
9953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/htmlediting.h"
10053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/markup.h"
1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Console.h"
10276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h"
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/frame/FrameHost.h"
104bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/frame/FrameView.h"
10510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "core/frame/Settings.h"
10653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCollection.h"
10753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h"
10843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)#include "core/html/HTMLFrameElementBase.h"
10953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameOwnerElement.h"
11053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLHeadElement.h"
11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
11253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLLinkElement.h"
11353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/PluginDocument.h"
11453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorController.h"
11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
11653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
11753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoadRequest.h"
11853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/loader/HistoryItem.h"
12053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/SubstituteData.h"
12153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Chrome.h"
12253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h"
12353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FocusController.h"
12453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
12553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Page.h"
12653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/PrintContext.h"
12753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
12853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h"
12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderFrame.h"
13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
13153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
13253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTreeAsText.h"
13353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
13453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/StyleInheritedData.h"
1351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/timing/Performance.h"
136f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "modules/geolocation/GeolocationController.h"
1376f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "modules/notifications/NotificationController.h"
1385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "modules/screen_orientation/ScreenOrientationController.h"
1391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
1401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h"
1411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/clipboard/ClipboardUtilities.h"
142a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h"
143a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
144a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayerClient.h"
145a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/skia/SkiaUtils.h"
146a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch#include "platform/heap/Handle.h"
147bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/ResourceRequest.h"
1481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/scroll/ScrollTypes.h"
14910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/scroll/ScrollbarTheme.h"
15051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURL.h"
15151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SchemeRegistry.h"
15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityPolicy.h"
153e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/Platform.h"
154e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebFloatPoint.h"
155e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebFloatRect.h"
15609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebLayer.h"
157e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebPoint.h"
158e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebRect.h"
159e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebSize.h"
160e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebURLError.h"
161e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "public/platform/WebVector.h"
162f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebConsoleMessage.h"
163f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDOMEvent.h"
164f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDOMEventListener.h"
165f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocument.h"
166f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFindOptions.h"
167f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFormElement.h"
168f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebFrameClient.h"
169f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebHistoryItem.h"
170f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebIconURL.h"
171f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebInputElement.h"
172f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h"
173f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPerformance.h"
174f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPlugin.h"
175f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPrintParams.h"
176f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebRange.h"
177f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebScriptSource.h"
178f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebSecurityOrigin.h"
179f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebSerializedScriptValue.h"
180f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/AssociatedURLLoader.h"
181f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/CompositionUnderlineVectorBuilder.h"
182f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/EventListenerWrapper.h"
183f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/FindInPageCoordinates.h"
184f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "web/GeolocationClientProxy.h"
1855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/LocalFileSystemClient.h"
1865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "web/MIDIClientProxy.h"
187f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/PageOverlay.h"
188f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/SharedWorkerRepositoryClientImpl.h"
189f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/TextFinder.h"
190f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDataSourceImpl.h"
191f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebDevToolsAgentPrivate.h"
192f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h"
193f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebViewImpl.h"
194e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/CurrentTime.h"
195e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/HashMap.h"
19610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include <algorithm>
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int frameCount = 0;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Key for a StatsCounter tracking how many WebFrames are active.
205f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static const char webFrameActiveCount[] = "WebFrameActiveCount";
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
207d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static void frameContentAsPlainText(size_t maxChars, LocalFrame* frame, StringBuilder& output)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Document* document = frame->document();
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!document)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame->view())
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // TextIterator iterates over the visual representation of the DOM. As such,
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it requires you to do a layout before using it (otherwise it'll crash).
218e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    document->updateLayout();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Select the document body.
221a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range(document->createRange());
22251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
22351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    range->selectNodeContents(document->body(), exceptionState);
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
22551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!exceptionState.hadException()) {
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The text iterator will walk nodes giving us text. This is similar to
22753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // the plainText() function in core/editing/TextIterator.h, but we implement the maximum
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // size and also copy the results directly into a wstring, avoiding the
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // string conversion.
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (TextIterator it(range.get()); !it.atEnd(); it.advance()) {
2317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            it.appendTextToStringBuilder(output, 0, maxChars - output.length());
2327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            if (output.length() >= maxChars)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return; // Filled up the buffer.
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The separator between frames when the frames are converted to plain text.
2387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    const LChar frameSeparator[] = { '\n', '\n' };
2397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    const size_t frameSeparatorLength = WTF_ARRAY_LENGTH(frameSeparator);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Recursively walk the children.
242f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    const FrameTree& frameTree = frame->tree();
2435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (Frame* curChild = frameTree.firstChild(); curChild; curChild = curChild->tree().nextSibling()) {
2445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!curChild->isLocalFrame())
2455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            continue;
2465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        LocalFrame* curLocalChild = toLocalFrame(curChild);
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Ignore the text of non-visible frames.
2485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RenderView* contentRenderer = curLocalChild->contentRenderer();
2495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RenderPart* ownerRenderer = curLocalChild->ownerRenderer();
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!contentRenderer || !contentRenderer->width() || !contentRenderer->height()
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || (contentRenderer->x() + contentRenderer->width() <= 0) || (contentRenderer->y() + contentRenderer->height() <= 0)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || (ownerRenderer && ownerRenderer->style() && ownerRenderer->style()->visibility() != VISIBLE)) {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make sure the frame separator won't fill up the buffer, and give up if
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // it will. The danger is if the separator will make the buffer longer than
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // maxChars. This will cause the computation above:
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //   maxChars - output->size()
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // to be a negative number which will crash when the subframe is added.
2617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (output.length() >= maxChars - frameSeparatorLength)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        output.append(frameSeparator, frameSeparatorLength);
2655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        frameContentAsPlainText(maxChars, curLocalChild, output);
2667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (output.length() >= maxChars)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return; // Filled up the buffer.
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebPluginContainerImpl* WebLocalFrameImpl::pluginContainerFromFrame(LocalFrame* frame)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame->document() || !frame->document()->isPluginDocument())
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    PluginDocument* pluginDocument = toPluginDocument(frame->document());
27809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return toWebPluginContainerImpl(pluginDocument->pluginWidget());
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebPluginContainerImpl* WebLocalFrameImpl::pluginContainerFromNode(WebCore::LocalFrame* frame, const WebNode& node)
2825267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
2835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame);
2845267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (pluginContainer)
2855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return pluginContainer;
28609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return toWebPluginContainerImpl(node.pluginContainer());
2875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Simple class to override some of PrintContext behavior. Some of the methods
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// made virtual so that they can be overridden by ChromePluginPrintContext.
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ChromePrintContext : public PrintContext {
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(ChromePrintContext);
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ChromePrintContext(LocalFrame* frame)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : PrintContext(frame)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        , m_printedPageWidth(0)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~ChromePrintContext() { }
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void begin(float width, float height)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!m_printedPageWidth);
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_printedPageWidth = width;
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PrintContext::begin(m_printedPageWidth, height);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void end()
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PrintContext::end();
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float getPageShrink(int pageNumber) const
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect pageRect = m_pageRects[pageNumber];
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_printedPageWidth / pageRect.width();
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Spools the printed page, a subrect of frame(). Skip the scale step.
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // NativeTheme doesn't play well with scaling. Scaling is done browser side
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // instead. Returns the scale to be applied.
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // On Linux, we don't have the problem with NativeTheme, hence we let WebKit
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // do the scaling and ignore the return value.
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float spoolPage(GraphicsContext& context, int pageNumber)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        IntRect pageRect = m_pageRects[pageNumber];
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        float scale = m_printedPageWidth / pageRect.width();
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context.save();
3318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(POSIX) && !OS(MACOSX)
3325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        context.scale(scale, scale);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context.translate(static_cast<float>(-pageRect.x()), static_cast<float>(-pageRect.y()));
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context.clip(pageRect);
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame()->view()->paintContents(&context, pageRect);
33781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (context.supportsURLFragments())
33881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)            outputLinkedDestinations(context, frame()->document(), pageRect);
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        context.restore();
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return scale;
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void spoolAllPagesWithBoundaries(GraphicsContext& graphicsContext, const FloatSize& pageSizeInPixels)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
345d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (!frame()->document() || !frame()->view() || !frame()->document()->renderView())
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame()->document()->updateLayout();
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        float pageHeight;
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        computePageRects(FloatRect(FloatPoint(0, 0), pageSizeInPixels), 0, 0, 1, pageHeight);
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const float pageWidth = pageSizeInPixels.width();
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        size_t numPages = pageRects().size();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int totalHeight = numPages * (pageSizeInPixels.height() + 1) - 1;
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Fill the whole background by white.
3585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        graphicsContext.setFillColor(Color::white);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        graphicsContext.fillRect(FloatRect(0, 0, pageWidth, totalHeight));
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int currentHeight = 0;
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t pageIndex = 0; pageIndex < numPages; pageIndex++) {
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Draw a line for a page boundary if this isn't the first page.
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (pageIndex > 0) {
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                graphicsContext.save();
3665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                graphicsContext.setStrokeColor(Color(0, 0, 255));
3675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                graphicsContext.setFillColor(Color(0, 0, 255));
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                graphicsContext.drawLine(IntPoint(0, currentHeight), IntPoint(pageWidth, currentHeight));
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                graphicsContext.restore();
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            graphicsContext.save();
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            graphicsContext.translate(0, currentHeight);
3758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN) || OS(MACOSX)
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Account for the disabling of scaling in spoolPage. In the context
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // of spoolAllPagesWithBoundaries the scale HAS NOT been pre-applied.
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            float scale = getPageShrink(pageIndex);
3795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            graphicsContext.scale(scale, scale);
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            spoolPage(graphicsContext, pageIndex);
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            graphicsContext.restore();
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currentHeight += pageSizeInPixels.height() + 1;
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PrintContext::computePageRects(printRect, headerHeight, footerHeight, userScaleFactor, outPageHeight);
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int pageCount() const
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return PrintContext::pageCount();
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set when printing.
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float m_printedPageWidth;
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Simple class to override some of PrintContext behavior. This is used when
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the frame hosts a plugin that supports custom printing. In this case, we
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// want to delegate all printing related calls to the plugin.
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ChromePluginPrintContext : public ChromePrintContext {
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ChromePluginPrintContext(LocalFrame* frame, WebPluginContainerImpl* plugin, const WebPrintParams& printParams)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        : ChromePrintContext(frame), m_plugin(plugin), m_pageCount(0), m_printParams(printParams)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~ChromePluginPrintContext() { }
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void begin(float width, float height)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void end()
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_plugin->printEnd();
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float getPageShrink(int pageNumber) const
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We don't shrink the page (maybe we should ask the widget ??)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 1.0;
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_printParams.printContentArea = IntRect(printRect);
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_pageCount = m_plugin->printBegin(m_printParams);
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int pageCount() const
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_pageCount;
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Spools the printed page, a subrect of frame(). Skip the scale step.
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // NativeTheme doesn't play well with scaling. Scaling is done browser side
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // instead. Returns the scale to be applied.
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual float spoolPage(GraphicsContext& context, int pageNumber)
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_plugin->printPage(pageNumber, &context);
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 1.0;
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Set when printing.
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* m_plugin;
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_pageCount;
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPrintParams m_printParams;
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static WebDataSource* DataSourceForDocLoader(DocumentLoader* loader)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return loader ? WebDataSourceImpl::fromDocumentLoader(loader) : 0;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// WebFrame -------------------------------------------------------------------
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int WebFrame::instanceCount()
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frameCount;
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4706f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::frameForCurrentContext()
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
472a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::Handle<v8::Context> context = v8::Isolate::GetCurrent()->GetCurrentContext();
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (context.IsEmpty())
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frameForContext(context);
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4786f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::frameForContext(v8::Handle<v8::Context> context)
479e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
48010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return WebLocalFrameImpl::fromFrame(toFrameIfNotDetached(context));
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4836f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::fromFrameOwnerElement(const WebElement& element)
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
485323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return WebLocalFrameImpl::fromFrameOwnerElement(PassRefPtrWillBeRawPtr<Element>(element).get());
48610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
48710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
48810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isWebLocalFrame() const
48910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
49010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return true;
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrame* WebLocalFrameImpl::toWebLocalFrame()
49410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
49510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return this;
49610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
49710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
49810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isWebRemoteFrame() const
49910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
50010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return false;
50110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
50210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
50310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRemoteFrame* WebLocalFrameImpl::toWebRemoteFrame()
50410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
50510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ASSERT_NOT_REACHED();
50610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return 0;
50710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
50810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
50910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::close()
5101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
5111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_client = 0;
5125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
5135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // FIXME: Oilpan: Signal to LocalFrame and its supplements that the frame is
5145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // being torn down so it can do prompt clean-up. For example, this will
5155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // clear the raw back pointer to m_geolocationClientProxy. Once
5165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // GeolocationClientProxy is on-heap it looks like we can completely remove
5175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // |willBeDestroyed| from supplements since tracing will ensure safety.
5185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (m_frame)
5195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_frame->willBeDestroyed();
5205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
5211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    deref(); // Balances ref() acquired in WebFrame::create
5221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
5231e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
52410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::uniqueName() const
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
526f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->tree().uniqueName();
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::assignedName() const
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
531f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->tree().name();
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setName(const WebString& name)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
536f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->tree().setName(name);
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebVector<WebIconURL> WebLocalFrameImpl::iconURLs(int iconTypesMask) const
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The URL to the icon may be in the header. As such, only
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ask the loader for the icon if it's finished loading.
543f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (frame()->loader().state() == FrameStateComplete)
54451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return frame()->document()->iconURLs(iconTypesMask);
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebVector<WebIconURL>();
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
54810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setIsRemote(bool isRemote)
54909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
55009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_isRemote = isRemote;
55109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isRemote)
55209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        client()->initializeChildFrame(frame()->view()->frameRect(), frame()->view()->visibleContentScaleFactor());
55309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
55409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
55510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setRemoteWebLayer(WebLayer* webLayer)
55609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
55709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!frame())
55809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
55909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
56009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (frame()->remotePlatformLayer())
56109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        GraphicsLayer::unregisterContentsLayer(frame()->remotePlatformLayer());
56209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (webLayer)
56309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        GraphicsLayer::registerContentsLayer(webLayer);
56409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame()->setRemotePlatformLayer(webLayer);
565f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    // FIXME: This should be moved to WebRemoteFrame.
566f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ASSERT(frame()->deprecatedLocalOwner());
567f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    frame()->deprecatedLocalOwner()->setNeedsCompositingUpdate();
5685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (RenderPart* renderer = frame()->ownerRenderer())
5695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        renderer->layer()->updateSelfPaintingLayer();
57009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
57109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
57210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setPermissionClient(WebPermissionClient* permissionClient)
57309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
57409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_permissionClient = permissionClient;
57509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
57609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
57710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setSharedWorkerRepositoryClient(WebSharedWorkerRepositoryClient* client)
57809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
57909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_sharedWorkerRepositoryClient = SharedWorkerRepositoryClientImpl::create(client);
58009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
58109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
58210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::scrollOffset() const
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frameView();
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebSize();
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return view->scrollOffset();
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::minimumScrollOffset() const
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frameView();
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebSize();
595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return toIntSize(view->minimumScrollPosition());
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59810f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::maximumScrollOffset() const
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FrameView* view = frameView();
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!view)
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebSize();
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return toIntSize(view->maximumScrollPosition());
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setScrollOffset(const WebSize& offset)
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (FrameView* view = frameView())
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        view->setScrollOffset(IntPoint(offset.width, offset.height));
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
61210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebSize WebLocalFrameImpl::contentsSize() const
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->view()->contentsSize();
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
61710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasVisibleContent() const
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
619323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (RenderPart* renderer = frame()->ownerRenderer()) {
620323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (renderer->style()->visibility() != VISIBLE)
621323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return false;
622323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    }
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->view()->visibleWidth() > 0 && frame()->view()->visibleHeight() > 0;
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRect WebLocalFrameImpl::visibleContentRect() const
627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return frame()->view()->visibleContentRect();
629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
63110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasHorizontalScrollbar() const
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame() && frame()->view() && frame()->view()->horizontalScrollbar();
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasVerticalScrollbar() const
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame() && frame()->view() && frame()->view()->verticalScrollbar();
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebView* WebLocalFrameImpl::view() const
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return viewImpl();
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setOpener(WebFrame* opener)
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
648323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // FIXME: Does this need to move up into WebFrame too?
649323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (WebFrame::opener() && !opener && m_client)
650d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_client->didDisownOpener(this);
651d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
652323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WebFrame::setOpener(opener);
653d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
654d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(m_frame);
655d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_frame && m_frame->document())
656d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_frame->document()->initSecurityContext();
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDocument WebLocalFrameImpl::document() const
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame() || !frame()->document())
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebDocument();
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebDocument(frame()->document());
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebPerformance WebLocalFrameImpl::performance() const
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebPerformance();
670d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return WebPerformance(&frame()->domWindow()->performance());
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::dispatchBeforeUnloadEvent()
67407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
67507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!frame())
67607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return true;
67707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return frame()->loader().shouldClose();
67807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
67907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
68010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::dispatchUnloadEvent()
681aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch{
682aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (!frame())
683aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        return;
684aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    frame()->loader().closeURL();
685aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch}
686aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
68710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochNPObject* WebLocalFrameImpl::windowObject() const
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
691f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->script().windowScriptNPObject();
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
69410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::bindToWindowObject(const WebString& name, NPObject* object)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
696e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    bindToWindowObject(name, object, 0);
697e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
698e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
69910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::bindToWindowObject(const WebString& name, NPObject* object, void*)
700e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
701f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!frame() || !frame()->script().canExecuteScripts(NotAboutToExecuteScript))
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
703f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->script().bindToWindowObject(frame(), String(name), object);
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
70610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::executeScript(const WebScriptSource& source)
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextPosition position(OrdinalNumber::fromOneBasedInt(source.startLine), OrdinalNumber::first());
7105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::HandleScope handleScope(toIsolate(frame()));
711f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->script().executeScriptInMainWorld(ScriptSourceCode(source.code, source.url, position));
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
71410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::executeScriptInIsolatedWorld(int worldID, const WebScriptSource* sourcesIn, unsigned numSources, int extensionGroup)
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
717e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID > 0);
718e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID < EmbedderWorldIdLimit);
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<ScriptSourceCode> sources;
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < numSources; ++i) {
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TextPosition position(OrdinalNumber::fromOneBasedInt(sourcesIn[i].startLine), OrdinalNumber::first());
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sources.append(ScriptSourceCode(sourcesIn[i].code, sourcesIn[i].url, position));
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::HandleScope handleScope(toIsolate(frame()));
727f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->script().executeScriptInIsolatedWorld(worldID, sources, extensionGroup, 0);
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setIsolatedWorldSecurityOrigin(int worldID, const WebSecurityOrigin& securityOrigin)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOMWrapperWorld::setIsolatedWorldSecurityOrigin(worldID, securityOrigin.get());
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setIsolatedWorldContentSecurityPolicy(int worldID, const WebString& policy)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DOMWrapperWorld::setIsolatedWorldContentSecurityPolicy(worldID, policy);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::addMessageToConsole(const WebConsoleMessage& message)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MessageLevel webCoreMessageLevel;
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (message.level) {
748926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case WebConsoleMessage::LevelDebug:
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        webCoreMessageLevel = DebugMessageLevel;
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebConsoleMessage::LevelLog:
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webCoreMessageLevel = LogMessageLevel;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebConsoleMessage::LevelWarning:
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webCoreMessageLevel = WarningMessageLevel;
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WebConsoleMessage::LevelError:
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webCoreMessageLevel = ErrorMessageLevel;
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    frame()->document()->addConsoleMessage(OtherMessageSource, webCoreMessageLevel, message.text);
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::collectGarbage()
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
77209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!frame()->settings()->scriptEnabled())
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
77493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    V8GCController::collectGarbage(v8::Isolate::GetCurrent());
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::checkIfRunInsecureContent(const WebURL& url) const
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
780f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->loader().mixedContentChecker()->canRunInsecureContent(frame()->document()->securityOrigin(), url);
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochv8::Handle<v8::Value> WebLocalFrameImpl::executeScriptAndReturnValue(const WebScriptSource& source)
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: This fake user gesture is required to make a bunch of pyauto
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // tests pass. If this isn't needed in non-test situations, we should
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // consider removing this code and changing the tests.
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // http://code.google.com/p/chromium/issues/detail?id=86397
791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture);
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextPosition position(OrdinalNumber::fromOneBasedInt(source.startLine), OrdinalNumber::first());
7945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return frame()->script().executeScriptInMainWorldAndReturnValue(ScriptSourceCode(source.code, source.url, position));
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::executeScriptInIsolatedWorld(int worldID, const WebScriptSource* sourcesIn, unsigned numSources, int extensionGroup, WebVector<v8::Local<v8::Value> >* results)
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
800e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID > 0);
801e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    RELEASE_ASSERT(worldID < EmbedderWorldIdLimit);
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<ScriptSourceCode> sources;
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < numSources; ++i) {
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TextPosition position(OrdinalNumber::fromOneBasedInt(sourcesIn[i].startLine), OrdinalNumber::first());
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sources.append(ScriptSourceCode(sourcesIn[i].code, sourcesIn[i].url, position));
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (results) {
8115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        Vector<v8::Local<v8::Value> > scriptResults;
812f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        frame()->script().executeScriptInIsolatedWorld(worldID, sources, extensionGroup, &scriptResults);
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebVector<v8::Local<v8::Value> > v8Results(scriptResults.size());
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < scriptResults.size(); i++)
8155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            v8Results[i] = v8::Local<v8::Value>::New(toIsolate(frame()), scriptResults[i]);
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        results->swap(v8Results);
817f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    } else {
8185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        v8::HandleScope handleScope(toIsolate(frame()));
819f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        frame()->script().executeScriptInIsolatedWorld(worldID, sources, extensionGroup, 0);
820f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochv8::Handle<v8::Value> WebLocalFrameImpl::callFunctionEvenIfScriptDisabled(v8::Handle<v8::Function> function, v8::Handle<v8::Value> receiver, int argc, v8::Handle<v8::Value> argv[])
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
826f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->script().callFunction(function, receiver, argc, argv);
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
82910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochv8::Local<v8::Context> WebLocalFrameImpl::mainWorldScriptContext() const
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
831f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return toV8Context(frame(), DOMWrapperWorld::mainWorld());
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
83410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::reload(bool ignoreCache)
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
837f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().reload(ignoreCache ? EndToEndReload : NormalReload);
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::reloadWithOverrideURL(const WebURL& overrideUrl, bool ignoreCache)
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
843f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().reload(ignoreCache ? EndToEndReload : NormalReload, overrideUrl);
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadRequest(const WebURLRequest& request)
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!request.isNull());
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ResourceRequest& resourceRequest = request.toResourceRequest();
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resourceRequest.url().protocolIs("javascript")) {
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        loadJavaScriptURL(resourceRequest.url());
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
857f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().load(FrameLoadRequest(0, resourceRequest));
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
86010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadHistoryItem(const WebHistoryItem& item, WebHistoryLoadType loadType, WebURLRequest::CachePolicy cachePolicy)
861a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
862a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT(frame());
863a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtr<HistoryItem> historyItem = PassRefPtr<HistoryItem>(item);
864a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ASSERT(historyItem);
865a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    frame()->loader().loadHistoryItem(historyItem.get(), static_cast<HistoryLoadType>(loadType), static_cast<ResourceRequestCachePolicy>(cachePolicy));
866a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
867a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
86810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadData(const WebData& data, const WebString& mimeType, const WebString& textEncoding, const WebURL& baseURL, const WebURL& unreachableURL, bool replace)
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we are loading substitute data to replace an existing load, then
87310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // inherit all of the properties of that original request. This way,
87410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // reload will re-attempt the original request. It is essential that
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we only do this when there is an unreachableURL since a non-empty
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // unreachableURL informs FrameLoader::reload to load unreachableURL
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // instead of the currently loaded URL.
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceRequest request;
87909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (replace && !unreachableURL.isEmpty() && frame()->loader().provisionalDocumentLoader())
88009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        request = frame()->loader().provisionalDocumentLoader()->originalRequest();
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    request.setURL(baseURL);
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
883e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    FrameLoadRequest frameRequest(0, request, SubstituteData(data, mimeType, textEncoding, unreachableURL));
884926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT(frameRequest.substituteData().isValid());
885fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch    frameRequest.setLockBackForwardList(replace);
886f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().load(frameRequest);
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadHTMLString(const WebData& data, const WebURL& baseURL, const WebURL& unreachableURL, bool replace)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    loadData(data, WebString::fromUTF8("text/html"), WebString::fromUTF8("UTF-8"), baseURL, unreachableURL, replace);
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isLoading() const
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
899f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return frame()->loader().isLoading();
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
90210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::stopLoading()
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
90610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // FIXME: Figure out what we should really do here. It seems like a bug
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // that FrameLoader::stopLoading doesn't call stopAllLoaders.
908f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().stopAllLoaders();
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSource* WebLocalFrameImpl::provisionalDataSource() const
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We regard the policy document loader as still provisional.
916f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    DocumentLoader* documentLoader = frame()->loader().provisionalDocumentLoader();
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!documentLoader)
918f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        documentLoader = frame()->loader().policyDocumentLoader();
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return DataSourceForDocLoader(documentLoader);
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSource* WebLocalFrameImpl::dataSource() const
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
926f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return DataSourceForDocLoader(frame()->loader().documentLoader());
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::enableViewSourceMode(bool enable)
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frame())
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame()->setInViewSourceMode(enable);
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isViewSourceModeEnabled() const
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->inViewSourceMode();
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
94210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setReferrerForRequest(WebURLRequest& request, const WebURL& referrerURL)
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
94409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    String referrer = referrerURL.isEmpty() ? frame()->document()->outgoingReferrer() : String(referrerURL.spec().utf16());
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    referrer = SecurityPolicy::generateReferrerHeader(frame()->document()->referrerPolicy(), request.url(), referrer);
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (referrer.isEmpty())
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
94809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    request.setHTTPReferrer(referrer, static_cast<WebReferrerPolicy>(frame()->document()->referrerPolicy()));
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::dispatchWillSendRequest(WebURLRequest& request)
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceResponse response;
954f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    frame()->loader().client()->dispatchWillSendRequest(0, 0, request.toMutableResourceRequest(), response);
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebURLLoader* WebLocalFrameImpl::createAssociatedURLLoader(const WebURLLoaderOptions& options)
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return new AssociatedURLLoader(this, options);
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochunsigned WebLocalFrameImpl::unloadListenerCount() const
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return frame()->domWindow()->pendingUnloadEventListeners();
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::replaceSelection(const WebString& text)
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool selectReplacement = false;
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool smartReplace = true;
971c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    frame()->editor().replaceSelectionWithText(text, selectReplacement, smartReplace);
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::insertText(const WebString& text)
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9763c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (frame()->inputMethodController().hasComposition())
9773c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        frame()->inputMethodController().confirmComposition(text);
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
979c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        frame()->editor().insertText(text, 0);
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setMarkedText(const WebString& text, unsigned location, unsigned length)
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<CompositionUnderline> decorations;
9853c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    frame()->inputMethodController().setComposition(text, decorations, location, length);
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::unmarkText()
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9903c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    frame()->inputMethodController().cancelComposition();
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasMarkedText() const
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9953c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    return frame()->inputMethodController().hasComposition();
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99810f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRange WebLocalFrameImpl::markedRange() const
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10003c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    return frame()->inputMethodController().compositionRange();
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::firstRectForCharacterRange(unsigned location, unsigned length, WebRect& rect) const
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((location + length < location) && (location + length))
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = 0;
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1008f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Element* editable = frame()->selection().rootEditableElementOrDocumentElement();
1009f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(editable);
1010a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = PlainTextRange(location, location + length).createRange(*editable);
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1013c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    IntRect intRect = frame()->editor().firstRectForRange(range.get());
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect = WebRect(intRect);
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rect = frame()->view()->contentsToWindow(rect);
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
101910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochsize_t WebLocalFrameImpl::characterIndexForPoint(const WebPoint& webPoint) const
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
102206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntPoint point = frame()->view()->windowToContents(webPoint);
102519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestResult result = frame()->eventHandler().hitTestResultAtPoint(point, HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
1026a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = frame()->rangeForPoint(result.roundedPointInInnerNodeFrame());
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
102806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return kNotFound;
1029f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    Element* editable = frame()->selection().rootEditableElementOrDocumentElement();
1030f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    ASSERT(editable);
1031f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return PlainTextRange::create(*editable, *range.get()).start();
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::executeCommand(const WebString& name, const WebNode& node)
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name.length() <= 2)
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Since we don't have NSControl, we will convert the format of command
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // string and call the function on Editor directly.
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String command = name;
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure the first letter is upper case.
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    command.replace(0, 1, command.substring(0, 1).upper());
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Remove the trailing ':' if existing.
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (command[command.length() - 1] == UChar(':'))
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        command = command.substring(0, command.length() - 1);
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromNode(frame(), node);
105353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (pluginContainer && pluginContainer->executeEditCommand(name))
105453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool result = true;
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Specially handling commands that Editor::execCommand does not directly
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // support.
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (command == "DeleteToEndOfParagraph") {
1061c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        if (!frame()->editor().deleteWithDirection(DirectionForward, ParagraphBoundary, true, false))
1062c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            frame()->editor().deleteWithDirection(DirectionForward, CharacterGranularity, true, false);
1063c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    } else if (command == "Indent") {
1064c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        frame()->editor().indent();
1065c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    } else if (command == "Outdent") {
1066c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        frame()->editor().outdent();
1067c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    } else if (command == "DeleteBackward") {
1068c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        result = frame()->editor().command(AtomicString("BackwardDelete")).execute();
1069c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    } else if (command == "DeleteForward") {
1070c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        result = frame()->editor().command(AtomicString("ForwardDelete")).execute();
1071c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    } else if (command == "AdvanceToNextMisspelling") {
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Wee need to pass false here or else the currently selected word will never be skipped.
10731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        frame()->spellChecker().advanceToNextMisspelling(false);
1074c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    } else if (command == "ToggleSpellPanel") {
10751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        frame()->spellChecker().showSpellingGuessPanel();
1076c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    } else {
1077c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        result = frame()->editor().command(command).execute();
1078c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
108210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::executeCommand(const WebString& name, const WebString& value, const WebNode& node)
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String webName = name;
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromNode(frame(), node);
10885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (pluginContainer && pluginContainer->executeEditCommand(name, value))
10895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return true;
10905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // moveToBeginningOfDocument and moveToEndfDocument are only handled by WebKit for editable nodes.
1092c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!frame()->editor().canEdit() && webName == "moveToBeginningOfDocument")
109309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return viewImpl()->bubblingScroll(ScrollUp, ScrollByDocument);
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!frame()->editor().canEdit() && webName == "moveToEndOfDocument")
109609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return viewImpl()->bubblingScroll(ScrollDown, ScrollByDocument);
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (webName == "showGuessPanel") {
10991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        frame()->spellChecker().showSpellingGuessPanel();
11001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return true;
11011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
11021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1103c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return frame()->editor().command(webName).execute(value);
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isCommandEnabled(const WebString& name) const
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame());
1109c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return frame()->editor().command(name).isEnabled();
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::enableContinuousSpellChecking(bool enable)
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (enable == isContinuousSpellCheckingEnabled())
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
11161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->spellChecker().toggleContinuousSpellChecking();
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isContinuousSpellCheckingEnabled() const
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return frame()->spellChecker().isContinuousSpellCheckingEnabled();
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::requestTextChecking(const WebElement& webElement)
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webElement.isNull())
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
11281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->spellChecker().requestTextChecking(*webElement.constUnwrap<Element>());
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
113110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::replaceMisspelledRange(const WebString& text)
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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.
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainerFromFrame(frame()))
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1136a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> caretRange = frame()->selection().toNormalizedRange();
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!caretRange)
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1139d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WillBeHeapVector<DocumentMarker*> markers = frame()->document()->markers().markersInRange(caretRange.get(), DocumentMarker::MisspellingMarkers());
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (markers.size() < 1 || markers[0]->startOffset() >= markers[0]->endOffset())
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1142a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> markerRange = Range::create(caretRange->ownerDocument(), caretRange->startContainer(), markers[0]->startOffset(), caretRange->endContainer(), markers[0]->endOffset());
1143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!markerRange)
1144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame()->selection().setSelection(VisibleSelection(markerRange.get()), CharacterGranularity);
1146c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    frame()->editor().replaceSelectionWithText(text, false, false);
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
114910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::removeSpellingMarkers()
115053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame()->document()->markers().removeMarkers(DocumentMarker::MisspellingMarkers());
115253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
115353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
115410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasSelection() const
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->plugin()->hasSelection();
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // frame()->selection()->isNone() never returns true.
11618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return frame()->selection().start() != frame()->selection().end();
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
116410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRange WebLocalFrameImpl::selectionRange() const
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return frame()->selection().toNormalizedRange();
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
116910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::selectionAsText() const
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->plugin()->selectionAsText();
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = frame()->selection().toNormalizedRange();
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String text = range->text();
11808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replaceNewlinesWithWindowsStyleNewlines(text);
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replaceNBSPWithSpace(text);
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return text;
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
118710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::selectionAsMarkup() const
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer)
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return pluginContainer->plugin()->selectionAsMarkup();
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1193a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Range> range = frame()->selection().toNormalizedRange();
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!range)
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return createMarkup(range.get(), 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
120010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::selectWordAroundPosition(LocalFrame* frame, VisiblePosition position)
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    VisibleSelection selection(position);
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selection.expandUsingGranularity(WordGranularity);
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    TextGranularity granularity = selection.isRange() ? WordGranularity : CharacterGranularity;
12061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame->selection().setSelection(selection, granularity);
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
120910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::selectWordAroundCaret()
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameSelection& selection = frame()->selection();
12128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (selection.isNone() || selection.isRange())
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
12148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    selectWordAroundPosition(frame(), selection.selection().visibleStart());
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
121810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::selectRange(const WebPoint& base, const WebPoint& extent)
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
122093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    moveRangeSelection(base, extent);
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
122310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::selectRange(const WebRange& webRange)
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1225a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (RefPtrWillBeRawPtr<Range> range = static_cast<PassRefPtrWillBeRawPtr<Range> >(webRange))
12265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        frame()->selection().setSelectedRange(range.get(), WebCore::VP_DEFAULT_AFFINITY, FrameSelection::NonDirectional, NotUserTriggered);
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
122910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::moveRangeSelection(const WebPoint& base, const WebPoint& extent)
123093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
123193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisiblePosition basePosition = visiblePositionForWindowPoint(base);
123293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisiblePosition extentPosition = visiblePositionForWindowPoint(extent);
123393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisibleSelection newSelection = VisibleSelection(basePosition, extentPosition);
12341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->selection().setSelection(newSelection, CharacterGranularity);
123593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
123693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
123710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::moveCaretSelection(const WebPoint& point)
123893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
12398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* editable = frame()->selection().rootEditableElement();
1240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!editable)
1241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
124393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    VisiblePosition position = visiblePositionForWindowPoint(point);
12441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    frame()->selection().moveTo(position, UserTriggered);
1245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
124710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::setEditableSelectionOffsets(int start, int end)
124807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
124907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return frame()->inputMethodController().setEditableSelectionOffsets(PlainTextRange(start, end));
125007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
125107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
125210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::setCompositionFromExistingText(int compositionStart, int compositionEnd, const WebVector<WebCompositionUnderline>& underlines)
125307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
125407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!frame()->editor().canEdit())
125507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return false;
125607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
125707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    InputMethodController& inputMethodController = frame()->inputMethodController();
125807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    inputMethodController.cancelComposition();
125907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
126007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (compositionStart == compositionEnd)
126107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return true;
126207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
126307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    inputMethodController.setCompositionFromExistingText(CompositionUnderlineVectorBuilder(underlines), compositionStart, compositionEnd);
126407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
126507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return true;
126607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
126707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
126810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::extendSelectionAndDelete(int before, int after)
126907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
127007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (WebPlugin* plugin = focusedPluginIfInputMethodSupported()) {
127107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        plugin->extendSelectionAndDelete(before, after);
127207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
127307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
127407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    frame()->inputMethodController().extendSelectionAndDelete(before, after);
127507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
127607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
127710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setCaretVisible(bool visible)
1278e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
12798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    frame()->selection().setCaretVisible(visible);
1280e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
1281e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
128210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochVisiblePosition WebLocalFrameImpl::visiblePositionForWindowPoint(const WebPoint& point)
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // FIXME(bokan): crbug.com/371902 - These scale/pinch transforms shouldn't
12855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // be ad hoc and explicit.
12865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    PinchViewport& pinchViewport = frame()->page()->frameHost().pinchViewport();
128793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    FloatPoint unscaledPoint(point);
128893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    unscaledPoint.scale(1 / view()->pageScaleFactor(), 1 / view()->pageScaleFactor());
12895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    unscaledPoint.moveBy(pinchViewport.visibleRect().location());
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
129119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    HitTestRequest request = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent;
129293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HitTestResult result(frame()->view()->windowToContents(roundedIntPoint(unscaledPoint)));
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->document()->renderView()->layer()->hitTest(request, result);
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (Node* node = result.targetNode())
12968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return frame()->selection().selection().visiblePositionRespectingEditingBoundary(result.localPoint(), node);
12978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return VisiblePosition();
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
130010f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebPlugin* WebLocalFrameImpl::focusedPluginIfInputMethodSupported()
130107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
130210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebPluginContainerImpl* container = WebLocalFrameImpl::pluginContainerFromNode(frame(), WebNode(frame()->document()->focusedElement()));
130307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (container && container->supportsInputMethod())
130407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return container->plugin();
130507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
130607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
130707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
130810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint WebLocalFrameImpl::printBegin(const WebPrintParams& printParams, const WebNode& constrainToNode)
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!frame()->document()->isFrameSet());
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer = 0;
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (constrainToNode.isNull()) {
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If this is a plugin document, check if the plugin supports its own
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // printing. If it does, we will delegate all printing to that.
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pluginContainer = pluginContainerFromFrame(frame());
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We only support printing plugin nodes for now.
131809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        pluginContainer = toWebPluginContainerImpl(constrainToNode.pluginContainer());
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (pluginContainer && pluginContainer->supportsPaginatedPrint())
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_printContext = adoptPtr(new ChromePluginPrintContext(frame(), pluginContainer, printParams));
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_printContext = adoptPtr(new ChromePrintContext(frame()));
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect rect(0, 0, static_cast<float>(printParams.printContentArea.width), static_cast<float>(printParams.printContentArea.height));
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->begin(rect.width(), rect.height());
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float pageHeight;
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We ignore the overlays calculation for now since they are generated in the
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // browser. pageHeight is actually an output parameter.
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->computePageRects(rect, 0, 0, 1.0, pageHeight);
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_printContext->pageCount();
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
133610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochfloat WebLocalFrameImpl::getPrintPageShrink(int page)
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext && page >= 0);
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_printContext->getPageShrink(page);
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
134210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochfloat WebLocalFrameImpl::printPage(int page, WebCanvas* canvas)
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(PRINTING)
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext && page >= 0 && frame() && frame()->document());
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
134753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext graphicsContext(canvas);
134853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    graphicsContext.setPrinting(true);
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_printContext->spoolPage(graphicsContext, page);
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::printEnd()
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext);
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->end();
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext.clear();
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isPrintScalingDisabledForPlugin(const WebNode& node)
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
136409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebPluginContainerImpl* pluginContainer =  node.isNull() ? pluginContainerFromFrame(frame()) : toWebPluginContainerImpl(node.pluginContainer());
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!pluginContainer || !pluginContainer->supportsPaginatedPrint())
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return pluginContainer->isPrintScalingDisabled();
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::hasCustomPageSizeStyle(int pageIndex)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->document()->styleForPage(pageIndex)->pageSizeType() != PAGE_SIZE_AUTO;
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
137710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::isPageBoxVisible(int pageIndex)
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return frame()->document()->isPageBoxVisible(pageIndex);
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
138210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::pageSizeAndMarginsInPixels(int pageIndex, WebSize& pageSize, int& marginTop, int& marginRight, int& marginBottom, int& marginLeft)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntSize size = pageSize;
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->document()->pageSizeAndMarginsInPixels(pageIndex, size, marginTop, marginRight, marginBottom, marginLeft);
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pageSize = size;
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
138910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::pageProperty(const WebString& propertyName, int pageIndex)
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext);
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_printContext->pageProperty(frame(), propertyName.utf8().data(), pageIndex);
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::find(int identifier, const WebString& searchText, const WebFindOptions& options, bool wrapWithinFrame, WebRect* selectionRect)
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
139707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return ensureTextFinder().find(identifier, searchText, options, wrapWithinFrame, selectionRect);
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
140010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::stopFinding(bool clearSelection)
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
140207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder) {
140307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (!clearSelection)
140407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            setFindEndstateFocusAndSelection();
140507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->stopFindingAndClearSelection();
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
140910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::scopeStringMatches(int identifier, const WebString& searchText, const WebFindOptions& options, bool reset)
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
141107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ensureTextFinder().scopeStringMatches(identifier, searchText, options, reset);
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
141410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::cancelPendingScopingEffort()
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
141607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
141707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->cancelPendingScopingEffort();
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
142010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::increaseMatchCount(int count, int identifier)
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This function should only be called on the mainframe.
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
1424f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ensureTextFinder().increaseMatchCount(identifier, count);
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
142710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::resetMatchCount()
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1429f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ensureTextFinder().resetMatchCount();
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1432323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void WebLocalFrameImpl::sendOrientationChangeEvent()
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (frame())
1435323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        frame()->sendOrientationChangeEvent();
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
143810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::dispatchMessageEventWithOriginCheck(const WebSecurityOrigin& intendedTargetOrigin, const WebDOMEvent& event)
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!event.isNull());
1441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame()->domWindow()->dispatchMessageEventWithOriginCheck(intendedTargetOrigin.get(), event, nullptr);
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint WebLocalFrameImpl::findMatchMarkersVersion() const
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
144907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->findMatchMarkersVersion();
145007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochint WebLocalFrameImpl::selectNearestFindMatch(const WebFloatPoint& point, WebRect* selectionRect)
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
145507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(!parent());
1456f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return ensureTextFinder().selectNearestFindMatch(point, selectionRect);
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebFloatRect WebLocalFrameImpl::activeFindMatchRect()
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
146407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->activeFindMatchRect();
146507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return WebFloatRect();
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::findMatchRects(WebVector<WebFloatRect>& outputRects)
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!parent());
1471f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ensureTextFinder().findMatchRects(outputRects);
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
147410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setTickmarks(const WebVector<WebRect>& tickmarks)
147543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
147643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (frameView()) {
147743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        Vector<IntRect> tickmarksConverted(tickmarks.size());
147843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        for (size_t i = 0; i < tickmarks.size(); ++i)
147943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            tickmarksConverted[i] = tickmarks[i];
148043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        frameView()->setTickmarks(tickmarksConverted);
148107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        invalidateScrollbar();
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
148510f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::contentAsText(size_t maxChars) const
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
14897757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    StringBuilder text;
14907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    frameContentAsPlainText(maxChars, frame(), text);
14917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    return text.toString();
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
149410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::contentAsMarkup() const
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return createFullMarkup(frame()->document());
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::renderTreeAsText(RenderAsTextControls toShow) const
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderAsTextBehavior behavior = RenderAsTextBehaviorNormal;
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (toShow & RenderAsTextDebug)
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        behavior |= RenderAsTextShowCompositedLayers | RenderAsTextShowAddresses | RenderAsTextShowIDAndClass | RenderAsTextShowLayerNesting;
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (toShow & RenderAsTextPrinting)
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        behavior |= RenderAsTextPrintingMode;
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return externalRepresentation(frame(), behavior);
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
151410f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::markerTextForListItem(const WebElement& webElement) const
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebCore::markerTextForListItem(const_cast<Element*>(webElement.constUnwrap<Element>()));
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
151910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::printPagesWithBoundaries(WebCanvas* canvas, const WebSize& pageSizeInPixels)
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(m_printContext);
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
152353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GraphicsContext graphicsContext(canvas);
152453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    graphicsContext.setPrinting(true);
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_printContext->spoolAllPagesWithBoundaries(graphicsContext, FloatSize(pageSizeInPixels.width, pageSizeInPixels.height));
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
152910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebRect WebLocalFrameImpl::selectionBoundsRect() const
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return hasSelection() ? WebRect(IntRect(frame()->selection().bounds(false))) : WebRect();
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
153410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochbool WebLocalFrameImpl::selectionStartHasSpellingMarkerFor(int from, int length) const
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
15381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return frame()->spellChecker().selectionStartHasMarkerFor(DocumentMarker::Spelling, from, length);
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
154110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebString WebLocalFrameImpl::layerTreeAsText(bool showDebugInfo) const
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebString();
1545e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1546521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    return WebString(frame()->layerTreeAsText(showDebugInfo ? LayerTreeIncludesDebugInfo : LayerTreeNormal));
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
154910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch// WebLocalFrameImpl public ---------------------------------------------------------
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15516f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebLocalFrame* WebLocalFrame::create(WebFrameClient* client)
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
155310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return WebLocalFrameImpl::create(client);
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
155610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::create(WebFrameClient* client)
15571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
155810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return adoptRef(new WebLocalFrameImpl(client)).leakRef();
15591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
15601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
156110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl::WebLocalFrameImpl(WebFrameClient* client)
1562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : m_frameLoaderClientImpl(this)
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_client(client)
156409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_permissionClient(0)
15651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_inputEventsScaleFactorForEmulation(1)
1566f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_userMediaClientImpl(this)
1567f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    , m_geolocationClientProxy(adoptPtr(new GeolocationClientProxy(client ? client->geolocationClient() : 0)))
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
156951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    blink::Platform::current()->incrementStatsCounter(webFrameActiveCount);
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameCount++;
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
157310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl::~WebLocalFrameImpl()
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
157551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    blink::Platform::current()->decrementStatsCounter(webFrameActiveCount);
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frameCount--;
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelPendingScopingEffort();
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
158110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setWebCoreFrame(PassRefPtr<WebCore::LocalFrame> frame)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
158309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_frame = frame;
15846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
15856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // FIXME: we shouldn't add overhead to every frame by registering these objects when they're not used.
1586f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (m_frame) {
1587323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        OwnPtr<NotificationPresenterImpl> notificationPresenter = adoptPtr(new NotificationPresenterImpl());
1588323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (m_client)
1589323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            notificationPresenter->initialize(m_client->notificationPresenter());
1590323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
1591323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        provideNotification(*m_frame, notificationPresenter.release());
1592f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        provideUserMediaTo(*m_frame, &m_userMediaClientImpl);
1593f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        provideGeolocationTo(*m_frame, m_geolocationClientProxy.get());
1594f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        m_geolocationClientProxy->setController(GeolocationController::from(m_frame.get()));
15955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        provideMIDITo(*m_frame, MIDIClientProxy::create(m_client ? m_client->webMIDIClient() : 0));
15965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (RuntimeEnabledFeatures::screenOrientationEnabled())
15975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            ScreenOrientationController::provideTo(*m_frame, m_client ? m_client->webScreenOrientationClient() : 0);
15985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        provideLocalFileSystemTo(*m_frame, LocalFileSystemClient::create());
1599f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
160210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::initializeAsMainFrame(WebCore::Page* page)
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1604d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    setWebCoreFrame(LocalFrame::create(&m_frameLoaderClientImpl, &page->frameHost(), 0));
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We must call init() after m_frame is assigned because it is referenced
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // during init().
160809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_frame->init();
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
161110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochPassRefPtr<LocalFrame> WebLocalFrameImpl::createChildFrame(const FrameLoadRequest& request, HTMLFrameOwnerElement* ownerElement)
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(m_client);
16145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    WebLocalFrameImpl* webframeChild = toWebLocalFrameImpl(m_client->createChildFrame(this, request.frameName()));
16155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!webframeChild)
1616d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
16171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1618a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // FIXME: Using subResourceAttributeName as fallback is not a perfect
1619a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // solution. subResourceAttributeName returns just one attribute name. The
1620a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // element might not have the attribute, and there might be other attributes
1621a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    // which can identify the element.
16225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtr<LocalFrame> child = webframeChild->initializeAsChildFrame(frame()->host(), ownerElement, request.frameName(), ownerElement->getAttribute(ownerElement->subResourceAttributeName()));
16235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Initializing the WebCore frame may cause the new child to be detached, since it may dispatch a load event in the parent.
16245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!child->tree().parent())
1625d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16277757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // If we're moving in the back/forward list, we might want to replace the content
16287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    // of this child frame with whatever was there at that point.
1629aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    RefPtr<HistoryItem> childItem;
1630a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (isBackForwardLoadType(frame()->loader().loadType()) && !frame()->document()->loadEventFinished())
16315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        childItem = PassRefPtr<HistoryItem>(webframeChild->client()->historyItemForNewChildFrame(webframeChild));
1632a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1633a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (childItem)
16345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        child->loader().loadHistoryItem(childItem.get());
16357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    else
16365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        child->loader().load(FrameLoadRequest(0, request.resourceRequest(), "_self"));
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Note a synchronous navigation (about:blank) would have already processed
16395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // onload, so it is possible for the child frame to have already been
16405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // detached by script in the page.
16415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (!child->tree().parent())
1642d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
16435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return child;
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
164610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::didChangeContentsSize(const IntSize& size)
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is only possible on the main frame.
164907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder && m_textFinder->totalMatchCount() > 0) {
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!parent());
165107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->increaseMarkerVersion();
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::createFrameView()
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
165710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    TRACE_EVENT0("webkit", "WebLocalFrameImpl::createFrameView");
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(frame()); // If frame() doesn't exist, we probably didn't init properly.
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebViewImpl* webView = viewImpl();
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isMainFrame = webView->mainFrameImpl()->frame() == frame();
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isMainFrame)
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webView->suppressInvalidations(true);
1665e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1666bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    frame()->createView(webView->size(), webView->baseBackgroundColor(), webView->isTransparent());
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (webView->shouldAutoResize() && isMainFrame)
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        frame()->view()->enableAutoSizeMode(true, webView->minAutoSize(), webView->maxAutoSize());
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
167019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    frame()->view()->setInputEventsTransformForEmulation(m_inputEventsOffsetForEmulation, m_inputEventsScaleFactorForEmulation);
16711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isMainFrame)
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        webView->suppressInvalidations(false);
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
167610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::fromFrame(LocalFrame* frame)
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame)
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
168076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    return fromFrame(*frame);
168176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
168276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
168376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)WebLocalFrameImpl* WebLocalFrameImpl::fromFrame(LocalFrame& frame)
168476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
168576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    FrameLoaderClient* client = frame.loader().client();
1686d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!client || !client->isFrameLoaderClientImpl())
1687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 0;
1688d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return toFrameLoaderClientImpl(client)->webFrame();
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
169110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::fromFrameOwnerElement(Element* element)
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
169310f88d5669dbd969c059d61ba09fa37dd72ac559Ben 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.
169443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (!isHTMLFrameElementBase(element))
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
169607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return fromFrame(toLocalFrame(toHTMLFrameElementBase(element)->contentFrame()));
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
169910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebViewImpl* WebLocalFrameImpl::viewImpl() const
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame())
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebViewImpl::fromPage(frame()->page());
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170610f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSourceImpl* WebLocalFrameImpl::dataSourceImpl() const
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebDataSourceImpl*>(dataSource());
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebDataSourceImpl* WebLocalFrameImpl::provisionalDataSourceImpl() const
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<WebDataSourceImpl*>(provisionalDataSource());
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setFindEndstateFocusAndSelection()
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
171810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    WebLocalFrameImpl* mainFrameImpl = viewImpl()->mainFrameImpl();
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
172007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (this != mainFrameImpl->activeMatchFrame())
172107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
172207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
172307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (Range* activeMatch = m_textFinder->activeMatch()) {
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the user has set the selection since the match was found, we
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // don't focus anything.
17268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        VisibleSelection selection(frame()->selection().selection());
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!selection.isNone())
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Try to find the first focusable node up the chain, which will, for
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // example, focus links if we have found text within the link.
173207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        Node* node = activeMatch->firstNode();
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node && node->isInShadowTree()) {
1734d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (Node* host = node->shadowHost()) {
1735d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                if (isHTMLInputElement(*host) || isHTMLTextAreaElement(*host))
1736d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                    node = host;
1737d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            }
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1739e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        for (; node; node = node->parentNode()) {
1740df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (!node->isElementNode())
1741df95704c49daea886ddad70775bda23618d6274dBen Murdoch                continue;
1742df95704c49daea886ddad70775bda23618d6274dBen Murdoch            Element* element = toElement(node);
1743df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (element->isFocusable()) {
1744e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                // Found a focusable parent node. Set the active match as the
1745e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                // selection and focus to the focusable node.
174607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                frame()->selection().setSelection(VisibleSelection(activeMatch));
1747df95704c49daea886ddad70775bda23618d6274dBen Murdoch                frame()->document()->setFocusedElement(element);
1748e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                return;
1749e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            }
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Iterate over all the nodes in the range until we find a focusable node.
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // This, for example, sets focus to the first link if you search for
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // text and text that is within one or more links.
175507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        node = activeMatch->firstNode();
175607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        for (; node && node != activeMatch->pastLastNode(); node = NodeTraversal::next(*node)) {
1757df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (!node->isElementNode())
1758df95704c49daea886ddad70775bda23618d6274dBen Murdoch                continue;
1759df95704c49daea886ddad70775bda23618d6274dBen Murdoch            Element* element = toElement(node);
1760df95704c49daea886ddad70775bda23618d6274dBen Murdoch            if (element->isFocusable()) {
1761df95704c49daea886ddad70775bda23618d6274dBen Murdoch                frame()->document()->setFocusedElement(element);
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // No node related to the active match was focusable, so set the
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // active match as the selection (so that when you end the Find session,
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // you'll have the last thing you found highlighted) and make sure that
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // we have nothing focused (otherwise you might have text selected but
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // a link focused, which is weird).
177107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        frame()->selection().setSelection(VisibleSelection(activeMatch));
1772d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        frame()->document()->setFocusedElement(nullptr);
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Finally clear the active match, for two reasons:
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We just finished the find 'session' and we don't want future (potentially
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // unrelated) find 'sessions' operations to start at the same place.
177710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        // The WebLocalFrameImpl could get reused and the activeMatch could end up pointing
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // to a document that is no longer valid. Keeping an invalid reference around
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // is just asking for trouble.
178007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->resetActiveMatch();
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
178410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::didFail(const ResourceError& error, bool wasProvisional)
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!client())
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebURLError webError = error;
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (wasProvisional)
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        client()->didFailProvisionalLoad(this, webError);
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        client()->didFailLoad(this, webError);
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
179510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setCanHaveScrollbars(bool canHaveScrollbars)
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frame()->view()->setCanHaveScrollbars(canHaveScrollbars);
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
180010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::setInputEventsTransformForEmulation(const IntSize& offset, float contentScaleFactor)
18011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
180219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    m_inputEventsOffsetForEmulation = offset;
18031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_inputEventsScaleFactorForEmulation = contentScaleFactor;
18041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (frame()->view())
180519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        frame()->view()->setInputEventsTransformForEmulation(m_inputEventsOffsetForEmulation, m_inputEventsScaleFactorForEmulation);
18061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
18071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
180810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::loadJavaScriptURL(const KURL& url)
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
181093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // This is copied from ScriptController::executeScriptIfJavaScriptURL.
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Unfortunately, we cannot just use that method since it is private, and
181210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // it also doesn't quite behave as we require it to for bookmarklets. The
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // key difference is that we need to suppress loading the string result
18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // from evaluating the JS URL if executing the JS URL resulted in a
181510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // location change. We also allow a JS URL to be loaded even if scripts on
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the page are otherwise disabled.
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!frame()->document() || !frame()->page())
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1821d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Document> ownerDocument(frame()->document());
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Protect privileged pages against bookmarklets and other javascript manipulations.
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (SchemeRegistry::shouldTreatURLSchemeAsNotAllowingJavascriptURLs(frame()->document()->url().protocol()))
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String script = decodeURLEscapeSequences(url.string().substring(strlen("javascript:")));
18281e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture);
18295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::HandleScope handleScope(toIsolate(frame()));
18305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    v8::Local<v8::Value> result = frame()->script().executeScriptInMainWorldAndReturnValue(ScriptSourceCode(script));
18315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (result.IsEmpty() || !result->IsString())
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
18335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    String scriptResult = toCoreString(v8::Handle<v8::String>::Cast(result));
1834f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!frame()->navigationScheduler().locationChangePending())
1835591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        frame()->document()->loader()->replaceDocument(scriptResult, ownerDocument.get());
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
183876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void WebLocalFrameImpl::addStyleSheetByURL(const WebString& url)
183976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){
184076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    RefPtrWillBeRawPtr<Element> styleElement = frame()->document()->createElement(HTMLNames::linkTag, false);
184176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
184276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    styleElement->setAttribute(HTMLNames::typeAttr, "text/css");
184376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    styleElement->setAttribute(HTMLNames::relAttr, "stylesheet");
184476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    styleElement->setAttribute(HTMLNames::hrefAttr, url);
184576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
184676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    frame()->document()->head()->appendChild(styleElement.release(), IGNORE_EXCEPTION);
184776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)}
184876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)
184910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::willDetachParent()
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Do not expect string scoping results from any frames that got detached
18525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // in the middle of the operation.
185307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder && m_textFinder->scopingInProgress()) {
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // There is a possibility that the frame being detached was the only
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // pending one. We need to make sure final replies can be sent.
185707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->flushCurrentScoping();
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
185907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder->cancelPendingScopingEffort();
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
186310f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebLocalFrameImpl* WebLocalFrameImpl::activeMatchFrame() const
186407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
186507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(!parent());
186607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
186707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
186807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->activeMatchFrame();
186907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
187007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
187107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
187210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebCore::Range* WebLocalFrameImpl::activeMatch() const
187307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
187407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_textFinder)
187507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return m_textFinder->activeMatch();
187607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return 0;
187707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
187807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
187910f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochTextFinder& WebLocalFrameImpl::ensureTextFinder()
188007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
188107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (!m_textFinder)
188207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_textFinder = TextFinder::create(*this);
188307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
188407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return *m_textFinder;
188507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
188607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
188710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::invalidateScrollbar() const
188807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
188907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(frame() && frame()->view());
189007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FrameView* view = frame()->view();
189107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Invalidate the vertical scroll bar region for the view.
189207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    Scrollbar* scrollbar = view->verticalScrollbar();
189307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (scrollbar)
189407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        scrollbar->invalidate();
189507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
189607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
189710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid WebLocalFrameImpl::invalidateAll() const
189807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
189907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ASSERT(frame() && frame()->view());
190007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FrameView* view = frame()->view();
190107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    view->invalidateRect(view->frameRect());
190207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    invalidateScrollbar();
190307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
190407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
19055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)PassRefPtr<LocalFrame> WebLocalFrameImpl::initializeAsChildFrame(FrameHost* host, FrameOwner* owner, const AtomicString& name, const AtomicString& fallbackName)
19065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
19075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtr<LocalFrame> frame = LocalFrame::create(&m_frameLoaderClientImpl, host, owner);
19085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    setWebCoreFrame(frame);
19095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    frame->tree().setName(name, fallbackName);
19105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // May dispatch JS events; frame may be detached after this.
19115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    frame->init();
19125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return frame;
19135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
19145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
191551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
1916