summaryrefslogtreecommitdiffstats
path: root/content/renderer/render_view_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'content/renderer/render_view_impl.h')
-rw-r--r--content/renderer/render_view_impl.h1209
1 files changed, 1209 insertions, 0 deletions
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
new file mode 100644
index 0000000..d204a5f
--- /dev/null
+++ b/content/renderer/render_view_impl.h
@@ -0,0 +1,1209 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_RENDERER_RENDER_VIEW_IMPL_H_
+#define CONTENT_RENDERER_RENDER_VIEW_IMPL_H_
+#pragma once
+
+#include <deque>
+#include <map>
+#include <queue>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/gtest_prod_util.h"
+#include "base/id_map.h"
+#include "base/memory/linked_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
+#include "base/timer.h"
+#include "build/build_config.h"
+#include "content/renderer/render_view_selection.h"
+#include "content/renderer/renderer_webcookiejar_impl.h"
+#include "content/common/content_export.h"
+#include "content/common/edit_command.h"
+#include "content/common/navigation_gesture.h"
+#include "content/common/page_zoom.h"
+#include "content/common/renderer_preferences.h"
+#include "content/public/renderer/render_view.h"
+#include "content/renderer/pepper_plugin_delegate_impl.h"
+#include "content/renderer/render_widget.h"
+#include "ipc/ipc_platform_file.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFileSystem.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrameClient.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebIconURL.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebPageSerializerClient.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebPageVisibilityState.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebTextDirection.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebViewClient.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebNavigationType.h"
+#include "ui/gfx/surface/transport_dib.h"
+#include "webkit/glue/webpreferences.h"
+#include "webkit/plugins/npapi/webplugin_page_delegate.h"
+
+#if defined(OS_WIN)
+// RenderViewImpl is a diamond-shaped hierarchy, with WebWidgetClient at the
+// root. VS warns when we inherit the WebWidgetClient method implementations
+// from RenderWidget. It's safe to ignore that warning.
+#pragma warning(disable: 4250)
+#endif
+
+class AudioMessageFilter;
+class DeviceOrientationDispatcher;
+class DevToolsAgent;
+class ExternalPopupMenu;
+class GeolocationDispatcher;
+class GURL;
+class IntentsDispatcher;
+class LoadProgressTracker;
+class MediaStreamImpl;
+class NotificationProvider;
+class PepperDeviceTest;
+class PrintWebViewHelper;
+class RenderWidgetFullscreenPepper;
+class RendererAccessibility;
+class SkBitmap;
+class SpeechInputDispatcher;
+class WebPluginDelegateProxy;
+class WebUIBindings;
+struct ContextMenuMediaParams;
+struct PP_Flash_NetAddress;
+struct ViewHostMsg_RunFileChooser_Params;
+struct ViewMsg_SwapOut_Params;
+struct ViewMsg_Navigate_Params;
+struct ViewMsg_StopFinding_Params;
+struct WebDropData;
+
+namespace base {
+class WaitableEvent;
+} // namespace base
+
+namespace content {
+class NavigationState;
+class P2PSocketDispatcher;
+class RenderViewObserver;
+class RenderViewVisitor;
+} // namespace content
+
+namespace gfx {
+class Point;
+class Rect;
+} // namespace gfx
+
+namespace webkit {
+
+namespace ppapi {
+class PluginInstance;
+class PluginModule;
+} // namespace ppapi
+
+} // namespace webkit
+
+namespace webkit_glue {
+struct CustomContextMenuContext;
+class ImageResourceFetcher;
+struct FileUploadData;
+struct FormData;
+struct PasswordFormFillData;
+class ResourceFetcher;
+}
+
+namespace WebKit {
+class WebApplicationCacheHost;
+class WebApplicationCacheHostClient;
+class WebDataSource;
+class WebDocument;
+class WebDragData;
+class WebGeolocationClient;
+class WebGeolocationServiceInterface;
+class WebIconURL;
+class WebImage;
+class WebInputElement;
+class WebKeyboardEvent;
+class WebMediaPlayer;
+class WebMediaPlayerClient;
+class WebMouseEvent;
+class WebSpeechInputController;
+class WebSpeechInputListener;
+class WebStorageNamespace;
+class WebTouchEvent;
+class WebURLLoader;
+class WebURLRequest;
+struct WebFileChooserParams;
+struct WebFindOptions;
+struct WebMediaPlayerAction;
+struct WebPoint;
+struct WebWindowFeatures;
+}
+
+// We need to prevent a page from trying to create infinite popups. It is not
+// as simple as keeping a count of the number of immediate children
+// popups. Having an html file that window.open()s itself would create
+// an unlimited chain of RenderViews who only have one RenderView child.
+//
+// Therefore, each new top level RenderView creates a new counter and shares it
+// with all its children and grandchildren popup RenderViewImpls created with
+// createView() to have a sort of global limit for the page so no more than
+// kMaximumNumberOfPopups popups are created.
+//
+// This is a RefCounted holder of an int because I can't say
+// scoped_refptr<int>.
+typedef base::RefCountedData<int> SharedRenderViewCounter;
+
+//
+// RenderView is an object that manages a WebView object, and provides a
+// communication interface with an embedding application process
+//
+class RenderViewImpl : public RenderWidget,
+ public WebKit::WebViewClient,
+ public WebKit::WebFrameClient,
+ public WebKit::WebPageSerializerClient,
+ public content::RenderView,
+ public webkit::npapi::WebPluginPageDelegate,
+ public base::SupportsWeakPtr<RenderViewImpl> {
+ public:
+ // Creates a new RenderView. The parent_hwnd specifies a HWND to use as the
+ // parent of the WebView HWND that will be created. If this is a blocked
+ // popup or as a new tab, opener_id is the routing ID of the RenderView
+ // responsible for creating this RenderView (corresponding to parent_hwnd).
+ // |counter| is either a currently initialized counter, or NULL (in which case
+ // we treat this RenderView as a top level window).
+ CONTENT_EXPORT static RenderViewImpl* Create(
+ gfx::NativeViewId parent_hwnd,
+ int32 opener_id,
+ const RendererPreferences& renderer_prefs,
+ const WebPreferences& webkit_prefs,
+ SharedRenderViewCounter* counter,
+ int32 routing_id,
+ int64 session_storage_namespace_id,
+ const string16& frame_name);
+
+ // Returns the RenderViewImpl containing the given WebView.
+ CONTENT_EXPORT static RenderViewImpl* FromWebView(WebKit::WebView* webview);
+
+ // Sets the "next page id" counter.
+ static void SetNextPageID(int32 next_page_id);
+
+ // May return NULL when the view is closing.
+ CONTENT_EXPORT WebKit::WebView* webview() const;
+
+ // Called by a GraphicsContext associated with this view when swapbuffers
+ // is posted, completes or is aborted.
+ void OnViewContextSwapBuffersPosted();
+ void OnViewContextSwapBuffersComplete();
+ void OnViewContextSwapBuffersAborted();
+
+ int history_list_offset() const { return history_list_offset_; }
+
+ const WebPreferences& webkit_preferences() const {
+ return webkit_preferences_;
+ }
+
+ void set_send_content_state_immediately(bool value) {
+ send_content_state_immediately_ = value;
+ }
+
+ // Current P2PSocketDispatcher. Set to NULL if P2P API is disabled.
+ content::P2PSocketDispatcher* p2p_socket_dispatcher() {
+ return p2p_socket_dispatcher_;
+ }
+
+ // Functions to add and remove observers for this object.
+ void AddObserver(content::RenderViewObserver* observer);
+ void RemoveObserver(content::RenderViewObserver* observer);
+
+ // Adds the given file chooser request to the file_chooser_completion_ queue
+ // (see that var for more) and requests the chooser be displayed if there are
+ // no other waiting items in the queue.
+ //
+ // Returns true if the chooser was successfully scheduled. False means we
+ // didn't schedule anything.
+ bool ScheduleFileChooser(const ViewHostMsg_RunFileChooser_Params& params,
+ WebKit::WebFileChooserCompletion* completion);
+
+ // Sets whether the renderer should report load progress to the browser.
+ void SetReportLoadProgressEnabled(bool enabled);
+
+ void LoadNavigationErrorPage(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& failed_request,
+ const WebKit::WebURLError& error,
+ const std::string& html,
+ bool replace);
+
+ // Plugin-related functions --------------------------------------------------
+ // (See also WebPluginPageDelegate implementation.)
+
+ // Notification that the given plugin has crashed.
+ void PluginCrashed(const FilePath& plugin_path);
+
+ // Creates a fullscreen container for a pepper plugin instance.
+ RenderWidgetFullscreenPepper* CreatePepperFullscreenContainer(
+ webkit::ppapi::PluginInstance* plugin);
+
+ // Informs the render view that a PPAPI plugin has gained or lost focus.
+ void PpapiPluginFocusChanged();
+
+ // Request updated policy regarding firewall NAT traversal being enabled.
+ void RequestRemoteAccessClientFirewallTraversal();
+
+#if defined(OS_MACOSX) || defined(OS_WIN)
+ // Informs the render view that the given plugin has gained or lost focus.
+ void PluginFocusChanged(bool focused, int plugin_id);
+#endif
+
+#if defined(OS_MACOSX)
+ // Starts plugin IME.
+ void StartPluginIme();
+
+ // Helper routines for accelerated plugin support. Used by the
+ // WebPluginDelegateProxy, which has a pointer to the RenderView.
+ gfx::PluginWindowHandle AllocateFakePluginWindowHandle(bool opaque,
+ bool root);
+ void DestroyFakePluginWindowHandle(gfx::PluginWindowHandle window);
+ void AcceleratedSurfaceSetIOSurface(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ uint64 io_surface_identifier);
+ TransportDIB::Handle AcceleratedSurfaceAllocTransportDIB(size_t size);
+ void AcceleratedSurfaceFreeTransportDIB(TransportDIB::Id dib_id);
+ void AcceleratedSurfaceSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib);
+ void AcceleratedSurfaceBuffersSwapped(gfx::PluginWindowHandle window,
+ uint64 surface_id);
+#endif
+
+ void RegisterPluginDelegate(WebPluginDelegateProxy* delegate);
+ void UnregisterPluginDelegate(WebPluginDelegateProxy* delegate);
+
+ // Helper function to retrieve information about a plugin for a URL and mime
+ // type. Returns false if no plugin was found.
+ // |actual_mime_type| is the actual mime type supported by the
+ // plugin found that match the URL given (one for each item in
+ // |info|).
+ CONTENT_EXPORT bool GetPluginInfo(const GURL& url,
+ const GURL& page_url,
+ const std::string& mime_type,
+ webkit::WebPluginInfo* plugin_info,
+ std::string* actual_mime_type);
+
+ // IPC::Channel::Listener implementation -------------------------------------
+
+ virtual bool OnMessageReceived(const IPC::Message& msg);
+
+ // WebKit::WebWidgetClient implementation ------------------------------------
+
+ // Most methods are handled by RenderWidget.
+ virtual void didFocus();
+ virtual void didBlur();
+ virtual void show(WebKit::WebNavigationPolicy policy);
+ virtual void runModal();
+
+ // WebKit::WebViewClient implementation --------------------------------------
+
+ virtual WebKit::WebView* createView(
+ WebKit::WebFrame* creator,
+ const WebKit::WebURLRequest& request,
+ const WebKit::WebWindowFeatures& features,
+ const WebKit::WebString& frame_name);
+ virtual WebKit::WebWidget* createPopupMenu(WebKit::WebPopupType popup_type);
+ virtual WebKit::WebWidget* createPopupMenu(
+ const WebKit::WebPopupMenuInfo& info);
+ virtual WebKit::WebExternalPopupMenu* createExternalPopupMenu(
+ const WebKit::WebPopupMenuInfo& popup_menu_info,
+ WebKit::WebExternalPopupMenuClient* popup_menu_client);
+ virtual WebKit::WebStorageNamespace* createSessionStorageNamespace(
+ unsigned quota);
+ virtual void didAddMessageToConsole(
+ const WebKit::WebConsoleMessage& message,
+ const WebKit::WebString& source_name,
+ unsigned source_line);
+ virtual void printPage(WebKit::WebFrame* frame);
+ virtual WebKit::WebNotificationPresenter* notificationPresenter();
+ virtual bool enumerateChosenDirectory(
+ const WebKit::WebString& path,
+ WebKit::WebFileChooserCompletion* chooser_completion);
+ virtual void didStartLoading();
+ virtual void didStopLoading();
+ virtual void didChangeLoadProgress(WebKit::WebFrame* frame,
+ double load_progress);
+ virtual bool isSmartInsertDeleteEnabled();
+ virtual bool isSelectTrailingWhitespaceEnabled();
+ virtual void didChangeSelection(bool is_selection_empty);
+ virtual void didExecuteCommand(const WebKit::WebString& command_name);
+ virtual bool handleCurrentKeyboardEvent();
+ virtual bool runFileChooser(
+ const WebKit::WebFileChooserParams& params,
+ WebKit::WebFileChooserCompletion* chooser_completion);
+ virtual void runModalAlertDialog(WebKit::WebFrame* frame,
+ const WebKit::WebString& message);
+ virtual bool runModalConfirmDialog(WebKit::WebFrame* frame,
+ const WebKit::WebString& message);
+ virtual bool runModalPromptDialog(WebKit::WebFrame* frame,
+ const WebKit::WebString& message,
+ const WebKit::WebString& default_value,
+ WebKit::WebString* actual_value);
+ virtual bool runModalBeforeUnloadDialog(WebKit::WebFrame* frame,
+ const WebKit::WebString& message);
+ virtual void showContextMenu(WebKit::WebFrame* frame,
+ const WebKit::WebContextMenuData& data);
+ virtual bool supportsFullscreen();
+ virtual void enterFullscreenForNode(const WebKit::WebNode&);
+ virtual void exitFullscreenForNode(const WebKit::WebNode&);
+ virtual void enterFullscreen() OVERRIDE;
+ virtual void exitFullscreen() OVERRIDE;
+ virtual void setStatusText(const WebKit::WebString& text);
+ virtual void setMouseOverURL(const WebKit::WebURL& url);
+ virtual void setKeyboardFocusURL(const WebKit::WebURL& url);
+ virtual void startDragging(const WebKit::WebDragData& data,
+ WebKit::WebDragOperationsMask mask,
+ const WebKit::WebImage& image,
+ const WebKit::WebPoint& imageOffset);
+ virtual bool acceptsLoadDrops();
+ virtual void focusNext();
+ virtual void focusPrevious();
+ virtual void focusedNodeChanged(const WebKit::WebNode& node);
+ virtual void navigateBackForwardSoon(int offset);
+ virtual int historyBackListCount();
+ virtual int historyForwardListCount();
+ virtual void postAccessibilityNotification(
+ const WebKit::WebAccessibilityObject& obj,
+ WebKit::WebAccessibilityNotification notification);
+ virtual void didUpdateInspectorSetting(const WebKit::WebString& key,
+ const WebKit::WebString& value);
+ virtual WebKit::WebGeolocationClient* geolocationClient();
+ virtual WebKit::WebSpeechInputController* speechInputController(
+ WebKit::WebSpeechInputListener* listener);
+ virtual WebKit::WebDeviceOrientationClient* deviceOrientationClient();
+ virtual void zoomLimitsChanged(double minimum_level, double maximum_level);
+ virtual void zoomLevelChanged();
+ virtual void registerProtocolHandler(const WebKit::WebString& scheme,
+ const WebKit::WebString& base_url,
+ const WebKit::WebString& url,
+ const WebKit::WebString& title);
+ virtual void registerIntentHandler(const WebKit::WebString& action,
+ const WebKit::WebString& type,
+ const WebKit::WebString& href,
+ const WebKit::WebString& title);
+ virtual WebKit::WebPageVisibilityState visibilityState() const;
+ virtual void startActivity(const WebKit::WebString& action,
+ const WebKit::WebString& type,
+ const WebKit::WebString& data,
+ int intent_id);
+
+ // WebKit::WebFrameClient implementation -------------------------------------
+
+ virtual WebKit::WebPlugin* createPlugin(
+ WebKit::WebFrame* frame,
+ const WebKit::WebPluginParams& params);
+ virtual WebKit::WebWorker* createWorker(WebKit::WebFrame* frame,
+ WebKit::WebWorkerClient* client);
+ virtual WebKit::WebSharedWorker* createSharedWorker(
+ WebKit::WebFrame* frame, const WebKit::WebURL& url,
+ const WebKit::WebString& name, unsigned long long documentId);
+ virtual WebKit::WebMediaPlayer* createMediaPlayer(
+ WebKit::WebFrame* frame,
+ WebKit::WebMediaPlayerClient* client);
+ virtual WebKit::WebApplicationCacheHost* createApplicationCacheHost(
+ WebKit::WebFrame* frame,
+ WebKit::WebApplicationCacheHostClient* client);
+ virtual WebKit::WebCookieJar* cookieJar(WebKit::WebFrame* frame);
+ virtual void frameDetached(WebKit::WebFrame* frame);
+ virtual void willClose(WebKit::WebFrame* frame);
+ virtual void loadURLExternally(WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request,
+ WebKit::WebNavigationPolicy policy);
+ virtual void loadURLExternally(WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request,
+ WebKit::WebNavigationPolicy policy,
+ const WebKit::WebString& suggested_name);
+ virtual WebKit::WebNavigationPolicy decidePolicyForNavigation(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request,
+ WebKit::WebNavigationType type,
+ const WebKit::WebNode&,
+ WebKit::WebNavigationPolicy default_policy,
+ bool is_redirect);
+ virtual bool canHandleRequest(WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request);
+ virtual WebKit::WebURLError cannotHandleRequestError(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request);
+ virtual WebKit::WebURLError cancelledError(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request);
+ virtual void unableToImplementPolicyWithError(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLError& error);
+ virtual void willSendSubmitEvent(WebKit::WebFrame* frame,
+ const WebKit::WebFormElement& form);
+ virtual void willSubmitForm(WebKit::WebFrame* frame,
+ const WebKit::WebFormElement& form);
+ virtual void willPerformClientRedirect(WebKit::WebFrame* frame,
+ const WebKit::WebURL& from,
+ const WebKit::WebURL& to,
+ double interval,
+ double fire_time);
+ virtual void didCancelClientRedirect(WebKit::WebFrame* frame);
+ virtual void didCompleteClientRedirect(WebKit::WebFrame* frame,
+ const WebKit::WebURL& from);
+ virtual void didCreateDataSource(WebKit::WebFrame* frame,
+ WebKit::WebDataSource* datasource);
+ virtual void didStartProvisionalLoad(WebKit::WebFrame* frame);
+ virtual void didReceiveServerRedirectForProvisionalLoad(
+ WebKit::WebFrame* frame);
+ virtual void didFailProvisionalLoad(WebKit::WebFrame* frame,
+ const WebKit::WebURLError& error);
+ virtual void didReceiveDocumentData(WebKit::WebFrame* frame,
+ const char* data, size_t length,
+ bool& prevent_default);
+ virtual void didCommitProvisionalLoad(WebKit::WebFrame* frame,
+ bool is_new_navigation);
+ virtual void didClearWindowObject(WebKit::WebFrame* frame);
+ virtual void didCreateDocumentElement(WebKit::WebFrame* frame);
+ virtual void didReceiveTitle(WebKit::WebFrame* frame,
+ const WebKit::WebString& title,
+ WebKit::WebTextDirection direction);
+ virtual void didChangeIcon(WebKit::WebFrame*,
+ WebKit::WebIconURL::Type) OVERRIDE;
+ virtual void didFinishDocumentLoad(WebKit::WebFrame* frame);
+ virtual void didHandleOnloadEvents(WebKit::WebFrame* frame);
+ virtual void didFailLoad(WebKit::WebFrame* frame,
+ const WebKit::WebURLError& error);
+ virtual void didFinishLoad(WebKit::WebFrame* frame);
+ virtual void didNavigateWithinPage(WebKit::WebFrame* frame,
+ bool is_new_navigation);
+ virtual void didUpdateCurrentHistoryItem(WebKit::WebFrame* frame);
+ virtual void assignIdentifierToRequest(WebKit::WebFrame* frame,
+ unsigned identifier,
+ const WebKit::WebURLRequest& request);
+ virtual void willSendRequest(WebKit::WebFrame* frame,
+ unsigned identifier,
+ WebKit::WebURLRequest& request,
+ const WebKit::WebURLResponse& redirect_response);
+ virtual void didReceiveResponse(WebKit::WebFrame* frame,
+ unsigned identifier,
+ const WebKit::WebURLResponse& response);
+ virtual void didFinishResourceLoad(WebKit::WebFrame* frame,
+ unsigned identifier);
+ virtual void didFailResourceLoad(WebKit::WebFrame* frame,
+ unsigned identifier,
+ const WebKit::WebURLError& error);
+ virtual void didLoadResourceFromMemoryCache(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request,
+ const WebKit::WebURLResponse&);
+ virtual void didDisplayInsecureContent(WebKit::WebFrame* frame);
+ virtual void didRunInsecureContent(
+ WebKit::WebFrame* frame,
+ const WebKit::WebSecurityOrigin& origin,
+ const WebKit::WebURL& target);
+ virtual void didAdoptURLLoader(WebKit::WebURLLoader* loader);
+ virtual void didExhaustMemoryAvailableForScript(WebKit::WebFrame* frame);
+ virtual void didCreateScriptContext(WebKit::WebFrame* frame,
+ v8::Handle<v8::Context>,
+ int world_id);
+ virtual void willReleaseScriptContext(WebKit::WebFrame* frame,
+ v8::Handle<v8::Context>,
+ int world_id);
+ virtual void didUpdateLayout(WebKit::WebFrame* frame);
+ virtual void didChangeScrollOffset(WebKit::WebFrame* frame);
+ virtual void numberOfWheelEventHandlersChanged(unsigned num_handlers);
+ virtual void didChangeContentsSize(WebKit::WebFrame* frame,
+ const WebKit::WebSize& size);
+ virtual void reportFindInPageMatchCount(int request_id,
+ int count,
+ bool final_update);
+ virtual void reportFindInPageSelection(int request_id,
+ int active_match_ordinal,
+ const WebKit::WebRect& sel);
+
+ virtual void openFileSystem(WebKit::WebFrame* frame,
+ WebKit::WebFileSystem::Type type,
+ long long size,
+ bool create,
+ WebKit::WebFileSystemCallbacks* callbacks);
+
+ virtual void queryStorageUsageAndQuota(
+ WebKit::WebFrame* frame,
+ WebKit::WebStorageQuotaType type,
+ WebKit::WebStorageQuotaCallbacks* callbacks);
+
+ virtual void requestStorageQuota(
+ WebKit::WebFrame* frame,
+ WebKit::WebStorageQuotaType type,
+ unsigned long long requested_size,
+ WebKit::WebStorageQuotaCallbacks* callbacks);
+
+ // WebKit::WebPageSerializerClient implementation ----------------------------
+
+ virtual void didSerializeDataForFrame(
+ const WebKit::WebURL& frame_url,
+ const WebKit::WebCString& data,
+ PageSerializationStatus status) OVERRIDE;
+
+ // content::RenderView implementation ----------------------------------------
+
+ virtual bool Send(IPC::Message* message) OVERRIDE;
+ virtual int GetRoutingId() const OVERRIDE;
+ virtual int GetPageId() OVERRIDE;
+ virtual gfx::Size GetSize() OVERRIDE;
+ virtual gfx::NativeViewId GetHostWindow() OVERRIDE;
+ virtual WebPreferences& GetWebkitPreferences() OVERRIDE;
+ virtual WebKit::WebView* GetWebView() OVERRIDE;
+ virtual WebKit::WebNode GetFocusedNode() const OVERRIDE;
+ virtual WebKit::WebNode GetContextMenuNode() const OVERRIDE;
+ virtual bool IsEditableNode(const WebKit::WebNode& node) OVERRIDE;
+ virtual WebKit::WebPlugin* CreatePlugin(
+ WebKit::WebFrame* frame,
+ const webkit::WebPluginInfo& info,
+ const WebKit::WebPluginParams& params) OVERRIDE;
+ virtual void EvaluateScript(const string16& frame_xpath,
+ const string16& jscript,
+ int id,
+ bool notify_result) OVERRIDE;
+ virtual bool ShouldDisplayScrollbars(int width, int height) const OVERRIDE;
+ virtual int GetEnabledBindings() OVERRIDE;
+ virtual void SetEnabledBindings(int enabled_bindings) OVERRIDE;
+ virtual bool GetContentStateImmediately() OVERRIDE;
+ virtual float GetFilteredTimePerFrame() OVERRIDE;
+ virtual void ShowContextMenu(WebKit::WebFrame* frame,
+ const WebKit::WebContextMenuData& data) OVERRIDE;
+ virtual WebKit::WebPageVisibilityState GetVisibilityState() const OVERRIDE;
+ virtual void RunModalAlertDialog(WebKit::WebFrame* frame,
+ const WebKit::WebString& message) OVERRIDE;
+ virtual void LoadURLExternally(
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request,
+ WebKit::WebNavigationPolicy policy) OVERRIDE;
+
+ // webkit_glue::WebPluginPageDelegate implementation -------------------------
+
+ virtual webkit::npapi::WebPluginDelegate* CreatePluginDelegate(
+ const FilePath& file_path,
+ const std::string& mime_type);
+ virtual void CreatedPluginWindow(gfx::PluginWindowHandle handle);
+ virtual void WillDestroyPluginWindow(gfx::PluginWindowHandle handle);
+ virtual void DidMovePlugin(const webkit::npapi::WebPluginGeometry& move);
+ virtual void DidStartLoadingForPlugin();
+ virtual void DidStopLoadingForPlugin();
+ virtual WebKit::WebCookieJar* GetCookieJar();
+
+ // Please do not add your stuff randomly to the end here. If there is an
+ // appropriate section, add it there. If not, there are some random functions
+ // nearer to the top you can add it to.
+ virtual void DidFlushPaint();
+
+ // Cannot use std::set unfortunately since linked_ptr<> does not support
+ // operator<.
+ typedef std::vector<linked_ptr<webkit_glue::ImageResourceFetcher> >
+ ImageResourceFetcherList;
+
+ protected:
+ // RenderWidget overrides:
+ virtual void Close();
+ virtual void OnResize(const gfx::Size& new_size,
+ const gfx::Rect& resizer_rect);
+ virtual void DidInitiatePaint();
+ virtual webkit::ppapi::PluginInstance* GetBitmapForOptimizedPluginPaint(
+ const gfx::Rect& paint_bounds,
+ TransportDIB** dib,
+ gfx::Rect* location,
+ gfx::Rect* clip);
+ virtual gfx::Point GetScrollOffset();
+ virtual void DidHandleKeyEvent();
+ virtual bool WillHandleMouseEvent(
+ const WebKit::WebMouseEvent& event) OVERRIDE;
+ virtual void DidHandleMouseEvent(const WebKit::WebMouseEvent& event);
+ virtual void DidHandleTouchEvent(const WebKit::WebTouchEvent& event);
+ virtual void OnSetFocus(bool enable);
+ virtual void OnWasHidden();
+ virtual void OnWasRestored(bool needs_repainting);
+ virtual bool SupportsAsynchronousSwapBuffers() OVERRIDE;
+ virtual void OnImeSetComposition(
+ const string16& text,
+ const std::vector<WebKit::WebCompositionUnderline>& underlines,
+ int selection_start,
+ int selection_end) OVERRIDE;
+ virtual void OnImeConfirmComposition(const string16& text) OVERRIDE;
+ virtual ui::TextInputType GetTextInputType() OVERRIDE;
+ virtual bool CanComposeInline() OVERRIDE;
+ virtual bool WebWidgetHandlesCompositorScheduling() const OVERRIDE;
+
+ private:
+ // For unit tests.
+ friend class ExternalPopupMenuTest;
+ friend class PepperDeviceTest;
+ friend class RenderViewTest;
+
+ FRIEND_TEST_ALL_PREFIXES(ExternalPopupMenuRemoveTest, RemoveOnChange);
+ FRIEND_TEST_ALL_PREFIXES(ExternalPopupMenuTest, NormalCase);
+ FRIEND_TEST_ALL_PREFIXES(ExternalPopupMenuTest, ShowPopupThenNavigate);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, DontIgnoreBackAfterNavEntryLimit);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, ImeComposition);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, InsertCharacters);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, JSBlockSentAfterPageLoad);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, LastCommittedUpdateState);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, OnHandleKeyboardEvent);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, OnImeStateChanged);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, OnNavStateChanged);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, OnSetTextDirection);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, OnUpdateWebPreferences);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, StaleNavigationsIgnored);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, UpdateTargetURLWithInvalidURL);
+#if defined(OS_MACOSX)
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, MacTestCmdUp);
+#endif
+ FRIEND_TEST_ALL_PREFIXES(RenderViewTest, SetHistoryLengthAndPrune);
+
+ typedef std::map<GURL, double> HostZoomLevels;
+
+ enum ErrorPageType {
+ DNS_ERROR,
+ HTTP_404,
+ CONNECTION_ERROR,
+ };
+
+ RenderViewImpl(gfx::NativeViewId parent_hwnd,
+ int32 opener_id,
+ const RendererPreferences& renderer_prefs,
+ const WebPreferences& webkit_prefs,
+ SharedRenderViewCounter* counter,
+ int32 routing_id,
+ int64 session_storage_namespace_id,
+ const string16& frame_name);
+
+ // Do not delete directly. This class is reference counted.
+ virtual ~RenderViewImpl();
+
+ void UpdateURL(WebKit::WebFrame* frame);
+ void UpdateTitle(WebKit::WebFrame* frame, const string16& title,
+ WebKit::WebTextDirection title_direction);
+ void UpdateSessionHistory(WebKit::WebFrame* frame);
+
+ // Update current main frame's encoding and send it to browser window.
+ // Since we want to let users see the right encoding info from menu
+ // before finishing loading, we call the UpdateEncoding in
+ // a) function:DidCommitLoadForFrame. When this function is called,
+ // that means we have got first data. In here we try to get encoding
+ // of page if it has been specified in http header.
+ // b) function:DidReceiveTitle. When this function is called,
+ // that means we have got specified title. Because in most of webpages,
+ // title tags will follow meta tags. In here we try to get encoding of
+ // page if it has been specified in meta tag.
+ // c) function:DidFinishDocumentLoadForFrame. When this function is
+ // called, that means we have got whole html page. In here we should
+ // finally get right encoding of page.
+ void UpdateEncoding(WebKit::WebFrame* frame,
+ const std::string& encoding_name);
+
+ void OpenURL(WebKit::WebFrame* frame,
+ const GURL& url,
+ const GURL& referrer,
+ WebKit::WebNavigationPolicy policy);
+
+ bool RunJavaScriptMessage(int type,
+ const string16& message,
+ const string16& default_value,
+ const GURL& frame_url,
+ string16* result);
+
+ // Sends a message and runs a nested message loop.
+ bool SendAndRunNestedMessageLoop(IPC::SyncMessage* message);
+
+ // Called when the "pinned to left/right edge" state needs to be updated.
+ void UpdateScrollState(WebKit::WebFrame* frame);
+
+ // IPC message handlers ------------------------------------------------------
+ //
+ // The documentation for these functions should be in
+ // render_messages_internal.h for the message that the function is handling.
+
+ void OnAllowBindings(int enabled_bindings_flags);
+ void OnAllowScriptToClose(bool script_can_close);
+ void OnAsyncFileOpened(base::PlatformFileError error_code,
+ IPC::PlatformFileForTransit file_for_transit,
+ int message_id);
+ void OnPpapiBrokerChannelCreated(int request_id,
+ base::ProcessHandle broker_process_handle,
+ const IPC::ChannelHandle& handle);
+ void OnCancelDownload(int32 download_id);
+ void OnClearFocusedNode();
+ void OnClosePage();
+#if defined(ENABLE_FLAPPER_HACKS)
+ void OnConnectTcpACK(int request_id,
+ IPC::PlatformFileForTransit socket_for_transit,
+ const PP_Flash_NetAddress& local_addr,
+ const PP_Flash_NetAddress& remote_addr);
+#endif
+ void OnContextMenuClosed(
+ const webkit_glue::CustomContextMenuContext& custom_context);
+ void OnCopy();
+ void OnCopyImageAt(int x, int y);
+#if defined(OS_MACOSX)
+ void OnCopyToFindPboard();
+#endif
+ void OnCut();
+ void OnCSSInsertRequest(const string16& frame_xpath,
+ const std::string& css);
+ void OnCustomContextMenuAction(
+ const webkit_glue::CustomContextMenuContext& custom_context,
+ unsigned action);
+ void OnDelete();
+ void OnDeterminePageLanguage();
+ void OnDisableScrollbarsForSmallWindows(
+ const gfx::Size& disable_scrollbars_size_limit);
+ void OnDisassociateFromPopupCount();
+ void OnDragSourceEndedOrMoved(const gfx::Point& client_point,
+ const gfx::Point& screen_point,
+ bool ended,
+ WebKit::WebDragOperation drag_operation);
+ void OnDragSourceSystemDragEnded();
+ void OnDragTargetDrop(const gfx::Point& client_pt,
+ const gfx::Point& screen_pt);
+ void OnDragTargetDragEnter(const WebDropData& drop_data,
+ const gfx::Point& client_pt,
+ const gfx::Point& screen_pt,
+ WebKit::WebDragOperationsMask operations_allowed);
+ void OnDragTargetDragLeave();
+ void OnDragTargetDragOver(const gfx::Point& client_pt,
+ const gfx::Point& screen_pt,
+ WebKit::WebDragOperationsMask operations_allowed);
+ void OnEnablePreferredSizeChangedMode(int flags);
+ void OnEnumerateDirectoryResponse(int id, const std::vector<FilePath>& paths);
+ void OnExecuteEditCommand(const std::string& name, const std::string& value);
+ void OnFileChooserResponse(const std::vector<FilePath>& paths);
+ void OnFind(int request_id, const string16&, const WebKit::WebFindOptions&);
+ void OnFindReplyAck();
+ void OnGetAllSavableResourceLinksForCurrentPage(const GURL& page_url);
+ void OnGetSerializedHtmlDataForCurrentPageWithLocalLinks(
+ const std::vector<GURL>& links,
+ const std::vector<FilePath>& local_paths,
+ const FilePath& local_directory_name);
+ void OnLockMouseACK(bool succeeded);
+ void OnMediaPlayerActionAt(const gfx::Point& location,
+ const WebKit::WebMediaPlayerAction& action);
+ void OnMouseLockLost();
+ void OnMoveOrResizeStarted();
+ CONTENT_EXPORT void OnNavigate(const ViewMsg_Navigate_Params& params);
+ void OnPaste();
+#if defined(OS_MACOSX)
+ void OnPluginImeCompositionCompleted(const string16& text, int plugin_id);
+#endif
+ void OnRedo();
+ void OnReloadFrame();
+ void OnReplace(const string16& text);
+ void OnReservePageIDRange(int size_of_range);
+ void OnResetPageEncodingToDefault();
+ void OnScriptEvalRequest(const string16& frame_xpath,
+ const string16& jscript,
+ int id,
+ bool notify_result);
+ void OnSelectAll();
+ void OnSelectRange(const gfx::Point& start, const gfx::Point& end);
+ void OnSetActive(bool active);
+ void OnSetAltErrorPageURL(const GURL& gurl);
+ void OnSetBackground(const SkBitmap& background);
+ void OnSetWebUIProperty(const std::string& name, const std::string& value);
+ void OnSetEditCommandsForNextKeyEvent(const EditCommands& edit_commands);
+ CONTENT_EXPORT void OnSetHistoryLengthAndPrune(int history_length,
+ int32 minimum_page_id);
+ void OnSetInitialFocus(bool reverse);
+#if defined(OS_MACOSX)
+ void OnSetInLiveResize(bool in_live_resize);
+#endif
+ void OnScrollFocusedEditableNodeIntoRect(const gfx::Rect& rect);
+ void OnSetPageEncoding(const std::string& encoding_name);
+ void OnSetRendererPrefs(const RendererPreferences& renderer_prefs);
+#if defined(OS_MACOSX)
+ void OnSetWindowVisibility(bool visible);
+#endif
+ void OnSetZoomLevel(double zoom_level);
+ void OnSetZoomLevelForLoadingURL(const GURL& url, double zoom_level);
+ void OnExitFullscreen();
+ void OnShouldClose();
+ void OnStop();
+ void OnStopFinding(const ViewMsg_StopFinding_Params& params);
+ void OnSwapOut(const ViewMsg_SwapOut_Params& params);
+ void OnThemeChanged();
+ void OnUndo();
+ void OnUpdateTargetURLAck();
+ void OnUpdateWebPreferences(const WebPreferences& prefs);
+ void OnUpdateRemoteAccessClientFirewallTraversal(const std::string& policy);
+
+#if defined(OS_MACOSX)
+ void OnWindowFrameChanged(const gfx::Rect& window_frame,
+ const gfx::Rect& view_frame);
+ void OnSelectPopupMenuItem(int selected_index);
+#endif
+ void OnZoom(PageZoom::Function function);
+ void OnEnableViewSourceMode();
+
+ // Adding a new message handler? Please add it in alphabetical order above
+ // and put it in the same position in the .cc file.
+
+ // Misc private functions ----------------------------------------------------
+
+ void AltErrorPageFinished(WebKit::WebFrame* frame,
+ const WebKit::WebURLError& original_error,
+ const std::string& html);
+
+ // Check whether the preferred size has changed.
+ void CheckPreferredSize();
+
+ // This callback is triggered when DownloadFavicon completes, either
+ // succesfully or with a failure. See DownloadFavicon for more
+ // details.
+ void DidDownloadFavicon(webkit_glue::ImageResourceFetcher* fetcher,
+ const SkBitmap& image);
+
+ // Requests to download a favicon image. When done, the RenderView is notified
+ // by way of DidDownloadFavicon. Returns true if the request was successfully
+ // started, false otherwise. id is used to uniquely identify the request and
+ // passed back to the DidDownloadFavicon method. If the image has multiple
+ // frames, the frame whose size is image_size is returned. If the image
+ // doesn't have a frame at the specified size, the first is returned.
+ bool DownloadFavicon(int id, const GURL& image_url, int image_size);
+
+ GURL GetAlternateErrorPageURL(const GURL& failed_url,
+ ErrorPageType error_type);
+
+ // Locates a sub frame with given xpath
+ WebKit::WebFrame* GetChildFrame(const string16& frame_xpath) const;
+
+ // Returns the opener url if present, else an empty url.
+ GURL GetOpenerUrl() const;
+
+ WebUIBindings* GetWebUIBindings();
+
+ // Should only be called if this object wraps a PluginDocument.
+ WebKit::WebPlugin* GetWebPluginFromPluginDocument();
+
+ // Returns true if the |params| navigation is to an entry that has been
+ // cropped due to a recent navigation the browser did not know about.
+ bool IsBackForwardToStaleEntry(const ViewMsg_Navigate_Params& params,
+ bool is_reload);
+
+ // Returns false unless this is a top-level navigation that crosses origins.
+ bool IsNonLocalTopLevelNavigation(const GURL& url,
+ WebKit::WebFrame* frame,
+ WebKit::WebNavigationType type);
+
+ bool MaybeLoadAlternateErrorPage(WebKit::WebFrame* frame,
+ const WebKit::WebURLError& error,
+ bool replace);
+
+ // Starts nav_state_sync_timer_ if it isn't already running.
+ void StartNavStateSyncTimerIfNecessary();
+
+ // Dispatches the current navigation state to the browser. Called on a
+ // periodic timer so we don't send too many messages.
+ void SyncNavigationState();
+
+ // Dispatches the current state of selection on the webpage to the browser if
+ // it has changed.
+ // TODO(varunjain): delete this method once we figure out how to keep
+ // selection handles in sync with the webpage.
+ void SyncSelectionIfRequired();
+
+#if defined(OS_POSIX) && !defined(OS_MACOSX)
+ void UpdateFontRenderingFromRendererPrefs();
+#else
+ void UpdateFontRenderingFromRendererPrefs() {}
+#endif
+
+ // Update the target url and tell the browser that the target URL has changed.
+ // If |url| is empty, show |fallback_url|.
+ void UpdateTargetURL(const GURL& url, const GURL& fallback_url);
+
+ // ---------------------------------------------------------------------------
+ // ADDING NEW FUNCTIONS? Please keep private functions alphabetized and put
+ // it in the same order in the .cc file as it was in the header.
+ // ---------------------------------------------------------------------------
+
+ // Settings ------------------------------------------------------------------
+
+ WebPreferences webkit_preferences_;
+ RendererPreferences renderer_preferences_;
+
+ HostZoomLevels host_zoom_levels_;
+
+ // Whether content state (such as form state, scroll position and page
+ // contents) should be sent to the browser immediately. This is normally
+ // false, but set to true by some tests.
+ bool send_content_state_immediately_;
+
+ // Bitwise-ORed set of extra bindings that have been enabled. See
+ // BindingsPolicy for details.
+ int enabled_bindings_;
+
+ // The alternate error page URL, if one exists.
+ GURL alternate_error_page_url_;
+
+ // If true, we send IPC messages when |preferred_size_| changes.
+ bool send_preferred_size_changes_;
+
+ // If non-empty, and |send_preferred_size_changes_| is true, disable drawing
+ // scroll bars on windows smaller than this size. Used for windows that the
+ // browser resizes to the size of the content, such as browser action popups.
+ // If a render view is set to the minimum size of its content, webkit may add
+ // scroll bars. This makes sense for fixed sized windows, but it does not
+ // make sense when the size of the view was chosen to fit the content.
+ // This setting ensures that no scroll bars are drawn. The size limit exists
+ // because if the view grows beyond a size known to the browser, scroll bars
+ // should be drawn.
+ gfx::Size disable_scrollbars_size_limit_;
+
+ // Loading state -------------------------------------------------------------
+
+ // True if the top level frame is currently being loaded.
+ bool is_loading_;
+
+ // The gesture that initiated the current navigation.
+ NavigationGesture navigation_gesture_;
+
+ // Used for popups.
+ bool opened_by_user_gesture_;
+ GURL creator_url_;
+
+ // Whether this RenderView was created by a frame that was suppressing its
+ // opener. If so, we may want to load pages in a separate process. See
+ // decidePolicyForNavigation for details.
+ bool opener_suppressed_;
+
+ // If we are handling a top-level client-side redirect, this tracks the URL
+ // of the page that initiated it. Specifically, when a load is committed this
+ // is used to determine if that load originated from a client-side redirect.
+ // It is empty if there is no top-level client-side redirect.
+ GURL completed_client_redirect_src_;
+
+ // Holds state pertaining to a navigation that we initiated. This is held by
+ // the WebDataSource::ExtraData attribute. We use pending_navigation_state_
+ // as a temporary holder for the state until the WebDataSource corresponding
+ // to the new navigation is created. See DidCreateDataSource.
+ scoped_ptr<content::NavigationState> pending_navigation_state_;
+
+ // Timer used to delay the updating of nav state (see SyncNavigationState).
+ base::OneShotTimer<RenderViewImpl> nav_state_sync_timer_;
+
+ // Page IDs ------------------------------------------------------------------
+ // See documentation in content::RenderView.
+ int32 page_id_;
+
+ // Indicates the ID of the last page that we sent a FrameNavigate to the
+ // browser for. This is used to determine if the most recent transition
+ // generated a history entry (less than page_id_), or not (equal to or
+ // greater than). Note that this will be greater than page_id_ if the user
+ // goes back.
+ int32 last_page_id_sent_to_browser_;
+
+ // The next available page ID to use. This ensures that the page IDs are
+ // globally unique in the renderer.
+ static int32 next_page_id_;
+
+ // The offset of the current item in the history list.
+ int history_list_offset_;
+
+ // The RenderView's current impression of the history length. This includes
+ // any items that have committed in this process, but because of cross-process
+ // navigations, the history may have some entries that were committed in other
+ // processes. We won't know about them until the next navigation in this
+ // process.
+ int history_list_length_;
+
+ // The list of page IDs for each history item this RenderView knows about.
+ // Some entries may be -1 if they were rendered by other processes or were
+ // restored from a previous session. This lets us detect attempts to
+ // navigate to stale entries that have been cropped from our history.
+ std::vector<int32> history_page_ids_;
+
+ // Page info -----------------------------------------------------------------
+
+ // The last gotten main frame's encoding.
+ std::string last_encoding_name_;
+
+ // UI state ------------------------------------------------------------------
+
+ // The state of our target_url transmissions. When we receive a request to
+ // send a URL to the browser, we set this to TARGET_INFLIGHT until an ACK
+ // comes back - if a new request comes in before the ACK, we store the new
+ // URL in pending_target_url_ and set the status to TARGET_PENDING. If an
+ // ACK comes back and we are in TARGET_PENDING, we send the stored URL and
+ // revert to TARGET_INFLIGHT.
+ //
+ // We don't need a queue of URLs to send, as only the latest is useful.
+ enum {
+ TARGET_NONE,
+ TARGET_INFLIGHT, // We have a request in-flight, waiting for an ACK
+ TARGET_PENDING // INFLIGHT + we have a URL waiting to be sent
+ } target_url_status_;
+
+ // The URL we show the user in the status bar. We use this to determine if we
+ // want to send a new one (we do not need to send duplicates). It will be
+ // equal to either |mouse_over_url_| or |focus_url_|, depending on which was
+ // updated last.
+ GURL target_url_;
+
+ // The URL the user's mouse is hovering over.
+ GURL mouse_over_url_;
+
+ // The URL that has keyboard focus.
+ GURL focus_url_;
+
+ // The next target URL we want to send to the browser.
+ GURL pending_target_url_;
+
+ // The text selection the last time DidChangeSelection got called.
+ RenderViewSelection last_selection_;
+
+ // View ----------------------------------------------------------------------
+
+ // Cache the preferred size of the page in order to prevent sending the IPC
+ // when layout() recomputes but doesn't actually change sizes.
+ gfx::Size preferred_size_;
+
+ // Used to delay determining the preferred size (to avoid intermediate
+ // states for the sizes).
+ base::OneShotTimer<RenderViewImpl> check_preferred_size_timer_;
+
+ // These store the "is main frame is scrolled all the way to the left
+ // or right" state that was last sent to the browser.
+ bool cached_is_main_frame_pinned_to_left_;
+ bool cached_is_main_frame_pinned_to_right_;
+
+ // These store the "has scrollbars" state last sent to the browser.
+ bool cached_has_main_frame_horizontal_scrollbar_;
+ bool cached_has_main_frame_vertical_scrollbar_;
+
+#if defined(OS_MACOSX)
+ // Track the fake plugin window handles allocated on the browser side for
+ // the accelerated compositor and (currently) accelerated plugins so that
+ // we can discard them when the view goes away.
+ std::set<gfx::PluginWindowHandle> fake_plugin_window_handles_;
+#endif
+
+ // Plugins -------------------------------------------------------------------
+
+ PepperPluginDelegateImpl pepper_delegate_;
+
+ // All the currently active plugin delegates for this RenderView; kept so
+ // that we can enumerate them to send updates about things like window
+ // location or tab focus and visibily. These are non-owning references.
+ std::set<WebPluginDelegateProxy*> plugin_delegates_;
+
+#if defined(OS_WIN)
+ // The ID of the focused NPAPI plug-in.
+ int focused_plugin_id_;
+#endif
+
+ // Helper objects ------------------------------------------------------------
+
+ RendererWebCookieJarImpl cookie_jar_;
+
+ // The next group of objects all implement RenderViewObserver, so are deleted
+ // along with the RenderView automatically. This is why we just store
+ // weak references.
+
+ // Holds a reference to the service which provides desktop notifications.
+ NotificationProvider* notification_provider_;
+
+ // The geolocation dispatcher attached to this view, lazily initialized.
+ GeolocationDispatcher* geolocation_dispatcher_;
+
+ // The intents dispatcher attached to this view. Not lazily initialized.
+ IntentsDispatcher* intents_dispatcher_;
+
+ // The speech dispatcher attached to this view, lazily initialized.
+ SpeechInputDispatcher* speech_input_dispatcher_;
+
+ // Device orientation dispatcher attached to this view; lazily initialized.
+ DeviceOrientationDispatcher* device_orientation_dispatcher_;
+
+ // MediaStreamImpl attached to this view; lazily initialized.
+ scoped_refptr<MediaStreamImpl> media_stream_impl_;
+
+ // Dispatches all P2P socket used by the renderer.
+ content::P2PSocketDispatcher* p2p_socket_dispatcher_;
+
+ DevToolsAgent* devtools_agent_;
+
+ RendererAccessibility* renderer_accessibility_;
+
+ // Misc ----------------------------------------------------------------------
+
+ // The current and pending file chooser completion objects. If the queue is
+ // nonempty, the first item represents the currently running file chooser
+ // callback, and the remaining elements are the other file chooser completion
+ // still waiting to be run (in order).
+ struct PendingFileChooser;
+ std::deque< linked_ptr<PendingFileChooser> > file_chooser_completions_;
+
+ // The current directory enumeration callback
+ std::map<int, WebKit::WebFileChooserCompletion*> enumeration_completions_;
+ int enumeration_completion_id_;
+
+ // The SessionStorage namespace that we're assigned to has an ID, and that ID
+ // is passed to us upon creation. WebKit asks for this ID upon first use and
+ // uses it whenever asking the browser process to allocate new storage areas.
+ int64 session_storage_namespace_id_;
+
+ // The total number of unrequested popups that exist and can be followed back
+ // to a common opener. This count is shared among all RenderViews created with
+ // createView(). All popups are treated as unrequested until specifically
+ // instructed otherwise by the Browser process.
+ scoped_refptr<SharedRenderViewCounter> shared_popup_counter_;
+
+ // Whether this is a top level window (instead of a popup). Top level windows
+ // shouldn't count against their own |shared_popup_counter_|.
+ bool decrement_shared_popup_at_destruction_;
+
+ // If the browser hasn't sent us an ACK for the last FindReply we sent
+ // to it, then we need to queue up the message (keeping only the most
+ // recent message if new ones come in).
+ scoped_ptr<IPC::Message> queued_find_reply_message_;
+
+ // Stores edit commands associated to the next key event.
+ // Shall be cleared as soon as the next key event is processed.
+ EditCommands edit_commands_;
+
+ // Allows Web UI pages (new tab page, etc.) to talk to the browser. The JS
+ // object is only exposed when Web UI bindings are enabled.
+ scoped_ptr<WebUIBindings> web_ui_bindings_;
+
+ // The external popup for the currently showing select popup.
+ scoped_ptr<ExternalPopupMenu> external_popup_menu_;
+
+ // The node that the context menu was pressed over.
+ WebKit::WebNode context_menu_node_;
+
+ // Reports load progress to the browser.
+ scoped_ptr<LoadProgressTracker> load_progress_tracker_;
+
+ // All the registered observers. We expect this list to be small, so vector
+ // is fine.
+ ObserverList<content::RenderViewObserver> observers_;
+
+ // Used to inform didChangeSelection() when it is called in the context
+ // of handling a ViewMsg_SelectRange IPC.
+ bool handling_select_range_;
+
+ // ---------------------------------------------------------------------------
+ // ADDING NEW DATA? Please see if it fits appropriately in one of the above
+ // sections rather than throwing it randomly at the end. If you're adding a
+ // bunch of stuff, you should probably create a helper class and put your
+ // data and methods on that to avoid bloating RenderView more. You can
+ // use the Observer interface to filter IPC messages and receive frame change
+ // notifications.
+ // ---------------------------------------------------------------------------
+
+ DISALLOW_COPY_AND_ASSIGN(RenderViewImpl);
+};
+
+#endif // CONTENT_RENDERER_RENDER_VIEW_IMPL_H_