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