1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*
2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without
5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are
6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met:
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions of source code must retain the above copyright
9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer.
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions in binary form must reproduce the above
11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer
12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution.
14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Neither the name of Google Inc. nor the names of its
15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission.
17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// How ownership works
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// -------------------
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Big oh represents a refcounted relationship: owner O--- ownee
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebView (for the toplevel frame only)
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//    O
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//    |
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//   Page O------- Frame (m_mainFrame) O-------O FrameView
40643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//                   ||
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//                   ||
42643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//               FrameLoader O-------- WebFrame (via FrameLoaderClient)
43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// FrameLoader and Frame are formerly one object that was split apart because
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// it got too big. They basically have the same lifetime, hence the double line.
46643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebFrame is refcounted and has one ref on behalf of the FrameLoader/Frame.
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// This is not a normal reference counted pointer because that would require
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// changing WebKit code that we don't control. Instead, it is created with this
50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ref initially and it is removed when the FrameLoader is getting destroyed.
51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebFrames are created in two places, first in WebViewImpl when the root
53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// frame is created, and second in WebFrame::CreateChildFrame when sub-frames
54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// are created. WebKit will hook up this object to the FrameLoader/Frame
55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// and the refcount will be correct.
56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// How frames are destroyed
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// ------------------------
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// The main frame is never destroyed and is re-used. The FrameLoader is re-used
61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// and a reference to the main frame is kept by the Page.
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// When frame content is replaced, all subframes are destroyed. This happens
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// in FrameLoader::detachFromParent for each subframe.
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
66643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Frame going away causes the FrameLoader to get deleted. In FrameLoader's
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// destructor, it notifies its client with frameLoaderDestroyed. This calls
68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebFrame::Closing and then derefs the WebFrame and will cause it to be
69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// deleted (unless an external someone is also holding a reference).
70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
71643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h"
72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFrameImpl.h"
73643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "AssociatedURLLoader.h"
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "BackForwardController.h"
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Chrome.h"
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ClipboardUtilitiesChromium.h"
78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Console.h"
795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "DOMUtilitiesPrivate.h"
805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "DOMWindow.h"
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Document.h"
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "DocumentFragment.h" // Only needed for ReplaceSelectionCommand.h :(
83643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "DocumentLoader.h"
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "DocumentMarker.h"
85cad810f21b803229eb11403f9209855525a25d57Steve Block#include "DocumentMarkerController.h"
86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Editor.h"
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "EventHandler.h"
88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FormState.h"
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameLoadRequest.h"
905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "FrameLoader.h"
91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameTree.h"
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "FrameView.h"
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "HitTestResult.h"
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLCollection.h"
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLFormElement.h"
96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLFrameOwnerElement.h"
97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLHeadElement.h"
98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLInputElement.h"
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLLinkElement.h"
100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "HTMLNames.h"
1015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "HistoryItem.h"
102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "InspectorController.h"
103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Page.h"
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "painting/GraphicsContextBuilder.h"
105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "Performance.h"
106ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "PlatformBridge.h"
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "PluginDocument.h"
108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "PrintContext.h"
109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderFrame.h"
1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "RenderLayer.h"
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "RenderObject.h"
112d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "RenderTreeAsText.h"
113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderView.h"
114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "RenderWidget.h"
115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ReplaceSelectionCommand.h"
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ResourceHandle.h"
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ResourceRequest.h"
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "SVGDocumentExtensions.h"
119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "SVGSMILElement.h"
120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ScriptController.h"
121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ScriptSourceCode.h"
122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ScriptValue.h"
123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "ScrollTypes.h"
1245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "ScrollbarTheme.h"
125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "SelectionController.h"
126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Settings.h"
127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "SkiaUtils.h"
128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "SubstituteData.h"
129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "TextAffinity.h"
130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "TextIterator.h"
131d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "WebAnimationControllerImpl.h"
132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebConsoleMessage.h"
133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebDataSourceImpl.h"
134d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "WebDocument.h"
135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFindOptions.h"
136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFormElement.h"
137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebFrameClient.h"
138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebHistoryItem.h"
139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebInputElement.h"
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebNode.h"
141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebPasswordAutocompleteListener.h"
142bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include "WebPerformance.h"
143e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#include "WebPlugin.h"
144dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "WebPluginContainerImpl.h"
1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebPoint.h"
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebRange.h"
147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebRect.h"
148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebScriptSource.h"
149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebSecurityOrigin.h"
150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebSize.h"
151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebURLError.h"
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebVector.h"
153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebViewImpl.h"
154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "XPathResult.h"
1555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "markup.h"
156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <algorithm>
158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/CurrentTime.h>
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if OS(LINUX) || OS(FREEBSD)
161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <gdk/gdk.h>
162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
16481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(V8)
16581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "AsyncFileSystem.h"
16681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "AsyncFileSystemChromium.h"
1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "DirectoryEntry.h"
16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "DOMFileSystem.h"
1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "FileEntry.h"
1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "V8DirectoryEntry.h"
17181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "V8DOMFileSystem.h"
1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "V8FileEntry.h"
1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebFileSystem.h"
17481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif
17581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
176643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebCore;
177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
178643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit {
179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
180d0825bca7fe65beaee391d30da42e937db621564Steve Blockstatic int frameCount = 0;
181d0825bca7fe65beaee391d30da42e937db621564Steve Block
182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Key for a StatsCounter tracking how many WebFrames are active.
183643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic const char* const webFrameActiveCount = "WebFrameActiveCount";
184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
185643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic const char* const osdType = "application/opensearchdescription+xml";
186643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic const char* const osdRel = "search";
187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Backend for contentAsPlainText, this is a recursive function that gets
189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// the text for the current frame and all of its subframes. It will append
190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// the text of each frame in turn to the |output| up to |maxChars| length.
191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block//
192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// The |frame| must be non-null.
193643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic void frameContentAsPlainText(size_t maxChars, Frame* frame,
194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                    Vector<UChar>* output)
195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Document* doc = frame->document();
197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!doc)
198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!frame->view())
201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // TextIterator iterates over the visual representation of the DOM. As such,
204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // it requires you to do a layout before using it (otherwise it'll crash).
205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (frame->view()->needsLayout())
206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame->view()->layout();
207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Select the document body.
209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<Range> range(doc->createRange());
210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ExceptionCode exception = 0;
211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    range->selectNodeContents(doc->body(), exception);
212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!exception) {
214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // The text iterator will walk nodes giving us text. This is similar to
215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // the plainText() function in TextIterator.h, but we implement the maximum
216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // size and also copy the results directly into a wstring, avoiding the
217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // string conversion.
218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        for (TextIterator it(range.get()); !it.atEnd(); it.advance()) {
219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            const UChar* chars = it.characters();
220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (!chars) {
221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                if (it.length()) {
222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // It appears from crash reports that an iterator can get into a state
223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // where the character count is nonempty but the character pointer is
224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // null. advance()ing it will then just add that many to the null
225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // pointer which won't be caught in a null check but will crash.
226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    //
227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // A null pointer and 0 length is common for some nodes.
228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    //
229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // IF YOU CATCH THIS IN A DEBUGGER please let brettw know. We don't
230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // currently understand the conditions for this to occur. Ideally, the
231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // iterators would never get into the condition so we should fix them
232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    // if we can.
233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    ASSERT_NOT_REACHED();
234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    break;
235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                }
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // Just got a null node, we can forge ahead!
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                continue;
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            size_t toAppend =
241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                std::min(static_cast<size_t>(it.length()), maxChars - output->size());
242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            output->append(chars, toAppend);
243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (output->size() >= maxChars)
244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return; // Filled up the buffer.
245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // The separator between frames when the frames are converted to plain text.
249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const UChar frameSeparator[] = { '\n', '\n' };
250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const size_t frameSeparatorLen = 2;
251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Recursively walk the children.
253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FrameTree* frameTree = frame->tree();
254643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (Frame* curChild = frameTree->firstChild(); curChild; curChild = curChild->tree()->nextSibling()) {
255e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        // Ignore the text of non-visible frames.
256e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        RenderView* contentRenderer = curChild->contentRenderer();
257e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        RenderPart* ownerRenderer = curChild->ownerRenderer();
258e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        if (!contentRenderer || !contentRenderer->width() || !contentRenderer->height()
259e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            || (contentRenderer->x() + contentRenderer->width() <= 0) || (contentRenderer->y() + contentRenderer->height() <= 0)
260e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            || (ownerRenderer && ownerRenderer->style() && ownerRenderer->style()->visibility() != VISIBLE)) {
261e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            continue;
262e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        }
263e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Make sure the frame separator won't fill up the buffer, and give up if
265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // it will. The danger is if the separator will make the buffer longer than
266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // maxChars. This will cause the computation above:
267643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        //   maxChars - output->size()
268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // to be a negative number which will crash when the subframe is added.
269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (output->size() >= maxChars - frameSeparatorLen)
270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return;
271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        output->append(frameSeparator, frameSeparatorLen);
273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frameContentAsPlainText(maxChars, curChild, output);
274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (output->size() >= maxChars)
275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return; // Filled up the buffer.
276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
279a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochstatic long long generateFrameIdentifier()
280a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
281a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    static long long next = 0;
282a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return ++next;
283a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
284a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
285e458d70a0d18538346f41b503114c9ebe6b2ce12Leon ClarkeWebPluginContainerImpl* WebFrameImpl::pluginContainerFromFrame(Frame* frame)
286dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
287dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!frame)
288dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
289dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!frame->document() || !frame->document()->isPluginDocument())
290dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
291dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    PluginDocument* pluginDocument = static_cast<PluginDocument*>(frame->document());
292dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return static_cast<WebPluginContainerImpl *>(pluginDocument->pluginWidget());
293dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
294dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
295dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Simple class to override some of PrintContext behavior. Some of the methods
296dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// made virtual so that they can be overriden by ChromePluginPrintContext.
297ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass ChromePrintContext : public PrintContext {
298ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_NONCOPYABLE(ChromePrintContext);
299643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockpublic:
300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ChromePrintContext(Frame* frame)
301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        : PrintContext(frame)
302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        , m_printedPageWidth(0)
303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    virtual void begin(float width, float height)
307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT(!m_printedPageWidth);
309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_printedPageWidth = width;
3106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        PrintContext::begin(m_printedPageWidth, height);
311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
312643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
313dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void end()
314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
315dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        PrintContext::end();
316dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual float getPageShrink(int pageNumber) const
319643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        IntRect pageRect = m_pageRects[pageNumber];
321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return m_printedPageWidth / pageRect.width();
322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
324dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Spools the printed page, a subrect of m_frame. Skip the scale step.
325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // NativeTheme doesn't play well with scaling. Scaling is done browser side
326dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // instead. Returns the scale to be applied.
327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // On Linux, we don't have the problem with NativeTheme, hence we let WebKit
328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // do the scaling and ignore the return value.
329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual float spoolPage(GraphicsContext& ctx, int pageNumber)
330643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
331643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        IntRect pageRect = m_pageRects[pageNumber];
332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        float scale = m_printedPageWidth / pageRect.width();
333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
334643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ctx.save();
335bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if OS(LINUX) || OS(FREEBSD)
336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ctx.scale(WebCore::FloatSize(scale, scale));
337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
338643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ctx.translate(static_cast<float>(-pageRect.x()),
339643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                      static_cast<float>(-pageRect.y()));
340643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ctx.clip(pageRect);
341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->view()->paintContents(&ctx, pageRect);
342643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ctx.restore();
343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return scale;
344643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PrintContext::computePageRects(printRect, headerHeight, footerHeight, userScaleFactor, outPageHeight);
349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual int pageCount() const
352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
353dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return PrintContext::pageCount();
354dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
355dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
356dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual bool shouldUseBrowserOverlays() const
357dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
358dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
360dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
361643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockprivate:
362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Set when printing.
363643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    float m_printedPageWidth;
364643ca7872b450ea4efacab6188849e5aac2ba161Steve Block};
365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Simple class to override some of PrintContext behavior. This is used when
367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// the frame hosts a plugin that supports custom printing. In this case, we
368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// want to delegate all printing related calls to the plugin.
369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass ChromePluginPrintContext : public ChromePrintContext {
370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic:
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ChromePluginPrintContext(Frame* frame, WebPluginContainerImpl* plugin, int printerDPI)
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        : ChromePrintContext(frame), m_plugin(plugin), m_pageCount(0), m_printerDPI(printerDPI)
373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    virtual void begin(float width, float height)
377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void end()
381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_plugin->printEnd();
383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual float getPageShrink(int pageNumber) const
386dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
387dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // We don't shrink the page (maybe we should ask the widget ??)
388dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 1.0;
389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_pageCount = m_plugin->printBegin(IntRect(printRect), m_printerDPI);
394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual int pageCount() const
397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return m_pageCount;
399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Spools the printed page, a subrect of m_frame.  Skip the scale step.
402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // NativeTheme doesn't play well with scaling. Scaling is done browser side
403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // instead.  Returns the scale to be applied.
404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual float spoolPage(GraphicsContext& ctx, int pageNumber)
405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_plugin->printPage(pageNumber, &ctx);
407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 1.0;
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    virtual bool shouldUseBrowserOverlays() const
411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    {
412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
414dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate:
416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Set when printing.
41765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPluginContainerImpl* m_plugin;
418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int m_pageCount;
419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int m_printerDPI;
420dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block};
421dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
422643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockstatic WebDataSource* DataSourceForDocLoader(DocumentLoader* loader)
423643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
424643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return loader ? WebDataSourceImpl::fromDocumentLoader(loader) : 0;
425643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
426643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
427643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
428643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebFrame -------------------------------------------------------------------
429643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
430643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebFrameImpl::DeferredScopeStringMatches {
431643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockpublic:
432643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DeferredScopeStringMatches(WebFrameImpl* webFrame,
433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                               int identifier,
434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                               const WebString& searchText,
435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                               const WebFindOptions& options,
436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                               bool reset)
437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        : m_timer(this, &DeferredScopeStringMatches::doTimeout)
438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        , m_webFrame(webFrame)
439643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        , m_identifier(identifier)
440643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        , m_searchText(searchText)
441643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        , m_options(options)
442643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        , m_reset(reset)
443643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
444643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_timer.startOneShot(0.0);
445643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
446643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
447643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockprivate:
448643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void doTimeout(Timer<DeferredScopeStringMatches>*)
449643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
450643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_webFrame->callScopeStringMatches(
451643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this, m_identifier, m_searchText, m_options, m_reset);
452643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
453643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
454643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Timer<DeferredScopeStringMatches> m_timer;
455643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<WebFrameImpl> m_webFrame;
456643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    int m_identifier;
457643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebString m_searchText;
458643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFindOptions m_options;
459643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool m_reset;
460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block};
461643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebFrame -------------------------------------------------------------------
464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
465d0825bca7fe65beaee391d30da42e937db621564Steve Blockint WebFrame::instanceCount()
466d0825bca7fe65beaee391d30da42e937db621564Steve Block{
467d0825bca7fe65beaee391d30da42e937db621564Steve Block    return frameCount;
468d0825bca7fe65beaee391d30da42e937db621564Steve Block}
469d0825bca7fe65beaee391d30da42e937db621564Steve Block
470643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrame::frameForEnteredContext()
471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Frame* frame =
473643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ScriptController::retrieveFrameForEnteredContext();
474643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WebFrameImpl::fromFrame(frame);
475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
476643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
477643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrame::frameForCurrentContext()
478643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Frame* frame =
480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ScriptController::retrieveFrameForCurrentContext();
481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WebFrameImpl::fromFrame(frame);
482643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
483643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
4842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if WEBKIT_USING_V8
4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebFrame* WebFrame::frameForContext(v8::Handle<v8::Context> context)
4862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return WebFrameImpl::fromFrame(V8Proxy::retrieveFrame(context));
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
491d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebFrame* WebFrame::fromFrameOwnerElement(const WebElement& element)
492d0825bca7fe65beaee391d30da42e937db621564Steve Block{
493d0825bca7fe65beaee391d30da42e937db621564Steve Block    return WebFrameImpl::fromFrameOwnerElement(
494d0825bca7fe65beaee391d30da42e937db621564Steve Block        PassRefPtr<Element>(element).get());
495d0825bca7fe65beaee391d30da42e937db621564Steve Block}
496d0825bca7fe65beaee391d30da42e937db621564Steve Block
497643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebFrameImpl::name() const
498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
49928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return m_frame->tree()->uniqueName();
500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
50206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenvoid WebFrameImpl::setName(const WebString& name)
503d0825bca7fe65beaee391d30da42e937db621564Steve Block{
50406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    m_frame->tree()->setName(name);
505d0825bca7fe65beaee391d30da42e937db621564Steve Block}
506d0825bca7fe65beaee391d30da42e937db621564Steve Block
507a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochlong long WebFrameImpl::identifier() const
508a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
509a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_identifier;
510a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
511a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
512643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebURL WebFrameImpl::url() const
513643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
514643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const WebDataSource* ds = dataSource();
515643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!ds)
516643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return WebURL();
517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return ds->request().url();
518643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
519643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
520643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebURL WebFrameImpl::favIconURL() const
521643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
522643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FrameLoader* frameLoader = m_frame->loader();
523643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // The URL to the favicon may be in the header. As such, only
524643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // ask the loader for the favicon if it's finished loading.
525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (frameLoader->state() == FrameStateComplete) {
526643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        const KURL& url = frameLoader->iconURL();
527643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!url.isEmpty())
528643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return url;
529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
530643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WebURL();
531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
532643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
533643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebURL WebFrameImpl::openSearchDescriptionURL() const
534643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
535643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FrameLoader* frameLoader = m_frame->loader();
536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (frameLoader->state() == FrameStateComplete
537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        && m_frame->document() && m_frame->document()->head()
538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        && !m_frame->tree()->parent()) {
539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        HTMLHeadElement* head = m_frame->document()->head();
540643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (head) {
541643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            RefPtr<HTMLCollection> children = head->children();
542643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            for (Node* child = children->firstItem(); child; child = children->nextItem()) {
543643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                HTMLLinkElement* linkElement = toHTMLLinkElement(child);
544643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                if (linkElement
545643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    && linkElement->type() == osdType
546643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    && linkElement->rel() == osdRel
547643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    && !linkElement->href().isEmpty())
548643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    return linkElement->href();
549643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
552643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WebURL();
553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
555d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebString WebFrameImpl::encoding() const
556d0825bca7fe65beaee391d30da42e937db621564Steve Block{
5572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return frame()->document()->loader()->writer()->encoding();
558d0825bca7fe65beaee391d30da42e937db621564Steve Block}
559d0825bca7fe65beaee391d30da42e937db621564Steve Block
560643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebSize WebFrameImpl::scrollOffset() const
561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FrameView* view = frameView();
563643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (view)
564643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return view->scrollOffset();
565643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
566643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WebSize();
567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
568643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
56981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebFrameImpl::setScrollOffset(const WebSize& offset)
57081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
57181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (FrameView* view = frameView())
57281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        view->setScrollOffset(IntPoint(offset.width, offset.height));
57381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
57481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
575643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebSize WebFrameImpl::contentsSize() const
576643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
577643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->view()->contentsSize();
578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
579643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
580643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint WebFrameImpl::contentsPreferredWidth() const
581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
582643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame->document() && m_frame->document()->renderView())
583bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return m_frame->document()->renderView()->minPreferredLogicalWidth();
584643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return 0;
585643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
586643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
587643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint WebFrameImpl::documentElementScrollHeight() const
588643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
589643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame->document() && m_frame->document()->documentElement())
590643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return m_frame->document()->documentElement()->scrollHeight();
591643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return 0;
592643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
593643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
594643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::hasVisibleContent() const
595643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
596643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->view()->visibleWidth() > 0 && frame()->view()->visibleHeight() > 0;
597643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
598643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
599643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebView* WebFrameImpl::view() const
600643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
601643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return viewImpl();
602643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
603643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
60481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebFrameImpl::clearOpener()
60581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
60681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_frame->loader()->setOpener(0);
60781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
60881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
609643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::opener() const
610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
611643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Frame* opener = 0;
612643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame)
613643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        opener = m_frame->loader()->opener();
614643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(opener);
615643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
617643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::parent() const
618643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
619643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Frame* parent = 0;
620643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame)
621643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        parent = m_frame->tree()->parent();
622643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(parent);
623643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
624643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
625643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::top() const
626643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame)
628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return fromFrame(m_frame->tree()->top());
629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return 0;
631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
632643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
633643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::firstChild() const
634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
635643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frame()->tree()->firstChild());
636643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
637643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
638643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::lastChild() const
639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frame()->tree()->lastChild());
641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
643643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::nextSibling() const
644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frame()->tree()->nextSibling());
646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
648643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::previousSibling() const
649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
650643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frame()->tree()->previousSibling());
651643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
652643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
653643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::traverseNext(bool wrap) const
654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
655643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frame()->tree()->traverseNextWithWrap(wrap));
656643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
657643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
658643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::traversePrevious(bool wrap) const
659643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
660643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frame()->tree()->traversePreviousWithWrap(wrap));
661643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
662643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
663643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::findChildByName(const WebString& name) const
664643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
665643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frame()->tree()->child(name));
666643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
667643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
668643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrame* WebFrameImpl::findChildByExpression(const WebString& xpath) const
669643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
670643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (xpath.isEmpty())
671643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
672643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
673643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Document* document = m_frame->document();
674643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
675643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ExceptionCode ec = 0;
676643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    PassRefPtr<XPathResult> xpathResult =
677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        document->evaluate(xpath,
678643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        document,
679643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        0, // namespace
680643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        XPathResult::ORDERED_NODE_ITERATOR_TYPE,
681643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        0, // XPathResult object
682643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ec);
683643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!xpathResult.get())
684643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
685643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
686643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Node* node = xpathResult->iterateNext(ec);
687643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
688643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!node || !node->isFrameOwnerElement())
689643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
690643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    HTMLFrameOwnerElement* frameElement =
691643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static_cast<HTMLFrameOwnerElement*>(node);
692643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return fromFrame(frameElement->contentFrame());
693643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
694643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
695d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebDocument WebFrameImpl::document() const
696d0825bca7fe65beaee391d30da42e937db621564Steve Block{
697d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!m_frame || !m_frame->document())
698d0825bca7fe65beaee391d30da42e937db621564Steve Block        return WebDocument();
699d0825bca7fe65beaee391d30da42e937db621564Steve Block    return WebDocument(m_frame->document());
700d0825bca7fe65beaee391d30da42e937db621564Steve Block}
701d0825bca7fe65beaee391d30da42e937db621564Steve Block
702643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::forms(WebVector<WebFormElement>& results) const
703643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
704643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
705643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
707643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<HTMLCollection> forms = m_frame->document()->forms();
70854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    size_t sourceLength = forms->length();
70954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    Vector<WebFormElement> temp;
71054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    temp.reserveCapacity(sourceLength);
71154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    for (size_t i = 0; i < sourceLength; ++i) {
712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Node* node = forms->item(i);
71354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        // Strange but true, sometimes node can be 0.
714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (node && node->isHTMLElement())
71554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            temp.append(WebFormElement(static_cast<HTMLFormElement*>(node)));
716dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
71754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    results.assign(temp);
718643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
719643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
720d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebAnimationController* WebFrameImpl::animationController()
721d0825bca7fe65beaee391d30da42e937db621564Steve Block{
722d0825bca7fe65beaee391d30da42e937db621564Steve Block    return &m_animationController;
723d0825bca7fe65beaee391d30da42e937db621564Steve Block}
724d0825bca7fe65beaee391d30da42e937db621564Steve Block
725bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenWebPerformance WebFrameImpl::performance() const
726bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
727bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!m_frame || !m_frame->domWindow())
728bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return WebPerformance();
729bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
730cad810f21b803229eb11403f9209855525a25d57Steve Block    return WebPerformance(m_frame->domWindow()->performance());
731bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
732bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
733643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebSecurityOrigin WebFrameImpl::securityOrigin() const
734643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
735643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame || !m_frame->document())
736643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return WebSecurityOrigin();
737643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
738643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WebSecurityOrigin(m_frame->document()->securityOrigin());
739643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
740643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
741643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::grantUniversalAccess()
742643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
743643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(m_frame && m_frame->document());
744643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame && m_frame->document())
745643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->document()->securityOrigin()->grantUniversalAccess();
746643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
747643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
748643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockNPObject* WebFrameImpl::windowObject() const
749643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
750643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
751643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
752643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
753643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_frame->script()->windowScriptNPObject();
754643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
755643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
756643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::bindToWindowObject(const WebString& name, NPObject* object)
757643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
758643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(m_frame);
759dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_frame || !m_frame->script()->canExecuteScripts(NotAboutToExecuteScript))
760643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
761643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
762643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String key = name;
763643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
764643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->script()->bindToWindowObject(m_frame, key, object);
765643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
766643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    notImplemented();
767643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
768643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
769643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
770643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::executeScript(const WebScriptSource& source)
771643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
7726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::base());
773643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->script()->executeScript(
7746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ScriptSourceCode(source.code, source.url, position));
775643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
776643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
777643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::executeScriptInIsolatedWorld(
778643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    int worldId, const WebScriptSource* sourcesIn, unsigned numSources,
779643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    int extensionGroup)
780643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
781643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Vector<ScriptSourceCode> sources;
782643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
783643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (unsigned i = 0; i < numSources; ++i) {
7846b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(sourcesIn[i].startLine), WTF::OneBasedNumber::base());
785643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        sources.append(ScriptSourceCode(
7866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            sourcesIn[i].code, sourcesIn[i].url, position));
787643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
788643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
789643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->script()->evaluateInIsolatedWorld(worldId, sources, extensionGroup);
790643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
791643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
792643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::addMessageToConsole(const WebConsoleMessage& message)
793643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
794643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(frame());
795643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
796643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    MessageLevel webCoreMessageLevel;
797643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    switch (message.level) {
798643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebConsoleMessage::LevelTip:
799643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        webCoreMessageLevel = TipMessageLevel;
800643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
801643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebConsoleMessage::LevelLog:
802643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        webCoreMessageLevel = LogMessageLevel;
803643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
804643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebConsoleMessage::LevelWarning:
805643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        webCoreMessageLevel = WarningMessageLevel;
806643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
807643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    case WebConsoleMessage::LevelError:
808643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        webCoreMessageLevel = ErrorMessageLevel;
809643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        break;
810643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    default:
811643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT_NOT_REACHED();
812643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
813643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
814643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
815643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    frame()->domWindow()->console()->addMessage(
816643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        OtherMessageSource, LogMessageType, webCoreMessageLevel, message.text,
817643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        1, String());
818643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
819643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
820643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::collectGarbage()
821643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
822643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
823643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
824643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame->settings()->isJavaScriptEnabled())
825643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
826643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // FIXME: Move this to the ScriptController and make it JS neutral.
827643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
828643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->script()->collectGarbage();
829643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
830643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    notImplemented();
831643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
832643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
833643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
834643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockv8::Handle<v8::Value> WebFrameImpl::executeScriptAndReturnValue(
836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    const WebScriptSource& source)
837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
8386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    TextPosition1 position(WTF::OneBasedNumber::fromOneBasedInt(source.startLine), WTF::OneBasedNumber::base());
839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_frame->script()->executeScript(
8406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ScriptSourceCode(source.code, source.url, position)).v8Value();
841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
843643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Returns the V8 context for this frame, or an empty handle if there is none.
844643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockv8::Local<v8::Context> WebFrameImpl::mainWorldScriptContext() const
845643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
846643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
847643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return v8::Local<v8::Context>();
848643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
849643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return V8Proxy::mainWorldContext(m_frame);
850643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
85181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
8522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochv8::Handle<v8::Value> WebFrameImpl::createFileSystem(WebFileSystem::Type type,
85381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                                     const WebString& name,
85481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                                                     const WebString& path)
85581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
85681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return toV8(DOMFileSystem::create(frame()->document(), name, AsyncFileSystemChromium::create(static_cast<AsyncFileSystem::Type>(type), path)));
85781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
8582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
8592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochv8::Handle<v8::Value> WebFrameImpl::createFileEntry(WebFileSystem::Type type,
8602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                                    const WebString& fileSystemName,
8612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                                    const WebString& fileSystemPath,
8622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                                    const WebString& filePath,
8632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                                    bool isDirectory)
8642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
8652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<DOMFileSystemBase> fileSystem = DOMFileSystem::create(frame()->document(), fileSystemName, AsyncFileSystemChromium::create(static_cast<AsyncFileSystem::Type>(type), fileSystemPath));
8662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (isDirectory)
8672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return toV8(DirectoryEntry::create(fileSystem, filePath));
8682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return toV8(FileEntry::create(fileSystem, filePath));
8692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
870643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
871643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
872643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::insertStyleText(
873643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const WebString& css, const WebString& id) {
874643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Document* document = frame()->document();
875643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!document)
876643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
877643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Element* documentElement = document->documentElement();
878643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!documentElement)
879643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
880643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
881643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ExceptionCode err = 0;
882643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
883643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!id.isEmpty()) {
884643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        Element* oldElement = document->getElementById(id);
885643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (oldElement) {
8866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            Node* parent = oldElement->parentNode();
887643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (!parent)
888643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return false;
889643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            parent->removeChild(oldElement, err);
890643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
891643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
892643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
893643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<Element> stylesheet = document->createElement(
894643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        HTMLNames::styleTag, false);
895643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!id.isEmpty())
896643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        stylesheet->setAttribute(HTMLNames::idAttr, id);
897643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    stylesheet->setTextContent(css, err);
898643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(!err);
899643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Node* first = documentElement->firstChild();
900643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool success = documentElement->insertBefore(stylesheet, first, err);
901643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(success);
902643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return success;
903643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
904643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
905692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid WebFrameImpl::reload(bool ignoreCache)
906643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
907643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->loader()->history()->saveDocumentAndScrollState();
908692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_frame->loader()->reload(ignoreCache);
909643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
910643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
911643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::loadRequest(const WebURLRequest& request)
912643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
913643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(!request.isNull());
914643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const ResourceRequest& resourceRequest = request.toResourceRequest();
915643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
916643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (resourceRequest.url().protocolIs("javascript")) {
917643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        loadJavaScriptURL(resourceRequest.url());
918643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
919643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
920643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
921643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->loader()->load(resourceRequest, false);
922643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
923643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
924643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::loadHistoryItem(const WebHistoryItem& item)
925643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
926643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<HistoryItem> historyItem = PassRefPtr<HistoryItem>(item);
927643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(historyItem.get());
928643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
929643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If there is no currentItem, which happens when we are navigating in
930643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // session history after a crash, we need to manufacture one otherwise WebKit
931643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // hoarks. This is probably the wrong thing to do, but it seems to work.
932643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<HistoryItem> currentItem = m_frame->loader()->history()->currentItem();
933643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!currentItem) {
934643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        currentItem = HistoryItem::create();
935643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        currentItem->setLastVisitWasFailure(true);
936643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->loader()->history()->setCurrentItem(currentItem.get());
93765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_frame->page()->backForward()->setCurrentItem(currentItem.get());
938643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
939643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
94054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    m_inSameDocumentHistoryLoad = currentItem->shouldDoSameDocumentNavigationTo(historyItem.get());
94181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_frame->page()->goToItem(historyItem.get(),
94281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                              FrameLoadTypeIndexedBackForward);
94354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    m_inSameDocumentHistoryLoad = false;
944643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
945643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
946643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::loadData(const WebData& data,
947643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                            const WebString& mimeType,
948643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                            const WebString& textEncoding,
949643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                            const WebURL& baseURL,
950643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                            const WebURL& unreachableURL,
951643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                            bool replace)
952643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
953643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    SubstituteData substData(data, mimeType, textEncoding, unreachableURL);
954643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(substData.isValid());
955643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
956643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If we are loading substitute data to replace an existing load, then
957643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // inherit all of the properties of that original request.  This way,
958643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // reload will re-attempt the original request.  It is essential that
959643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // we only do this when there is an unreachableURL since a non-empty
960643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // unreachableURL informs FrameLoader::reload to load unreachableURL
961643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // instead of the currently loaded URL.
962643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ResourceRequest request;
963643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (replace && !unreachableURL.isEmpty())
964643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        request = m_frame->loader()->originalRequest();
965643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    request.setURL(baseURL);
966643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
967643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->loader()->load(request, substData, false);
968643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (replace) {
969643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Do this to force WebKit to treat the load as replacing the currently
970643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // loaded page.
971643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->loader()->setReplacing();
972643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
973643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
974643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
975643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::loadHTMLString(const WebData& data,
976643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                  const WebURL& baseURL,
977643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                  const WebURL& unreachableURL,
978643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                  bool replace)
979643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
980643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    loadData(data,
981643ca7872b450ea4efacab6188849e5aac2ba161Steve Block             WebString::fromUTF8("text/html"),
982643ca7872b450ea4efacab6188849e5aac2ba161Steve Block             WebString::fromUTF8("UTF-8"),
983643ca7872b450ea4efacab6188849e5aac2ba161Steve Block             baseURL,
984643ca7872b450ea4efacab6188849e5aac2ba161Steve Block             unreachableURL,
985643ca7872b450ea4efacab6188849e5aac2ba161Steve Block             replace);
986643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
987643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
988643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::isLoading() const
989643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
990643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
991643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
992643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_frame->loader()->isLoading();
993643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
994643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
995643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::stopLoading()
996643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
997643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
998643ca7872b450ea4efacab6188849e5aac2ba161Steve Block      return;
999643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1000643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // FIXME: Figure out what we should really do here.  It seems like a bug
1001643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // that FrameLoader::stopLoading doesn't call stopAllLoaders.
1002643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->loader()->stopAllLoaders();
1003643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->loader()->stopLoading(UnloadEventPolicyNone);
1004643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1005643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1006643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebDataSource* WebFrameImpl::provisionalDataSource() const
1007643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1008643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FrameLoader* frameLoader = m_frame->loader();
1009643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1010643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We regard the policy document loader as still provisional.
1011643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DocumentLoader* docLoader = frameLoader->provisionalDocumentLoader();
1012643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!docLoader)
1013643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        docLoader = frameLoader->policyDocumentLoader();
1014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return DataSourceForDocLoader(docLoader);
1016643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1017643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1018643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebDataSource* WebFrameImpl::dataSource() const
1019643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1020643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return DataSourceForDocLoader(m_frame->loader()->documentLoader());
1021643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1022643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1023643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebHistoryItem WebFrameImpl::previousHistoryItem() const
1024643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1025643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We use the previous item here because documentState (filled-out forms)
1026643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // only get saved to history when it becomes the previous item.  The caller
1027643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // is expected to query the history item after a navigation occurs, after
1028643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // the desired history item has become the previous entry.
102928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    return WebHistoryItem(m_frame->loader()->history()->previousItem());
1030643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1031643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1032643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebHistoryItem WebFrameImpl::currentHistoryItem() const
1033643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1034dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If we are still loading, then we don't want to clobber the current
1035ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // history item as this could cause us to lose the scroll position and
1036dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // document state.  However, it is OK for new navigations.
103754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    // FIXME: Can we make this a plain old getter, instead of worrying about
103854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    // clobbering here?
103954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    if (!m_inSameDocumentHistoryLoad && (m_frame->loader()->loadType() == FrameLoadTypeStandard
104054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        || !m_frame->loader()->activeDocumentLoader()->isLoadingInAPISense()))
1041dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_frame->loader()->history()->saveDocumentAndScrollState();
1042643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
104365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return WebHistoryItem(m_frame->page()->backForward()->currentItem());
1044643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1045643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1046643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::enableViewSourceMode(bool enable)
1047643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1048643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame)
1049643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->setInViewSourceMode(enable);
1050643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1051643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1052643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::isViewSourceModeEnabled() const
1053643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1054643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame)
1055643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return m_frame->inViewSourceMode();
1056643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1057643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return false;
1058643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1059643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1060643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::setReferrerForRequest(
1061643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebURLRequest& request, const WebURL& referrerURL) {
1062643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String referrer;
1063643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (referrerURL.isEmpty())
1064643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        referrer = m_frame->loader()->outgoingReferrer();
1065643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
1066643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        referrer = referrerURL.spec().utf16();
1067643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (SecurityOrigin::shouldHideReferrer(request.url(), referrer))
1068643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1069643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    request.setHTTPHeaderField(WebString::fromUTF8("Referer"), referrer);
1070643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1071643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1072643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::dispatchWillSendRequest(WebURLRequest& request)
1073643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1074643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ResourceResponse response;
1075643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->loader()->client()->dispatchWillSendRequest(
1076643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        0, 0, request.toMutableResourceRequest(), response);
1077643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1078643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
10792bde8e466a4451c7319e3a072d118917957d6554Steve Block// FIXME: Remove this overload when clients have been changed to pass options.
10804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangWebURLLoader* WebFrameImpl::createAssociatedURLLoader()
10814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang{
10824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    return new AssociatedURLLoader(this);
10834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang}
10844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
10852bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebURLLoader* WebFrameImpl::createAssociatedURLLoader(const WebURLLoaderOptions& options)
10862bde8e466a4451c7319e3a072d118917957d6554Steve Block{
10872bde8e466a4451c7319e3a072d118917957d6554Steve Block    return new AssociatedURLLoader(this, options);
10882bde8e466a4451c7319e3a072d118917957d6554Steve Block}
10892bde8e466a4451c7319e3a072d118917957d6554Steve Block
109068513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid WebFrameImpl::commitDocumentData(const char* data, size_t length)
1091643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
109268513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_frame->loader()->documentLoader()->commitData(data, length);
1093643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1094643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1095643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockunsigned WebFrameImpl::unloadListenerCount() const
1096643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1097643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->domWindow()->pendingUnloadEventListeners();
1098643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1099643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1100643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::isProcessingUserGesture() const
1101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->loader()->isProcessingUserGesture();
1103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1105643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::willSuppressOpenerInNewFrame() const
1106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->loader()->suppressOpenerInNewFrame();
1108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1110643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::replaceSelection(const WebString& text)
1111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<DocumentFragment> fragment = createFragmentFromText(
1113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->selection()->toNormalizedRange().get(), text);
1114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    applyCommand(ReplaceSelectionCommand::create(
111581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        frame()->document(), fragment.get(), ReplaceSelectionCommand::SmartReplace | ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting));
1116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1118643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::insertText(const WebString& text)
1119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1120cad810f21b803229eb11403f9209855525a25d57Steve Block    Editor* editor = frame()->editor();
1121cad810f21b803229eb11403f9209855525a25d57Steve Block
1122cad810f21b803229eb11403f9209855525a25d57Steve Block    if (editor->hasComposition())
1123cad810f21b803229eb11403f9209855525a25d57Steve Block        editor->confirmComposition(text);
1124cad810f21b803229eb11403f9209855525a25d57Steve Block    else
1125cad810f21b803229eb11403f9209855525a25d57Steve Block        editor->insertText(text, 0);
1126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1128643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::setMarkedText(
1129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const WebString& text, unsigned location, unsigned length)
1130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Editor* editor = frame()->editor();
1132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Vector<CompositionUnderline> decorations;
1134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    editor->setComposition(text, decorations, location, length);
1135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1137643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::unmarkText()
1138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    frame()->editor()->confirmCompositionWithoutDisturbingSelection();
1140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1142643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::hasMarkedText() const
1143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->editor()->hasComposition();
1145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1147643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebRange WebFrameImpl::markedRange() const
1148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->editor()->compositionRange();
1150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1152bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool WebFrameImpl::firstRectForCharacterRange(unsigned location, unsigned length, WebRect& rect) const
1153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1154bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if ((location + length < location) && (location + length))
1155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        length = 0;
1156bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1157bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Element* selectionRoot = frame()->selection()->rootEditableElement();
1158bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Element* scope = selectionRoot ? selectionRoot : frame()->document()->documentElement();
1159bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    RefPtr<Range> range = TextIterator::rangeFromLocationAndLength(scope, location, length);
1160bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!range)
1161bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
1162bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    IntRect intRect = frame()->editor()->firstRectForRange(range.get());
1163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    rect = WebRect(intRect.x(), intRect.y(), intRect.width(), intRect.height());
1164bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1165bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return true;
1166bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1167bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1168643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::executeCommand(const WebString& name)
1169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1170643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(frame());
1171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1172643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (name.length() <= 2)
1173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
1174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1175643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Since we don't have NSControl, we will convert the format of command
1176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // string and call the function on Editor directly.
1177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String command = name;
1178643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Make sure the first letter is upper case.
1180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    command.replace(0, 1, command.substring(0, 1).upper());
1181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Remove the trailing ':' if existing.
1183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (command[command.length() - 1] == UChar(':'))
1184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        command = command.substring(0, command.length() - 1);
1185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1186e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (command == "Copy") {
1187e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
1188e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (pluginContainer) {
1189e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            pluginContainer->copy();
1190e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            return true;
1191e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        }
1192e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    }
1193e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool rv = true;
1195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Specially handling commands that Editor::execCommand does not directly
1197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // support.
1198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (command == "DeleteToEndOfParagraph") {
1199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        Editor* editor = frame()->editor();
1200cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!editor->deleteWithDirection(DirectionForward,
1201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                         ParagraphBoundary,
1202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                         true,
1203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                         false)) {
1204cad810f21b803229eb11403f9209855525a25d57Steve Block            editor->deleteWithDirection(DirectionForward,
1205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                        CharacterGranularity,
1206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                        true,
1207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                        false);
1208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
1209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else if (command == "Indent")
1210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->editor()->indent();
1211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (command == "Outdent")
1212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->editor()->outdent();
1213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (command == "DeleteBackward")
1214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        rv = frame()->editor()->command(AtomicString("BackwardDelete")).execute();
1215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (command == "DeleteForward")
1216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        rv = frame()->editor()->command(AtomicString("ForwardDelete")).execute();
1217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else if (command == "AdvanceToNextMisspelling") {
1218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // False must be passed here, or the currently selected word will never be
1219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // skipped.
1220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->editor()->advanceToNextMisspelling(false);
1221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else if (command == "ToggleSpellPanel")
1222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->editor()->showSpellingGuessPanel();
1223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
1224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        rv = frame()->editor()->command(command).execute();
1225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return rv;
1226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1228643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::executeCommand(const WebString& name, const WebString& value)
1229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(frame());
1231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String webName = name;
1232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // moveToBeginningOfDocument and moveToEndfDocument are only handled by WebKit
1234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // for editable nodes.
1235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!frame()->editor()->canEdit() && webName == "moveToBeginningOfDocument")
1236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return viewImpl()->propagateScroll(ScrollUp, ScrollByDocument);
1237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!frame()->editor()->canEdit() && webName == "moveToEndOfDocument")
1239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return viewImpl()->propagateScroll(ScrollDown, ScrollByDocument);
1240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->editor()->command(webName).execute(value);
1242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1244643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::isCommandEnabled(const WebString& name) const
1245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(frame());
1247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->editor()->command(name).isEnabled();
1248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1250643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::enableContinuousSpellChecking(bool enable)
1251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1252643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (enable == isContinuousSpellCheckingEnabled())
1253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1254ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Note, the editor will will notify the client that the continuous spell
1255ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // checking state has changed by calling
1256ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // WebFrameClient::didToggleContinuousSpellChecking().
1257643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    frame()->editor()->toggleContinuousSpellChecking();
1258643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1260643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::isContinuousSpellCheckingEnabled() const
1261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->editor()->isContinuousSpellCheckingEnabled();
1263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1265643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::hasSelection() const
1266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1267e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
1268e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (pluginContainer)
1269e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return pluginContainer->plugin()->hasSelection();
1270e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // frame()->selection()->isNone() never returns true.
1272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return (frame()->selection()->start() != frame()->selection()->end());
1273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1275643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebRange WebFrameImpl::selectionRange() const
1276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return frame()->selection()->toNormalizedRange();
1278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1280643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebFrameImpl::selectionAsText() const
1281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1282e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
1283e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (pluginContainer)
1284e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return pluginContainer->plugin()->selectionAsText();
1285e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<Range> range = frame()->selection()->toNormalizedRange();
1287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!range.get())
1288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return WebString();
1289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String text = range->text();
1291d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS)
1292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    replaceNewlinesWithWindowsStyleNewlines(text);
1293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
1294643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    replaceNBSPWithSpace(text);
1295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return text;
1296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1298643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebFrameImpl::selectionAsMarkup() const
1299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1300e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
1301e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (pluginContainer)
1302e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        return pluginContainer->plugin()->selectionAsMarkup();
1303e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<Range> range = frame()->selection()->toNormalizedRange();
1305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!range.get())
1306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return WebString();
1307643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return createMarkup(range.get(), 0);
1309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1310643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
13115e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid WebFrameImpl::selectWordAroundPosition(Frame* frame, VisiblePosition pos)
13125e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
13135e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    VisibleSelection selection(pos);
13145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    selection.expandUsingGranularity(WordGranularity);
13155e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
131668513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (frame->selection()->shouldChangeSelection(selection)) {
1317dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        TextGranularity granularity = selection.isRange() ? WordGranularity : CharacterGranularity;
1318dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame->selection()->setSelection(selection, granularity);
1319dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
13205e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
13215e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
13225e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockbool WebFrameImpl::selectWordAroundCaret()
13235e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
13245e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    SelectionController* controller = frame()->selection();
13255e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    ASSERT(!controller->isNone());
13265e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (controller->isNone() || controller->isRange())
13275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return false;
13285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    selectWordAroundPosition(frame(), controller->selection().visibleStart());
13295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return true;
13305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
13315e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
13322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WebFrameImpl::selectRange(const WebPoint& start, const WebPoint& end)
13332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
13342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VisibleSelection selection(visiblePositionForWindowPoint(start),
13352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                               visiblePositionForWindowPoint(end));
13362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (frame()->selection()->shouldChangeSelection(selection))
13382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        frame()->selection()->setSelection(selection, CharacterGranularity,
13392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                                           MakeNonDirectionalSelection);
13402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
13412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochVisiblePosition WebFrameImpl::visiblePositionForWindowPoint(const WebPoint& point)
13432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
13442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HitTestRequest::HitTestRequestType hitType = HitTestRequest::MouseMove;
13452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    hitType |= HitTestRequest::ReadOnly;
13462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    hitType |= HitTestRequest::Active;
13472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HitTestRequest request(hitType);
13482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    FrameView* view = frame()->view();
13492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HitTestResult result(view->windowToContents(
13502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        view->convertFromContainingWindow(IntPoint(point.x, point.y))));
13512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    frame()->document()->renderView()->layer()->hitTest(request, result);
13532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Matching the logic in MouseEventWithHitTestResults::targetNode()
13552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Node* node = result.innerNode();
13562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!node)
13572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return VisiblePosition();
13582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Element* element = node->parentElement();
13592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!node->inDocument() && element && element->inDocument())
13602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        node = element;
13612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
13622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return node->renderer()->positionForPoint(result.localPoint());
13632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
13642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
136565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochint WebFrameImpl::printBegin(const WebSize& pageSize,
136665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             const WebNode& constrainToNode,
136765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             int printerDPI,
136865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                             bool* useBrowserOverlays)
1369643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1370643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(!frame()->document()->isFrameSet());
137165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WebPluginContainerImpl* pluginContainer = 0;
137265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (constrainToNode.isNull()) {
137365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // If this is a plugin document, check if the plugin supports its own
137465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // printing. If it does, we will delegate all printing to that.
137565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        pluginContainer = pluginContainerFromFrame(frame());
137665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else {
137765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // We only support printing plugin nodes for now.
137865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        const Node* coreNode = constrainToNode.constUnwrap<Node>();
137965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (coreNode->hasTagName(HTMLNames::objectTag) || coreNode->hasTagName(HTMLNames::embedTag)) {
138065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            RenderObject* object = coreNode->renderer();
138165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (object && object->isWidget()) {
138265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                Widget* widget = toRenderWidget(object)->widget();
138365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                if (widget && widget->isPluginContainer())
138465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                    pluginContainer =  static_cast<WebPluginContainerImpl*>(widget);
138565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            }
138665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
138765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
138865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (pluginContainer && pluginContainer->supportsPaginatedPrint())
139065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_printContext.set(new ChromePluginPrintContext(frame(), pluginContainer, printerDPI));
1391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    else
1392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_printContext.set(new ChromePrintContext(frame()));
1393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1394643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FloatRect rect(0, 0, static_cast<float>(pageSize.width),
1395643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                         static_cast<float>(pageSize.height));
13966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_printContext->begin(rect.width(), rect.height());
1397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    float pageHeight;
1398643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We ignore the overlays calculation for now since they are generated in the
1399643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // browser. pageHeight is actually an output parameter.
1400643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_printContext->computePageRects(rect, 0, 0, 1.0, pageHeight);
1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (useBrowserOverlays)
1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        *useBrowserOverlays = m_printContext->shouldUseBrowserOverlays();
1403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1404643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_printContext->pageCount();
1405643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1406643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1407643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockfloat WebFrameImpl::getPrintPageShrink(int page)
1408643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1409643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Ensure correct state.
1410643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_printContext.get() || page < 0) {
1411643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT_NOT_REACHED();
1412643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
1413643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1414643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1415643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return m_printContext->getPageShrink(page);
1416643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1417643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1418643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockfloat WebFrameImpl::printPage(int page, WebCanvas* canvas)
1419643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1420643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Ensure correct state.
1421643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_printContext.get() || page < 0 || !frame() || !frame()->document()) {
1422643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT_NOT_REACHED();
1423643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
1424643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1425643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
14262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GraphicsContextBuilder builder(canvas);
14272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GraphicsContext& gc = builder.context();
14282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if WEBKIT_USING_SKIA
14292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    gc.platformContext()->setPrinting(true);
14302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
14312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
14322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return m_printContext->spoolPage(gc, page);
1433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1435643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::printEnd()
1436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(m_printContext.get());
1438643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_printContext.get())
1439643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_printContext->end();
1440643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_printContext.clear();
1441643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1442643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
144306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenbool WebFrameImpl::isPageBoxVisible(int pageIndex)
144406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
144506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return frame()->document()->isPageBoxVisible(pageIndex);
144606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
144706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1448ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid WebFrameImpl::pageSizeAndMarginsInPixels(int pageIndex,
1449ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                              WebSize& pageSize,
1450ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                              int& marginTop,
1451ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                              int& marginRight,
1452ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                              int& marginBottom,
1453ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                              int& marginLeft)
145406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
1455ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    IntSize size(pageSize.width, pageSize.height);
1456ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    frame()->document()->pageSizeAndMarginsInPixels(pageIndex,
1457ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                                    size,
1458ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                                    marginTop,
1459ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                                    marginRight,
1460ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                                    marginBottom,
1461ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                                                    marginLeft);
1462ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    pageSize = size;
146306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
146406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1465643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::find(int identifier,
1466643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                        const WebString& searchText,
1467643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                        const WebFindOptions& options,
1468643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                        bool wrapWithinFrame,
1469643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                        WebRect* selectionRect)
1470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFrameImpl* mainFrameImpl = viewImpl()->mainFrameImpl();
1472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1473643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!options.findNext)
1474643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->page()->unmarkAllTextMatches();
1475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
14765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        setMarkerActive(m_activeMatch.get(), false); // Active match is changing.
1477643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1478643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Starts the search from the current selection.
1479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool startInSelection = true;
1480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If the user has selected something since the last Find operation we want
1482643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // to start from there. Otherwise, we start searching from where the last Find
1483643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // operation left off (either a Find or a FindNext operation).
1484643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    VisibleSelection selection(frame()->selection()->selection());
1485643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool activeSelection = !selection.isNone();
1486643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!activeSelection && m_activeMatch) {
1487643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        selection = VisibleSelection(m_activeMatch.get());
1488643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->selection()->setSelection(selection);
1489643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1490643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1491643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(frame() && frame()->view());
14925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool found = frame()->editor()->findString(
1493643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        searchText, options.forward, options.matchCase, wrapWithinFrame,
1494643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        startInSelection);
1495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (found) {
1496643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Store which frame was active. This will come in handy later when we
1497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // change the active match ordinal below.
1498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        WebFrameImpl* oldActiveFrame = mainFrameImpl->m_activeMatchFrame;
1499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Set this frame as the active frame (the one with the active highlight).
1500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        mainFrameImpl->m_activeMatchFrame = this;
1501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1502643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // We found something, so we can now query the selection for its position.
1503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        VisibleSelection newSelection(frame()->selection()->selection());
1504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        IntRect currSelectionRect;
1505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // If we thought we found something, but it couldn't be selected (perhaps
1507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // because it was marked -webkit-user-select: none), we can't set it to
1508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // be active but we still continue searching. This matches Safari's
1509643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // behavior, including some oddities when selectable and un-selectable text
1510643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // are mixed on a page: see https://bugs.webkit.org/show_bug.cgi?id=19127.
1511643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (newSelection.isNone() || (newSelection.start() == newSelection.end()))
1512643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_activeMatch = 0;
1513643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        else {
1514643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_activeMatch = newSelection.toNormalizedRange();
1515643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            currSelectionRect = m_activeMatch->boundingBox();
15165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            setMarkerActive(m_activeMatch.get(), true); // Active.
1517643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // WebKit draws the highlighting for all matches.
1518643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            executeCommand(WebString::fromUTF8("Unselect"));
1519643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
1520643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Make sure no node is focused. See http://crbug.com/38700.
1522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frame()->document()->setFocusedNode(0);
1523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1524643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!options.findNext || activeSelection) {
1525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // This is either a Find operation or a Find-next from a new start point
1526643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // due to a selection, so we set the flag to ask the scoping effort
1527643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // to find the active rect for us so we can update the ordinal (n of m).
1528643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_locatingActiveRect = true;
1529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        } else {
1530643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (oldActiveFrame != this) {
1531643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // If the active frame has changed it means that we have a multi-frame
1532643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // page and we just switch to searching in a new frame. Then we just
1533643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // want to reset the index.
1534643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                if (options.forward)
1535643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    m_activeMatchIndex = 0;
1536643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                else
1537643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    m_activeMatchIndex = m_lastMatchCount - 1;
1538643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            } else {
1539643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // We are still the active frame, so increment (or decrement) the
1540643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // |m_activeMatchIndex|, wrapping if needed (on single frame pages).
1541643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                options.forward ? ++m_activeMatchIndex : --m_activeMatchIndex;
1542643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                if (m_activeMatchIndex + 1 > m_lastMatchCount)
1543643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    m_activeMatchIndex = 0;
1544643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                if (m_activeMatchIndex == -1)
1545643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    m_activeMatchIndex = m_lastMatchCount - 1;
1546643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
1547643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (selectionRect) {
15482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                *selectionRect = frameView()->contentsToWindow(currSelectionRect);
15492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                reportFindInPageSelection(*selectionRect, m_activeMatchIndex + 1, identifier);
1550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
1551643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
1552643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else {
1553643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Nothing was found in this frame.
1554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_activeMatch = 0;
1555643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1556643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Erase all previous tickmarks and highlighting.
1557643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        invalidateArea(InvalidateAll);
1558643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1559643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1560643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return found;
1561643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1563643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::stopFinding(bool clearSelection)
1564643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1565643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!clearSelection)
1566643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        setFindEndstateFocusAndSelection();
1567643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cancelPendingScopingEffort();
1568643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1569643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Remove all markers for matches found and turn off the highlighting.
1570e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    frame()->document()->markers()->removeMarkers(DocumentMarker::TextMatch);
15715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    frame()->editor()->setMarkedTextMatchesAreHighlighted(false);
1572643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1573643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Let the frame know that we don't want tickmarks or highlighting anymore.
1574643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    invalidateArea(InvalidateAll);
1575643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1576643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1577643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::scopeStringMatches(int identifier,
1578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                      const WebString& searchText,
1579643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                      const WebFindOptions& options,
1580643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                      bool reset)
1581643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1582643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!shouldScopeMatches(searchText))
1583643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1584643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1585643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFrameImpl* mainFrameImpl = viewImpl()->mainFrameImpl();
1586643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1587643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (reset) {
1588643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // This is a brand new search, so we need to reset everything.
1589643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Scoping is just about to begin.
1590643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_scopingComplete = false;
1591643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Clear highlighting for this frame.
15925abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        if (frame()->editor()->markedTextMatchesAreHighlighted())
1593643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            frame()->page()->unmarkAllTextMatches();
1594643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Clear the counters from last operation.
1595643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_lastMatchCount = 0;
1596643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_nextInvalidateAfter = 0;
1597643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1598643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_resumeScopingFromRange = 0;
1599643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1600643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        mainFrameImpl->m_framesScopingCount++;
1601643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1602643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Now, defer scoping until later to allow find operation to finish quickly.
1603643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        scopeStringMatchesSoon(
1604643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            identifier,
1605643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            searchText,
1606643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            options,
16075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            false); // false=we just reset, so don't do it again.
1608643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1609643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1610643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1611643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<Range> searchRange(rangeOfContents(frame()->document()));
1612643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
16132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    Node* originalEndContainer = searchRange->endContainer();
16142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int originalEndOffset = searchRange->endOffset();
16152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1616643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ExceptionCode ec = 0, ec2 = 0;
1617643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_resumeScopingFromRange.get()) {
1618643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // This is a continuation of a scoping operation that timed out and didn't
1619643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // complete last time around, so we should start from where we left off.
1620643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        searchRange->setStart(m_resumeScopingFromRange->startContainer(),
1621643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                              m_resumeScopingFromRange->startOffset(ec2) + 1,
1622643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                              ec);
1623643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (ec || ec2) {
16245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (ec2) // A non-zero |ec| happens when navigating during search.
1625643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                ASSERT_NOT_REACHED();
1626643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return;
1627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
1628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // This timeout controls how long we scope before releasing control.  This
1631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // value does not prevent us from running for longer than this, but it is
1632643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // periodically checked to see if we have exceeded our allocated time.
16335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    const double maxScopingDuration = 0.1; // seconds
1634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1635643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    int matchCount = 0;
1636643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool timedOut = false;
1637643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    double startTime = currentTime();
1638643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    do {
1639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Find next occurrence of the search string.
1640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // FIXME: (http://b/1088245) This WebKit operation may run for longer
1641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // than the timeout value, and is not interruptible as it is currently
1642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // written. We may need to rewrite it with interruptibility in mind, or
1643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // find an alternative.
1644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        RefPtr<Range> resultRange(findPlainText(searchRange.get(),
1645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                                searchText,
16462bde8e466a4451c7319e3a072d118917957d6554Steve Block                                                options.matchCase ? 0 : CaseInsensitive));
1647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (resultRange->collapsed(ec)) {
1648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (!resultRange->startContainer()->isInShadowTree())
1649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                break;
1650643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1651643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            searchRange->setStartAfter(
1652643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                resultRange->startContainer()->shadowAncestorNode(), ec);
165365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            searchRange->setEnd(originalEndContainer, originalEndOffset, ec);
1654643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            continue;
1655643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
1656643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1657643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Only treat the result as a match if it is visible
1658643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (frame()->editor()->insideVisibleArea(resultRange.get())) {
1659643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            ++matchCount;
1660643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1661643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // Catch a special case where Find found something but doesn't know what
1662643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // the bounding box for it is. In this case we set the first match we find
1663643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // as the active rect.
1664643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            IntRect resultBounds = resultRange->boundingBox();
1665643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            IntRect activeSelectionRect;
1666643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (m_locatingActiveRect) {
1667643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                activeSelectionRect = m_activeMatch.get() ?
1668643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    m_activeMatch->boundingBox() : resultBounds;
1669643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
1670643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1671643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // If the Find function found a match it will have stored where the
1672643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // match was found in m_activeSelectionRect on the current frame. If we
1673643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // find this rect during scoping it means we have found the active
1674643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // tickmark.
1675643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            bool foundActiveMatch = false;
1676643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (m_locatingActiveRect && (activeSelectionRect == resultBounds)) {
1677643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // We have found the active tickmark frame.
1678643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                mainFrameImpl->m_activeMatchFrame = this;
1679643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                foundActiveMatch = true;
1680643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // We also know which tickmark is active now.
1681643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                m_activeMatchIndex = matchCount - 1;
1682643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // To stop looking for the active tickmark, we set this flag.
1683643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                m_locatingActiveRect = false;
1684643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1685643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                // Notify browser of new location for the selected rectangle.
1686643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                reportFindInPageSelection(
16872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    frameView()->contentsToWindow(resultBounds),
1688643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    m_activeMatchIndex + 1,
1689643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                    identifier);
1690643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
1691643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1692643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            addMarker(resultRange.get(), foundActiveMatch);
1693643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
1694643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
169565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Set the new start for the search range to be the end of the previous
169665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // result range. There is no need to use a VisiblePosition here,
169765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // since findPlainText will use a TextIterator to go over the visible
169865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // text nodes.
169965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        searchRange->setStart(resultRange->endContainer(ec), resultRange->endOffset(ec), ec);
170065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
170165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Node* shadowTreeRoot = searchRange->shadowTreeRootNode();
170265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (searchRange->collapsed(ec) && shadowTreeRoot)
170365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            searchRange->setEnd(shadowTreeRoot, shadowTreeRoot->childNodeCount(), ec);
170465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1705643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_resumeScopingFromRange = resultRange;
1706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        timedOut = (currentTime() - startTime) >= maxScopingDuration;
1707643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } while (!timedOut);
1708643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1709643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Remember what we search for last time, so we can skip searching if more
1710643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // letters are added to the search string (and last outcome was 0).
1711643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_lastSearchString = searchText;
1712643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1713643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (matchCount > 0) {
17145abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        frame()->editor()->setMarkedTextMatchesAreHighlighted(true);
1715643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1716643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_lastMatchCount += matchCount;
1717643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1718643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Let the mainframe know how much we found during this pass.
1719643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        mainFrameImpl->increaseMatchCount(matchCount, identifier);
1720643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1721643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1722643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (timedOut) {
1723643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // If we found anything during this pass, we should redraw. However, we
1724643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // don't want to spam too much if the page is extremely long, so if we
1725643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // reach a certain point we start throttling the redraw requests.
1726643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (matchCount > 0)
1727643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            invalidateIfNecessary();
1728643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1729643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Scoping effort ran out of time, lets ask for another time-slice.
1730643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        scopeStringMatchesSoon(
1731643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            identifier,
1732643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            searchText,
1733643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            options,
17345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            false); // don't reset.
17355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        return; // Done for now, resume work later.
1736643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1737643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1738643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // This frame has no further scoping left, so it is done. Other frames might,
1739643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // of course, continue to scope matches.
1740643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_scopingComplete = true;
1741643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    mainFrameImpl->m_framesScopingCount--;
1742643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1743643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If this is the last frame to finish scoping we need to trigger the final
1744643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // update to be sent.
1745643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!mainFrameImpl->m_framesScopingCount)
1746643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        mainFrameImpl->increaseMatchCount(0, identifier);
1747643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1748643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // This frame is done, so show any scrollbar tickmarks we haven't drawn yet.
1749643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    invalidateArea(InvalidateScrollbar);
1750643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1751643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1752643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::cancelPendingScopingEffort()
1753643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1754643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    deleteAllValues(m_deferredScopingWork);
1755643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_deferredScopingWork.clear();
1756643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1757643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_activeMatchIndex = -1;
1758643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1759643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1760643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::increaseMatchCount(int count, int identifier)
1761643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1762643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // This function should only be called on the mainframe.
1763643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(!parent());
1764643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1765643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_totalMatchCount += count;
1766643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1767643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Update the UI with the latest findings.
1768643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (client())
1769643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        client()->reportFindInPageMatchCount(identifier, m_totalMatchCount, !m_framesScopingCount);
1770643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1771643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1772643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::reportFindInPageSelection(const WebRect& selectionRect,
1773643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                             int activeMatchOrdinal,
1774643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                             int identifier)
1775643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1776643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Update the UI with the latest selection rect.
1777643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (client())
1778643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        client()->reportFindInPageSelection(identifier, ordinalOfFirstMatchForFrame(this) + activeMatchOrdinal, selectionRect);
1779643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1780643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1781643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::resetMatchCount()
1782643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1783643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_totalMatchCount = 0;
1784643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_framesScopingCount = 0;
1785643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1786643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1787643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebFrameImpl::contentAsText(size_t maxChars) const
1788643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1789643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
1790643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return WebString();
1791643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1792643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Vector<UChar> text;
1793643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    frameContentAsPlainText(maxChars, m_frame, &text);
1794643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return String::adopt(text);
1795643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1796643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1797643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebString WebFrameImpl::contentAsMarkup() const
1798643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1799643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return createFullMarkup(m_frame->document());
1800643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1801643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
18022bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebString WebFrameImpl::renderTreeAsText(bool showDebugInfo) const
1803d0825bca7fe65beaee391d30da42e937db621564Steve Block{
18042bde8e466a4451c7319e3a072d118917957d6554Steve Block    RenderAsTextBehavior behavior = RenderAsTextBehaviorNormal;
18052bde8e466a4451c7319e3a072d118917957d6554Steve Block
18062bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (showDebugInfo) {
18072bde8e466a4451c7319e3a072d118917957d6554Steve Block        behavior |= RenderAsTextShowCompositedLayers
18082bde8e466a4451c7319e3a072d118917957d6554Steve Block            | RenderAsTextShowAddresses
18092bde8e466a4451c7319e3a072d118917957d6554Steve Block            | RenderAsTextShowIDAndClass
18102bde8e466a4451c7319e3a072d118917957d6554Steve Block            | RenderAsTextShowLayerNesting;
18112bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
18122bde8e466a4451c7319e3a072d118917957d6554Steve Block
18132bde8e466a4451c7319e3a072d118917957d6554Steve Block    return externalRepresentation(m_frame, behavior);
1814d0825bca7fe65beaee391d30da42e937db621564Steve Block}
1815d0825bca7fe65beaee391d30da42e937db621564Steve Block
1816d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebString WebFrameImpl::counterValueForElementById(const WebString& id) const
1817d0825bca7fe65beaee391d30da42e937db621564Steve Block{
1818d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!m_frame)
1819d0825bca7fe65beaee391d30da42e937db621564Steve Block        return WebString();
1820d0825bca7fe65beaee391d30da42e937db621564Steve Block
1821d0825bca7fe65beaee391d30da42e937db621564Steve Block    Element* element = m_frame->document()->getElementById(id);
1822d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!element)
1823d0825bca7fe65beaee391d30da42e937db621564Steve Block        return WebString();
1824643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1825d0825bca7fe65beaee391d30da42e937db621564Steve Block    return counterValueForElement(element);
1826d0825bca7fe65beaee391d30da42e937db621564Steve Block}
1827d0825bca7fe65beaee391d30da42e937db621564Steve Block
18285ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenWebString WebFrameImpl::markerTextForListItem(const WebElement& webElement) const
18295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
18305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return WebCore::markerTextForListItem(const_cast<Element*>(webElement.constUnwrap<Element>()));
18315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
18325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
18335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockint WebFrameImpl::pageNumberForElementById(const WebString& id,
18345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block                                           float pageWidthInPixels,
18355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block                                           float pageHeightInPixels) const
18365e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
18375e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (!m_frame)
18385e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return -1;
18395e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
18405e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    Element* element = m_frame->document()->getElementById(id);
18415e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (!element)
18425e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return -1;
18435e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
18445e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    FloatSize pageSize(pageWidthInPixels, pageHeightInPixels);
18455e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    return PrintContext::pageNumberForElement(element, pageSize);
18465e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
18475e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
1848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockWebRect WebFrameImpl::selectionBoundsRect() const
1849dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1850dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (hasSelection())
185168513a70bcd92384395513322f1b801e7bf9c729Steve Block        return IntRect(frame()->selection()->bounds(false));
1852dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1853dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return WebRect();
1854dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
1855dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
185668513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool WebFrameImpl::selectionStartHasSpellingMarkerFor(int from, int length) const
185768513a70bcd92384395513322f1b801e7bf9c729Steve Block{
185868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (!m_frame)
185968513a70bcd92384395513322f1b801e7bf9c729Steve Block        return false;
18602bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_frame->editor()->selectionStartHasMarkerFor(DocumentMarker::Spelling, from, length);
186168513a70bcd92384395513322f1b801e7bf9c729Steve Block}
186268513a70bcd92384395513322f1b801e7bf9c729Steve Block
1863bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool WebFrameImpl::pauseSVGAnimation(const WebString& animationId, double time, const WebString& elementId)
1864bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
1865bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if !ENABLE(SVG)
1866bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return false;
1867bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#else
1868bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!m_frame)
1869bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
1870bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1871bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Document* document = m_frame->document();
1872bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!document || !document->svgExtensions())
1873bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
1874bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1875bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    Node* coreNode = document->getElementById(animationId);
1876bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    if (!coreNode || !SVGSMILElement::isSMILElement(coreNode))
1877bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        return false;
1878bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
1879bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return document->accessSVGExtensions()->sampleAnimationAtTime(elementId, static_cast<SVGSMILElement*>(coreNode), time);
1880bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif
1881bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
1882bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
18832bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebString WebFrameImpl::layerTreeAsText(bool showDebugInfo) const
1884a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
1885a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_frame)
1886a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return WebString();
18872bde8e466a4451c7319e3a072d118917957d6554Steve Block    return WebString(m_frame->layerTreeAsText(showDebugInfo));
1888a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
1889a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1890d0825bca7fe65beaee391d30da42e937db621564Steve Block// WebFrameImpl public ---------------------------------------------------------
1891643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1892643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<WebFrameImpl> WebFrameImpl::create(WebFrameClient* client)
1893643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1894643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return adoptRef(new WebFrameImpl(client));
1895643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1896643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1897643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrameImpl::WebFrameImpl(WebFrameClient* client)
1898643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    : m_frameLoaderClient(this)
1899643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_client(client)
1900643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_activeMatchFrame(0)
1901643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_activeMatchIndex(-1)
1902643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_locatingActiveRect(false)
1903643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_resumeScopingFromRange(0)
1904643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_lastMatchCount(-1)
1905643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_totalMatchCount(-1)
1906643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_framesScopingCount(-1)
1907643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_scopingComplete(false)
1908643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    , m_nextInvalidateAfter(0)
1909d0825bca7fe65beaee391d30da42e937db621564Steve Block    , m_animationController(this)
1910a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_identifier(generateFrameIdentifier())
191154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block    , m_inSameDocumentHistoryLoad(false)
1912643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1913ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::incrementStatsCounter(webFrameActiveCount);
1914d0825bca7fe65beaee391d30da42e937db621564Steve Block    frameCount++;
1915643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1916643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1917643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebFrameImpl::~WebFrameImpl()
1918643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1919ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::decrementStatsCounter(webFrameActiveCount);
1920d0825bca7fe65beaee391d30da42e937db621564Steve Block    frameCount--;
1921643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1922643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    cancelPendingScopingEffort();
1923643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    clearPasswordListeners();
1924643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1925643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1926643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::initializeAsMainFrame(WebViewImpl* webViewImpl)
1927643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1928643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<Frame> frame = Frame::create(webViewImpl->page(), 0, &m_frameLoaderClient);
1929643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame = frame.get();
1930643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1931643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Add reference on behalf of FrameLoader.  See comments in
1932643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // WebFrameLoaderClient::frameLoaderDestroyed for more info.
1933643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ref();
1934643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1935643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // We must call init() after m_frame is assigned because it is referenced
1936643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // during init().
1937643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->init();
1938643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1939643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1940643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockPassRefPtr<Frame> WebFrameImpl::createChildFrame(
1941643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    const FrameLoadRequest& request, HTMLFrameOwnerElement* ownerElement)
1942643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1943643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<WebFrameImpl> webframe(adoptRef(new WebFrameImpl(m_client)));
1944643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1945643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Add an extra ref on behalf of the Frame/FrameLoader, which references the
1946643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // WebFrame via the FrameLoaderClient interface. See the comment at the top
1947643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // of this file for more info.
1948643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webframe->ref();
1949643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1950643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<Frame> childFrame = Frame::create(
1951643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->page(), ownerElement, &webframe->m_frameLoaderClient);
1952643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    webframe->m_frame = childFrame.get();
1953643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1954643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    childFrame->tree()->setName(request.frameName());
1955643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1956643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->tree()->appendChild(childFrame);
1957643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1958643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Frame::init() can trigger onload event in the parent frame,
1959643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // which may detach this frame and trigger a null-pointer access
1960643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // in FrameTree::removeChild. Move init() after appendChild call
1961643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // so that webframe->mFrame is in the tree before triggering
1962643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // onload event handler.
1963643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Because the event handler may set webframe->mFrame to null,
1964643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // it is necessary to check the value after calling init() and
1965643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // return without loading URL.
1966643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // (b:791612)
19675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    childFrame->init(); // create an empty document
1968643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!childFrame->tree()->parent())
1969643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
1970643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1971643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->loader()->loadURLIntoChildFrame(
1972643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        request.resourceRequest().url(),
1973643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        request.resourceRequest().httpReferrer(),
1974643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        childFrame.get());
1975643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1976643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // A synchronous navigation (about:blank) would have already processed
1977643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // onload, so it is possible for the frame to have already been destroyed by
1978643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // script in the page.
1979643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!childFrame->tree()->parent())
1980643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
1981643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1982643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return childFrame.release();
1983643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1984643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1985643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::layout()
1986643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1987643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // layout this frame
1988643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FrameView* view = m_frame->view();
1989643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (view)
19905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        view->updateLayoutAndStyleIfNeededRecursive();
1991643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1992643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1993dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebFrameImpl::paintWithContext(GraphicsContext& gc, const WebRect& rect)
1994dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
1995dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    IntRect dirtyRect(rect);
1996dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gc.save();
1997dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_frame->document() && frameView()) {
1998dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        gc.clip(dirtyRect);
1999dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        frameView()->paint(&gc, dirtyRect);
2000dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_frame->page()->inspectorController()->drawNodeHighlight(gc);
2001dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else
2002a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        gc.fillRect(dirtyRect, Color::white, ColorSpaceDeviceRGB);
2003dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    gc.restore();
2004dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
2005dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2006643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::paint(WebCanvas* canvas, const WebRect& rect)
2007643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2008643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (rect.isEmpty())
2009643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
20102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    paintWithContext(GraphicsContextBuilder(canvas).context(), rect);
2011643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2012643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2013643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::createFrameView()
2014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(m_frame); // If m_frame doesn't exist, we probably didn't init properly.
2016643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2017643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Page* page = m_frame->page();
2018643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(page);
2019643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(page->mainFrame());
2020643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2021643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool isMainFrame = m_frame == page->mainFrame();
2022643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (isMainFrame && m_frame->view())
2023643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->view()->setParentVisible(false);
2024643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2025643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->setView(0);
2026643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2027643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebViewImpl* webView = viewImpl();
2028643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2029643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    RefPtr<FrameView> view;
2030643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (isMainFrame)
2031643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        view = FrameView::create(m_frame, webView->size());
2032643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
2033643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        view = FrameView::create(m_frame);
2034643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2035643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame->setView(view);
2036643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2037643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (webView->isTransparent())
2038643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        view->setTransparent(true);
2039643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2040643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // FIXME: The Mac code has a comment about this possibly being unnecessary.
2041643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // See installInFrame in WebCoreFrameBridge.mm
2042643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_frame->ownerRenderer())
2043643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_frame->ownerRenderer()->setWidget(view.get());
2044643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2045643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (HTMLFrameOwnerElement* owner = m_frame->ownerElement())
2046643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        view->setCanHaveScrollbars(owner->scrollingMode() != ScrollbarAlwaysOff);
2047643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2048643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (isMainFrame)
2049643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        view->setParentVisible(true);
2050643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2051643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
205281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebFrameImpl* WebFrameImpl::fromFrame(Frame* frame)
2053643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2054643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!frame)
2055643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
2056643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2057643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return static_cast<FrameLoaderClientImpl*>(frame->loader()->client())->webFrame();
2058643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2059643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2060d0825bca7fe65beaee391d30da42e937db621564Steve BlockWebFrameImpl* WebFrameImpl::fromFrameOwnerElement(Element* element)
2061d0825bca7fe65beaee391d30da42e937db621564Steve Block{
2062d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!element
2063d0825bca7fe65beaee391d30da42e937db621564Steve Block        || !element->isFrameOwnerElement()
2064d0825bca7fe65beaee391d30da42e937db621564Steve Block        || (!element->hasTagName(HTMLNames::iframeTag)
2065d0825bca7fe65beaee391d30da42e937db621564Steve Block            && !element->hasTagName(HTMLNames::frameTag)))
2066d0825bca7fe65beaee391d30da42e937db621564Steve Block        return 0;
2067d0825bca7fe65beaee391d30da42e937db621564Steve Block
2068d0825bca7fe65beaee391d30da42e937db621564Steve Block    HTMLFrameOwnerElement* frameElement =
2069d0825bca7fe65beaee391d30da42e937db621564Steve Block        static_cast<HTMLFrameOwnerElement*>(element);
2070d0825bca7fe65beaee391d30da42e937db621564Steve Block    return fromFrame(frameElement->contentFrame());
2071d0825bca7fe65beaee391d30da42e937db621564Steve Block}
2072dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2073643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebViewImpl* WebFrameImpl::viewImpl() const
2074643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2075643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame)
2076643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return 0;
2077643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2078643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return WebViewImpl::fromPage(m_frame->page());
2079643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2080643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2081643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebDataSourceImpl* WebFrameImpl::dataSourceImpl() const
2082643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2083643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return static_cast<WebDataSourceImpl*>(dataSource());
2084643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2085643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2086643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebDataSourceImpl* WebFrameImpl::provisionalDataSourceImpl() const
2087643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2088643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return static_cast<WebDataSourceImpl*>(provisionalDataSource());
2089643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2090643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2091643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::setFindEndstateFocusAndSelection()
2092643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2093643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFrameImpl* mainFrameImpl = viewImpl()->mainFrameImpl();
2094643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2095643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (this == mainFrameImpl->activeMatchFrame() && m_activeMatch.get()) {
2096643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // If the user has set the selection since the match was found, we
2097643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // don't focus anything.
2098643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        VisibleSelection selection(frame()->selection()->selection());
2099643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!selection.isNone())
2100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return;
2101643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Try to find the first focusable node up the chain, which will, for
2103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // example, focus links if we have found text within the link.
2104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        Node* node = m_activeMatch->firstNode();
2105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        while (node && !node->isFocusable() && node != frame()->document())
21066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            node = node->parentNode();
2107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2108643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (node && node != frame()->document()) {
2109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // Found a focusable parent node. Set focus to it.
2110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            frame()->document()->setFocusedNode(node);
2111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return;
2112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
2113643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Iterate over all the nodes in the range until we find a focusable node.
2115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // This, for example, sets focus to the first link if you search for
2116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // text and text that is within one or more links.
2117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        node = m_activeMatch->firstNode();
2118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        while (node && node != m_activeMatch->pastLastNode()) {
2119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (node->isFocusable()) {
2120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                frame()->document()->setFocusedNode(node);
2121643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return;
2122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            }
2123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            node = node->traverseNextNode();
2124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
2125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // No node related to the active match was focusable, so set the
2127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // active match as the selection (so that when you end the Find session,
2128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // you'll have the last thing you found highlighted) and make sure that
2129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // we have nothing focused (otherwise you might have text selected but
2130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // a link focused, which is weird).
2131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->selection()->setSelection(m_activeMatch.get());
2132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        frame()->document()->setFocusedNode(0);
2133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2136643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::didFail(const ResourceError& error, bool wasProvisional)
2137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!client())
2139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
2140643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebURLError webError = error;
2141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (wasProvisional)
2142643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        client()->didFailProvisionalLoad(this, webError);
2143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
2144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        client()->didFailLoad(this, webError);
2145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2147dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid WebFrameImpl::setCanHaveScrollbars(bool canHaveScrollbars)
2148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2149dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_frame->view()->setCanHaveScrollbars(canHaveScrollbars);
2150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
21526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool WebFrameImpl::registerPasswordListener(
2153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebInputElement inputElement,
2154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebPasswordAutocompleteListener* listener)
2155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2156e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    RefPtr<HTMLInputElement> element(inputElement.unwrap<HTMLInputElement>());
21576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!m_passwordListeners.add(element, listener).second) {
21586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        delete listener;
21596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return false;
21606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
21616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return true;
2162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2164ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid WebFrameImpl::notifiyPasswordListenerOfAutocomplete(
2165ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    const WebInputElement& inputElement)
2166ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
2167e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    const HTMLInputElement* element = inputElement.constUnwrap<HTMLInputElement>();
2168e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    WebPasswordAutocompleteListener* listener = getPasswordListener(element);
2169ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // Password listeners need to autocomplete other fields that depend on the
2170ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // input element with autofill suggestions.
2171ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (listener)
2172ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        listener->performInlineAutocomplete(element->value(), false, false);
2173ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
2174ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
2175643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebPasswordAutocompleteListener* WebFrameImpl::getPasswordListener(
2176e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    const HTMLInputElement* inputElement)
2177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2178e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    return m_passwordListeners.get(RefPtr<HTMLInputElement>(const_cast<HTMLInputElement*>(inputElement)));
2179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// WebFrameImpl private --------------------------------------------------------
2182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2183643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::closing()
2184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_frame = 0;
2186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2188643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::invalidateArea(AreaToInvalidate area)
2189643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(frame() && frame()->view());
2191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    FrameView* view = frame()->view();
2192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if ((area & InvalidateAll) == InvalidateAll)
2194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        view->invalidateRect(view->frameRect());
2195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else {
2196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if ((area & InvalidateContentArea) == InvalidateContentArea) {
2197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            IntRect contentArea(
2198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                view->x(), view->y(), view->visibleWidth(), view->visibleHeight());
2199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            IntRect frameRect = view->frameRect();
22002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            contentArea.move(-frameRect.x(), -frameRect.y());
2201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            view->invalidateRect(contentArea);
2202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
2203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if ((area & InvalidateScrollbar) == InvalidateScrollbar) {
2205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // Invalidate the vertical scroll bar region for the view.
2206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            IntRect scrollBarVert(
2207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                view->x() + view->visibleWidth(), view->y(),
2208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                ScrollbarTheme::nativeTheme()->scrollbarThickness(),
2209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                view->visibleHeight());
2210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            IntRect frameRect = view->frameRect();
22112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            scrollBarVert.move(-frameRect.x(), -frameRect.y());
2212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            view->invalidateRect(scrollBarVert);
2213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
2214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2217643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::addMarker(Range* range, bool activeMatch)
2218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Use a TextIterator to visit the potentially multiple nodes the range
2220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // covers.
2221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    TextIterator markedText(range);
2222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (; !markedText.atEnd(); markedText.advance()) {
2223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        RefPtr<Range> textPiece = markedText.range();
2224643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int exception = 0;
2225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        DocumentMarker marker = {
2227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            DocumentMarker::TextMatch,
2228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            textPiece->startOffset(exception),
2229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            textPiece->endOffset(exception),
2230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            "",
2231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            activeMatch
2232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        };
2233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (marker.endOffset > marker.startOffset) {
2235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // Find the node to add a marker to and add it.
2236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            Node* node = textPiece->startContainer(exception);
2237e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            frame()->document()->markers()->addMarker(node, marker);
2238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // Rendered rects for markers in WebKit are not populated until each time
2240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // the markers are painted. However, we need it to happen sooner, because
2241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // the whole purpose of tickmarks on the scrollbar is to show where
2242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // matches off-screen are (that haven't been painted yet).
2243e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            Vector<DocumentMarker> markers = frame()->document()->markers()->markersForNode(node);
2244e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block            frame()->document()->markers()->setRenderedRectForMarker(
2245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                textPiece->startContainer(exception),
2246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                markers[markers.size() - 1],
2247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                range->boundingBox());
2248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
2249643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2250643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2251643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2252643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::setMarkerActive(Range* range, bool active)
2253643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
22546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    WebCore::ExceptionCode ec;
22556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!range || range->collapsed(ec))
2256643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
2257643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2258e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    frame()->document()->markers()->setMarkersActive(range, active);
2259643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2260643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2261643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint WebFrameImpl::ordinalOfFirstMatchForFrame(WebFrameImpl* frame) const
2262643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2263643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    int ordinal = 0;
2264643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebFrameImpl* mainFrameImpl = viewImpl()->mainFrameImpl();
2265643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Iterate from the main frame up to (but not including) |frame| and
2266643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // add up the number of matches found so far.
2267643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    for (WebFrameImpl* it = mainFrameImpl;
2268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block         it != frame;
2269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block         it = static_cast<WebFrameImpl*>(it->traverseNext(true))) {
2270643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (it->m_lastMatchCount > 0)
2271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            ordinal += it->m_lastMatchCount;
2272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return ordinal;
2274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2275643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2276643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebFrameImpl::shouldScopeMatches(const String& searchText)
2277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2278967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // Don't scope if we can't find a frame or a view or if the frame is not visible.
2279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // The user may have closed the tab/application, so abort.
2280967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!frame() || !frame()->view() || !hasVisibleContent())
2281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
2282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ASSERT(frame()->document() && frame()->view());
2284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // If the frame completed the scoping operation and found 0 matches the last
2286643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // time it was searched, then we don't have to search it again if the user is
2287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // just adding to the search string or sending the same search string again.
2288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_scopingComplete && !m_lastSearchString.isEmpty() && !m_lastMatchCount) {
2289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Check to see if the search string prefixes match.
2290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        String previousSearchPrefix =
2291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            searchText.substring(0, m_lastSearchString.length());
2292643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (previousSearchPrefix == m_lastSearchString)
22945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            return false; // Don't search this frame, it will be fruitless.
2295643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2296643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return true;
2298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2300643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::scopeStringMatchesSoon(int identifier, const WebString& searchText,
2301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                          const WebFindOptions& options, bool reset)
2302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_deferredScopingWork.append(new DeferredScopeStringMatches(
2304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this, identifier, searchText, options, reset));
2305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2307643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::callScopeStringMatches(DeferredScopeStringMatches* caller,
2308643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                          int identifier, const WebString& searchText,
2309643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                                          const WebFindOptions& options, bool reset)
2310643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2311643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_deferredScopingWork.remove(m_deferredScopingWork.find(caller));
2312643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2313643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    scopeStringMatches(identifier, searchText, options, reset);
2314643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2315643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // This needs to happen last since searchText is passed by reference.
2316643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    delete caller;
2317643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2318643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2319643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::invalidateIfNecessary()
2320643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2321643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (m_lastMatchCount > m_nextInvalidateAfter) {
2322643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // FIXME: (http://b/1088165) Optimize the drawing of the tickmarks and
2323643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // remove this. This calculation sets a milestone for when next to
2324643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // invalidate the scrollbar and the content area. We do this so that we
2325643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // don't spend too much time drawing the scrollbar over and over again.
2326643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Basically, up until the first 500 matches there is no throttle.
2327643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // After the first 500 matches, we set set the milestone further and
2328643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // further out (750, 1125, 1688, 2K, 3K).
2329643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int startSlowingDownAfter = 500;
2330643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int slowdown = 750;
2331643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int i = (m_lastMatchCount / startSlowingDownAfter);
2332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        m_nextInvalidateAfter += i * slowdown;
2333643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2334643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        invalidateArea(InvalidateScrollbar);
2335643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
2336643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2337643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2338643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::clearPasswordListeners()
2339643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2340643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    deleteAllValues(m_passwordListeners);
2341643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    m_passwordListeners.clear();
2342643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2344643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebFrameImpl::loadJavaScriptURL(const KURL& url)
2345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // This is copied from ScriptController::executeIfJavaScriptURL.
2347dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Unfortunately, we cannot just use that method since it is private, and
2348dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // it also doesn't quite behave as we require it to for bookmarklets.  The
2349dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // key difference is that we need to suppress loading the string result
2350dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // from evaluating the JS URL if executing the JS URL resulted in a
2351dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // location change.  We also allow a JS URL to be loaded even if scripts on
2352dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // the page are otherwise disabled.
2353643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2354643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!m_frame->document() || !m_frame->page())
2355643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
2356643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2357643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String script = decodeURLEscapeSequences(url.string().substring(strlen("javascript:")));
2358643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    ScriptValue result = m_frame->script()->executeScript(script, true);
2359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    String scriptResult;
2361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!result.getString(scriptResult))
2362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
2363643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2364a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!m_frame->navigationScheduler()->locationChangePending())
23652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_frame->document()->loader()->writer()->replaceDocument(scriptResult);
2366643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
2367643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2368643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit
2369