summaryrefslogtreecommitdiffstats
path: root/webkit/glue/webframe_impl.h
diff options
context:
space:
mode:
authorinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-27 00:20:51 +0000
committerinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-27 00:20:51 +0000
commitf5b16fed647e941aa66933178da85db2860d639b (patch)
treef00e9856c04aad3b558a140955e7674add33f051 /webkit/glue/webframe_impl.h
parent920c091ac3ee15079194c82ae8a7a18215f3f23c (diff)
downloadchromium_src-f5b16fed647e941aa66933178da85db2860d639b.zip
chromium_src-f5b16fed647e941aa66933178da85db2860d639b.tar.gz
chromium_src-f5b16fed647e941aa66933178da85db2860d639b.tar.bz2
Add webkit to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue/webframe_impl.h')
-rw-r--r--webkit/glue/webframe_impl.h431
1 files changed, 431 insertions, 0 deletions
diff --git a/webkit/glue/webframe_impl.h b/webkit/glue/webframe_impl.h
new file mode 100644
index 0000000..2b974b7
--- /dev/null
+++ b/webkit/glue/webframe_impl.h
@@ -0,0 +1,431 @@
+/*
+ * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WEBKIT_GLUE_WEBFRAME_IMPL_H__
+#define WEBKIT_GLUE_WEBFRAME_IMPL_H__
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/scoped_ptr.h"
+#include "base/task.h"
+#include "webkit/glue/webdatasource_impl.h"
+#include "webkit/glue/webframe.h"
+#include "webkit/glue/webframeloaderclient_impl.h"
+#include "webkit/glue/webplugin_delegate.h"
+#include "webkit/glue/webview_delegate.h"
+
+#pragma warning(push, 0)
+#include "ResourceHandleClient.h"
+#include "Frame.h"
+#include "PlatformString.h"
+#pragma warning(pop)
+
+class AltErrorPageResourceFetcher;
+class WebErrorImpl;
+class WebHistoryItemImpl;
+class WebRequest;
+class WebView;
+class WebViewImpl;
+class WebTextInput;
+class WebTextInputImpl;
+
+namespace WebCore {
+class Frame;
+class FrameView;
+class HistoryItem;
+class Node;
+class Range;
+class SubstituteData;
+struct WindowFeatures;
+}
+
+namespace gfx {
+class PlatformCanvas;
+class BitmapPlatformDevice;
+}
+
+// Implementation of WebFrame, note that this is a reference counted object.
+class WebFrameImpl : public WebFrame {
+ public:
+ WebFrameImpl();
+ ~WebFrameImpl();
+
+ static int live_object_count() {
+ return live_object_count_;
+ }
+
+ // Called by the WebViewImpl to initialize its main frame:
+ void InitMainFrame(WebViewImpl* webview_impl);
+
+ // WebFrame
+ virtual void LoadRequest(WebRequest* request);
+ virtual void LoadHTMLString(const std::string& html_text,
+ const GURL& base_url);
+ virtual void LoadAlternateHTMLString(const WebRequest* request,
+ const std::string& html_text,
+ const GURL& display_url,
+ bool replace);
+ virtual void LoadAlternateHTMLErrorPage(const WebRequest* request,
+ const WebError& error,
+ const GURL& error_page_url,
+ bool replace,
+ const GURL& fake_url);
+ virtual bool GetPreviousState(GURL* url, std::wstring* title,
+ std::string* history_state) const;
+ virtual bool GetCurrentState(GURL* url, std::wstring* title,
+ std::string* history_state) const;
+ virtual bool HasCurrentState() const;
+ virtual GURL GetURL() const;
+ virtual GURL GetFavIconURL() const;
+ virtual GURL GetOSDDURL() const;
+ virtual WebDataSource* GetDataSource() const;
+ virtual WebDataSource* GetProvisionalDataSource() const;
+ virtual void StopLoading();
+ virtual WebFrame* GetOpener() const;
+ virtual WebFrame* GetParent() const;
+ virtual WebFrame* GetChildFrame(const std::wstring& xpath) const;
+ virtual WebView* GetView() const;
+ virtual gfx::BitmapPlatformDevice CaptureImage(bool scroll_to_zero);
+
+ // This method calls createRuntimeObject (in KJS::Bindings::Instance), which
+ // increments the refcount of the NPObject passed in.
+ virtual void BindToWindowObject(const std::wstring& name, NPObject* object);
+ virtual void CallJSGC();
+
+ virtual void* GetFrameImplementation() { return frame(); }
+
+ virtual void GetContentAsPlainText(int max_chars, std::wstring* text) const;
+ virtual bool Find(const FindInPageRequest& request,
+ bool wrap_within_frame,
+ gfx::Rect* selection_rect);
+ virtual bool FindNext(const FindInPageRequest& request,
+ bool wrap_within_frame);
+ virtual void StopFinding();
+ virtual void ScopeStringMatches(FindInPageRequest request, bool reset);
+ virtual void CancelPendingScopingEffort();
+ virtual void ResetMatchCount();
+ virtual bool Visible();
+ virtual void SelectAll();
+ virtual void Copy();
+ virtual void Cut();
+ virtual void Paste();
+ virtual void Replace(const std::wstring& text);
+ virtual void Delete();
+ virtual void Undo();
+ virtual void Redo();
+ virtual void ClearSelection();
+
+ virtual void SetInViewSourceMode(bool);
+
+ virtual bool GetInViewSourceMode() const;
+
+ virtual void DidReceiveData(WebCore::DocumentLoader* loader,
+ const char* data,
+ int length);
+ virtual void DidFail(const WebCore::ResourceError&, bool was_provisional);
+
+ virtual std::wstring GetName();
+
+ virtual WebTextInput* GetTextInput();
+
+ virtual bool ExecuteCoreCommandByName(const std::string& name, const std::string& value);
+
+ virtual void AddMessageToConsole(const std::wstring& msg,
+ ConsoleMessageLevel level);
+
+ virtual void ClosePage();
+
+ virtual gfx::Size ScrollOffset() const;
+
+ virtual bool SetPrintingMode(bool printing,
+ float page_width_min,
+ float page_width_max,
+ int* width);
+ virtual int ComputePageRects(const gfx::Size& page_size_px);
+ virtual void GetPageRect(int page, gfx::Rect* page_size) const;
+ virtual bool SpoolPage(int page,
+ PlatformContextSkia* context);
+
+ // Reformats this frame for printing or for screen display, depending on
+ // |printing| flag. Acts recursively on inner frames.
+ // Note: It fails if the main frame failed to load. It will succeed even if a
+ // child frame failed to load.
+ void SetPrinting(bool printing, float page_width_min, float page_width_max);
+
+ void CreateChildFrame(const WebCore::FrameLoadRequest&,
+ WebCore::HTMLFrameOwnerElement* owner_element,
+ bool allows_scrolling, int margin_width,
+ int margin_height, WebCore::Frame*& new_frame);
+
+ // WebFrameImpl
+ void Layout();
+ void Paint(gfx::PlatformCanvas* canvas, const gfx::Rect& rect);
+
+ bool IsLoading();
+
+ void CreateFrameView();
+
+ // The plugin delegate is used to get notifications when downloads complete.
+ // This is used by the NPAPI method getURLNotify. plugin_delegate() may
+ // return NULL. TODO(darin): how come there is only one per frame?!?
+ WebPluginDelegate* plugin_delegate() const {
+ return plugin_delegate_;
+ }
+ void set_plugin_delegate(WebPluginDelegate* plugin_delegate) {
+ plugin_delegate_ = plugin_delegate;
+ }
+
+ WebCore::Frame* frame() {
+ return frame_.get();
+ }
+
+ static WebFrameImpl* FromFrame(WebCore::Frame* frame);
+
+ WebViewImpl* webview_impl() const {
+ return webview_impl_;
+ }
+
+ WebCore::FrameView* frameview() const {
+ return frame_ ? frame_->view() : NULL;
+ }
+
+ // Update the given datasource with currently_loading_request's info.
+ // If currently_loading_request is NULL, does nothing.
+ void CacheCurrentRequestInfo(WebDataSourceImpl* datasource);
+
+ void set_currently_loading_history_item(WebHistoryItemImpl* item);
+
+ // Getters for the impls corresponding to Get(Provisional)DataSource. They
+ // may return NULL if there is no corresponding data source.
+ WebDataSourceImpl* GetDataSourceImpl() const;
+ WebDataSourceImpl* GetProvisionalDataSourceImpl() const;
+
+ // Gets the tickmarks for drawing on the scrollbars of a particular frame.
+ const Vector<RefPtr<WebCore::Range> >& tickmarks() const {
+ return tickmarks_;
+ }
+
+ // Returns whether a range representing a tickmark should be highlighted.
+ // We use this to avoid highlighting ranges that are currently hidden.
+ static bool RangeShouldBeHighlighted(WebCore::Range* range);
+
+ const WebCore::Node* inspected_node() const {
+ return inspected_node_;
+ }
+
+ void WebFrameImpl::selectNodeFromInspector(WebCore::Node* node);
+
+ // Returns which frame has an active tickmark. This function should only be
+ // called on the main frame, as it is the only frame keeping track. Returned
+ // value can be NULL if no frame has an active tickmark.
+ const WebFrameImpl* active_tickmark_frame() const {
+ return active_tickmark_frame_;
+ }
+
+ // Returns the index of the active tickmark for this frame.
+ size_t active_tickmark_index() const {
+ return active_tickmark_;
+ }
+
+ // Sets whether the WebFrameImpl allows its document to be scrolled.
+ // If the parameter is true, allow the document to be scrolled.
+ // Otherwise, disallow scrolling
+ void SetAllowsScrolling(bool flag);
+
+ // Returns true if the frame CSS is in "printing" mode.
+ bool printing() const { return printing_; }
+
+ virtual bool HasUnloadListener();
+
+ protected:
+ friend class WebFrameLoaderClient;
+
+ // Informs the WebFrame that the Frame is being closed, called by the
+ // WebFrameLoaderClient
+ void Closing();
+
+ // A helper function for loading some document, given all of its data, into
+ // this frame. The charset may be empty if unknown, but a mime type must be
+ // specified. TODO(darin): Add option for storing this in session history.
+ void LoadDocumentData(const WebCore::KURL& base_url,
+ const WebCore::String& data,
+ const WebCore::String& mime_type,
+ const WebCore::String& charset);
+
+ // See WebFrame.h for details.
+ virtual void IncreaseMatchCount(int count, int request_id);
+ virtual void ReportFindInPageSelection(const gfx::Rect& selection_rect,
+ int active_match_ordinal,
+ int request_id);
+
+ // Resource fetcher for downloading an alternate DNS error page.
+ scoped_ptr<AltErrorPageResourceFetcher> alt_error_page_fetcher_;
+
+ // Used to check for leaks of this object.
+ static int live_object_count_;
+
+ WebFrameLoaderClient frame_loader_client_;
+
+ // Holding a reference back to the WebViewImpl is necessary to ensure that
+ // its HWND is not destroyed before all of the WebCore::Widgets, which refer
+ // to the WebViewImpl's HWND as their containingWindow. However, this ref
+ // creates a cycle between the WebViewImpl and the top-most WebFrameImpl. We
+ // break this cycle in our Closing method.
+ scoped_refptr<WebViewImpl> webview_impl_;
+
+ // The WebCore frame associated with this frame. MAY BE NULL if the frame
+ // has been detached from the DOM.
+ WTF::RefPtr<WebCore::Frame> frame_;
+
+ // This holds the request passed to LoadRequest, for access by the
+ // WebFrameLoaderClient. Unfortunately we have no other way to pass this
+ // information to him. Only non-NULL during a call to LoadRequest.
+ const WebRequest* currently_loading_request_;
+
+ // Similar to currently_loading_request_, except this will be set when
+ // WebCore initiates a history navigation (probably via javascript).
+ scoped_refptr<WebHistoryItemImpl> currently_loading_history_item_;
+
+ // Plugins sometimes need to be notified when loads are complete so we keep
+ // a pointer back to the appropriate plugin.
+ WebPluginDelegate* plugin_delegate_;
+
+ // Frame construction parameters
+ bool allows_scrolling_;
+ int margin_width_;
+ int margin_height_;
+
+ // Handling requests from TextInputController on this frame.
+ scoped_ptr<WebTextInputImpl> webtextinput_impl_;
+
+ // This vector maintains a list of Ranges representing locations for search
+ // string matches that were found in the frame during a FindInPage operation.
+ Vector<RefPtr<WebCore::Range> > tickmarks_;
+
+ // The node selected in the web inspector. Used for highlighting it on the page.
+ WebCore::Node* inspected_node_;
+
+ // The index of the active tickmark for the current frame.
+ size_t active_tickmark_;
+
+ // This rectangle is used during the scoping effort to figure out what rect
+ // got selected during the Find operation. In other words, first the Find
+ // operation iterates to the next match and then scoping will happen for all
+ // matches. When we encounter this rectangle during scoping we mark that
+ // tickmark as active (see active_tickmark_). This avoids having to iterate
+ // through a potentially very large tickmark vector to see which hit is
+ // active. Once we find the active rectangle we clear this rectangle to
+ // indicate that we are done determining what the active match is.
+ WebCore::IntRect active_selection_rect_;
+
+ // This range represents the range that got selected during the Find or
+ // FindNext operation. We will set this range as the selection (unless the
+ // user selects something between Find/FindNext operations) so that we can
+ // continue from where we left off.
+ RefPtr<WebCore::Range> last_active_range_;
+
+ // Keeps track of the last string this frame searched for. This is used for
+ // short-circuiting searches in the following scenarios: When a frame has
+ // been searched and returned 0 results, we don't need to search that frame
+ // again if the user is just adding to the search (making it more specific).
+ std::wstring last_search_string_;
+
+ // Keeps track of how many matches this frame has found so far, so that we
+ // don't loose count between scoping efforts, and is also used (in conjunction
+ // with last_search_string_ and scoping_complete_) to figure out if we need to
+ // search the frame again.
+ int last_match_count_;
+
+ // This variable keeps a cumulative total of matches found so far for ALL the
+ // frames on the page, and is only incremented by calling IncreaseMatchCount
+ // (on the main frame only). It should be -1 for all other frames.
+ int total_matchcount_;
+
+ // A way for the main frame to keep track of which frame has an active
+ // tickmark. Should be NULL for all other frames.
+ WebFrameImpl* active_tickmark_frame_;
+
+ // This variable keeps a cumulative total of how many frames are currently
+ // scoping, and is incremented/decremented on the main frame only.
+ // It should be -1 for all other frames.
+ int frames_scoping_count_;
+
+ // Keeps track of whether the scoping effort was completed (the user may
+ // interrupt it before it completes by submitting a new search).
+ bool scoping_complete_;
+
+ // Keeps track of when the scoping effort should next invalidate the scrollbar
+ // and the frame area.
+ int next_invalidate_after_;
+
+ // This is a factory for creating cancelable tasks for this frame that run
+ // asynchronously in order to scope string matches during a find operation.
+ ScopedRunnableMethodFactory<WebFrameImpl> scope_matches_factory_;
+
+ private:
+ // A bit mask specifying area of the frame to invalidate.
+ typedef enum AreaToInvalidate {
+ INVALIDATE_NOTHING = 0,
+ INVALIDATE_CONTENT_AREA = 1,
+ INVALIDATE_SCROLLBAR = 2, // vertical scrollbar only.
+ INVALIDATE_ALL = 3 // both content area and the scrollbar.
+ };
+
+ // Invalidates a certain area within the frame.
+ void InvalidateArea(AreaToInvalidate area);
+
+ // Invalidates the tickmark area represented by the range passed in.
+ void InvalidateTickmark(RefPtr<WebCore::Range> tickmark);
+
+ // Returns the ordinal of the first match in the frame specified. This
+ // function enumerates the frames, starting with the main frame and up to (but
+ // not including) the frame passed in as a parameter and counts how many
+ // tickmarks there are.
+ int OrdinalOfFirstMatchForFrame(WebFrameImpl* frame) const;
+
+ // Determines whether the scoping effort is required for a particular frame.
+ // It is not necessary if the frame is invisible, for example, or if this
+ // is a repeat search that already returned nothing last time the same prefix
+ // was searched.
+ bool ShouldScopeMatches(FindInPageRequest request);
+
+ // Determines whether to invalidate the content area and scrollbar.
+ void InvalidateIfNecessary();
+
+ void InternalLoadRequest(const WebRequest* request,
+ const WebCore::SubstituteData& data,
+ bool replace);
+
+ // In "printing" mode. Used as a state check.
+ bool printing_;
+
+ // For each printed page, the view of the document in pixels.
+ Vector<WebCore::IntRect> pages_;
+
+ DISALLOW_EVIL_CONSTRUCTORS(WebFrameImpl);
+};
+
+#endif // WEBKIT_GLUE_WEBFRAME_IMPL_H__