summaryrefslogtreecommitdiff
path: root/chromium/content/renderer/browser_plugin/browser_plugin.h
diff options
context:
space:
mode:
authorZeno Albisser <zeno.albisser@digia.com>2013-08-15 21:46:11 +0200
committerZeno Albisser <zeno.albisser@digia.com>2013-08-15 21:46:11 +0200
commit679147eead574d186ebf3069647b4c23e8ccace6 (patch)
treefc247a0ac8ff119f7c8550879ebb6d3dd8d1ff69 /chromium/content/renderer/browser_plugin/browser_plugin.h
downloadqtwebengine-chromium-679147eead574d186ebf3069647b4c23e8ccace6.tar.gz
Initial import.
Diffstat (limited to 'chromium/content/renderer/browser_plugin/browser_plugin.h')
-rw-r--r--chromium/content/renderer/browser_plugin/browser_plugin.h376
1 files changed, 376 insertions, 0 deletions
diff --git a/chromium/content/renderer/browser_plugin/browser_plugin.h b/chromium/content/renderer/browser_plugin/browser_plugin.h
new file mode 100644
index 00000000000..89481196bec
--- /dev/null
+++ b/chromium/content/renderer/browser_plugin/browser_plugin.h
@@ -0,0 +1,376 @@
+// Copyright 2012 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_BROWSER_PLUGIN_BROWSER_PLUGIN_H_
+#define CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_
+
+#include "third_party/WebKit/public/web/WebPlugin.h"
+
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequenced_task_runner_helpers.h"
+#if defined(OS_WIN)
+#include "base/memory/shared_memory.h"
+#endif
+#include "base/values.h"
+#include "content/public/common/browser_plugin_permission_type.h"
+#include "content/renderer/browser_plugin/browser_plugin_backing_store.h"
+#include "content/renderer/browser_plugin/browser_plugin_bindings.h"
+#include "content/renderer/mouse_lock_dispatcher.h"
+#include "content/renderer/render_view_impl.h"
+#include "third_party/WebKit/public/web/WebDragStatus.h"
+
+struct BrowserPluginHostMsg_AutoSize_Params;
+struct BrowserPluginHostMsg_ResizeGuest_Params;
+struct BrowserPluginMsg_Attach_ACK_Params;
+struct BrowserPluginMsg_BuffersSwapped_Params;
+struct BrowserPluginMsg_UpdateRect_Params;
+
+namespace content {
+
+class BrowserPluginCompositingHelper;
+class BrowserPluginManager;
+class MockBrowserPlugin;
+
+class CONTENT_EXPORT BrowserPlugin :
+ NON_EXPORTED_BASE(public WebKit::WebPlugin),
+ public MouseLockDispatcher::LockTarget {
+ public:
+ RenderViewImpl* render_view() const { return render_view_.get(); }
+ int render_view_routing_id() const { return render_view_routing_id_; }
+ int guest_instance_id() const { return guest_instance_id_; }
+ bool attached() const { return attached_; }
+
+ static BrowserPlugin* FromContainer(WebKit::WebPluginContainer* container);
+
+ bool OnMessageReceived(const IPC::Message& msg);
+
+ // Update Browser Plugin's DOM Node attribute |attribute_name| with the value
+ // |attribute_value|.
+ void UpdateDOMAttribute(const std::string& attribute_name,
+ const std::string& attribute_value);
+ // Remove the DOM Node attribute with the name |attribute_name|.
+ void RemoveDOMAttribute(const std::string& attribute_name);
+ // Get Browser Plugin's DOM Node attribute |attribute_name|'s value.
+ std::string GetDOMAttributeValue(const std::string& attribute_name) const;
+ // Checks if the attribute |attribute_name| exists in the DOM.
+ bool HasDOMAttribute(const std::string& attribute_name) const;
+
+ // Get the name attribute value.
+ std::string GetNameAttribute() const;
+ // Parse the name attribute value.
+ void ParseNameAttribute();
+ // Get the src attribute value of the BrowserPlugin instance.
+ std::string GetSrcAttribute() const;
+ // Parse the src attribute value of the BrowserPlugin instance.
+ bool ParseSrcAttribute(std::string* error_message);
+ // Get the autosize attribute value.
+ bool GetAutoSizeAttribute() const;
+ // Parses the autosize attribute value.
+ void ParseAutoSizeAttribute();
+ // Get the maxheight attribute value.
+ int GetMaxHeightAttribute() const;
+ // Get the maxwidth attribute value.
+ int GetMaxWidthAttribute() const;
+ // Get the minheight attribute value.
+ int GetMinHeightAttribute() const;
+ // Get the minwidth attribute value.
+ int GetMinWidthAttribute() const;
+ // Parse the minwidth, maxwidth, minheight, and maxheight attribute values.
+ void ParseSizeContraintsChanged();
+ // The partition identifier string is stored as UTF-8.
+ std::string GetPartitionAttribute() const;
+ // This method can be successfully called only before the first navigation for
+ // this instance of BrowserPlugin. If an error occurs, the |error_message| is
+ // set appropriately to indicate the failure reason.
+ bool ParsePartitionAttribute(std::string* error_message);
+ // True if the partition attribute can be removed.
+ bool CanRemovePartitionAttribute(std::string* error_message);
+
+ bool InAutoSizeBounds(const gfx::Size& size) const;
+
+ // Get the guest's DOMWindow proxy.
+ NPObject* GetContentWindow() const;
+
+ // Returns whether the guest process has crashed.
+ bool guest_crashed() const { return guest_crashed_; }
+ // Returns whether this BrowserPlugin has requested an instance ID.
+ bool HasNavigated() const;
+ // Returns whether this BrowserPlugin has allocated an instance ID.
+ bool HasGuestInstanceID() const;
+
+ // Attaches the window identified by |window_id| to the the given node
+ // encapsulating a BrowserPlugin.
+ static bool AttachWindowTo(const WebKit::WebNode& node,
+ int window_id);
+
+ // Informs the guest of an updated focus state.
+ void UpdateGuestFocusState();
+ // Indicates whether the guest should be focused.
+ bool ShouldGuestBeFocused() const;
+
+ // Embedder's device scale factor changed, we need to update the guest
+ // renderer.
+ void UpdateDeviceScaleFactor(float device_scale_factor);
+
+ // A request to enable hardware compositing.
+ void EnableCompositing(bool enable);
+ // A request from content client to track lifetime of a JavaScript object.
+ // This is used to track permission request objects, and new window API
+ // window objects.
+ void TrackObjectLifetime(const NPVariant* request, int id);
+
+ // Returns true if |point| lies within the bounds of the plugin rectangle.
+ // Not OK to use this function for making security-sensitive decision since it
+ // can return false positives when the plugin has rotation transformation
+ // applied.
+ bool InBounds(const gfx::Point& point) const;
+
+ gfx::Point ToLocalCoordinates(const gfx::Point& point) const;
+
+ // Called when a guest instance ID has been allocated by the browser process.
+ void OnInstanceIDAllocated(int guest_instance_id);
+ // Provided that a guest instance ID has been allocated, this method attaches
+ // this BrowserPlugin instance to that guest. |extra_params| are parameters
+ // passed in by the content embedder to the browser process.
+ void Attach(scoped_ptr<base::DictionaryValue> extra_params);
+
+ // Notify the plugin about a compositor commit so that frame ACKs could be
+ // sent, if needed.
+ void DidCommitCompositorFrame();
+
+ // Returns whether a message should be forwarded to BrowserPlugin.
+ static bool ShouldForwardToBrowserPlugin(const IPC::Message& message);
+
+ // WebKit::WebPlugin implementation.
+ virtual WebKit::WebPluginContainer* container() const OVERRIDE;
+ virtual bool initialize(WebKit::WebPluginContainer* container) OVERRIDE;
+ virtual void destroy() OVERRIDE;
+ virtual NPObject* scriptableObject() OVERRIDE;
+ virtual struct _NPP* pluginNPP() OVERRIDE;
+ virtual bool supportsKeyboardFocus() const OVERRIDE;
+ virtual bool supportsEditCommands() const OVERRIDE;
+ virtual bool canProcessDrag() const OVERRIDE;
+ virtual void paint(
+ WebKit::WebCanvas* canvas,
+ const WebKit::WebRect& rect) OVERRIDE;
+ virtual void updateGeometry(
+ const WebKit::WebRect& frame_rect,
+ const WebKit::WebRect& clip_rect,
+ const WebKit::WebVector<WebKit::WebRect>& cut_outs_rects,
+ bool is_visible) OVERRIDE;
+ virtual void updateFocus(bool focused) OVERRIDE;
+ virtual void updateVisibility(bool visible) OVERRIDE;
+ virtual bool acceptsInputEvents() OVERRIDE;
+ virtual bool handleInputEvent(
+ const WebKit::WebInputEvent& event,
+ WebKit::WebCursorInfo& cursor_info) OVERRIDE;
+ virtual bool handleDragStatusUpdate(WebKit::WebDragStatus drag_status,
+ const WebKit::WebDragData& drag_data,
+ WebKit::WebDragOperationsMask mask,
+ const WebKit::WebPoint& position,
+ const WebKit::WebPoint& screen) OVERRIDE;
+ virtual void didReceiveResponse(
+ const WebKit::WebURLResponse& response) OVERRIDE;
+ virtual void didReceiveData(const char* data, int data_length) OVERRIDE;
+ virtual void didFinishLoading() OVERRIDE;
+ virtual void didFailLoading(const WebKit::WebURLError& error) OVERRIDE;
+ virtual void didFinishLoadingFrameRequest(
+ const WebKit::WebURL& url,
+ void* notify_data) OVERRIDE;
+ virtual void didFailLoadingFrameRequest(
+ const WebKit::WebURL& url,
+ void* notify_data,
+ const WebKit::WebURLError& error) OVERRIDE;
+ virtual bool executeEditCommand(const WebKit::WebString& name) OVERRIDE;
+ virtual bool executeEditCommand(const WebKit::WebString& name,
+ const WebKit::WebString& value) OVERRIDE;
+
+ // MouseLockDispatcher::LockTarget implementation.
+ virtual void OnLockMouseACK(bool succeeded) OVERRIDE;
+ virtual void OnMouseLockLost() OVERRIDE;
+ virtual bool HandleMouseLockedInputEvent(
+ const WebKit::WebMouseEvent& event) OVERRIDE;
+
+ private:
+ friend class base::DeleteHelper<BrowserPlugin>;
+ // Only the manager is allowed to create a BrowserPlugin.
+ friend class BrowserPluginManagerImpl;
+ friend class MockBrowserPluginManager;
+
+ // For unit/integration tests.
+ friend class MockBrowserPlugin;
+
+ // A BrowserPlugin object is a controller that represents an instance of a
+ // browser plugin within the embedder renderer process. Each BrowserPlugin
+ // within a RenderView has a unique instance_id that is used to track per-
+ // BrowserPlugin state in the browser process. Once a BrowserPlugin does
+ // an initial navigation or is attached to a newly created guest, it acquires
+ // a guest_instance_id as well. The guest instance ID uniquely identifies a
+ // guest WebContents that's hosted by this BrowserPlugin.
+ BrowserPlugin(
+ RenderViewImpl* render_view,
+ WebKit::WebFrame* frame,
+ const WebKit::WebPluginParams& params);
+
+ virtual ~BrowserPlugin();
+
+ int width() const { return plugin_rect_.width(); }
+ int height() const { return plugin_rect_.height(); }
+ gfx::Rect plugin_rect() { return plugin_rect_; }
+ // Gets the Max Height value used for auto size.
+ int GetAdjustedMaxHeight() const;
+ // Gets the Max Width value used for auto size.
+ int GetAdjustedMaxWidth() const;
+ // Gets the Min Height value used for auto size.
+ int GetAdjustedMinHeight() const;
+ // Gets the Min Width value used for auto size.
+ int GetAdjustedMinWidth() const;
+ BrowserPluginManager* browser_plugin_manager() const {
+ return browser_plugin_manager_.get();
+ }
+
+ // Virtual to allow for mocking in tests.
+ virtual float GetDeviceScaleFactor() const;
+
+ void ShowSadGraphic();
+
+ // Parses the attributes of the browser plugin from the element's attributes
+ // and sets them appropriately.
+ void ParseAttributes();
+
+ // Triggers the event-listeners for |event_name|. Note that the function
+ // frees all the values in |props|.
+ void TriggerEvent(const std::string& event_name,
+ std::map<std::string, base::Value*>* props);
+
+ // Creates and maps a shared damage buffer.
+ virtual base::SharedMemory* CreateDamageBuffer(
+ const size_t size,
+ base::SharedMemoryHandle* shared_memory_handle);
+ // Swaps out the |current_damage_buffer_| with the |pending_damage_buffer_|.
+ void SwapDamageBuffers();
+
+ // Populates BrowserPluginHostMsg_ResizeGuest_Params with resize state and
+ // allocates a new |pending_damage_buffer_| if in software rendering mode.
+ void PopulateResizeGuestParameters(
+ BrowserPluginHostMsg_ResizeGuest_Params* params,
+ const gfx::Rect& view_size);
+
+ // Populates BrowserPluginHostMsg_AutoSize_Params object with autosize state.
+ void PopulateAutoSizeParameters(
+ BrowserPluginHostMsg_AutoSize_Params* params, bool current_auto_size);
+
+ // Populates both AutoSize and ResizeGuest parameters based on the current
+ // autosize state.
+ void GetDamageBufferWithSizeParams(
+ BrowserPluginHostMsg_AutoSize_Params* auto_size_params,
+ BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params);
+
+ // Informs the guest of an updated autosize state.
+ void UpdateGuestAutoSizeState(bool current_auto_size);
+
+ // Indicates whether a damage buffer was used by the guest process for the
+ // provided |params|.
+ static bool UsesDamageBuffer(
+ const BrowserPluginMsg_UpdateRect_Params& params);
+
+ // Indicates whether the |pending_damage_buffer_| was used to copy over pixels
+ // given the provided |params|.
+ bool UsesPendingDamageBuffer(
+ const BrowserPluginMsg_UpdateRect_Params& params);
+
+ // Called when the tracked object of |id| ID becomes unreachable in
+ // JavaScript.
+ void OnTrackedObjectGarbageCollected(int id);
+ // V8 garbage collection callback for |object|.
+ static void WeakCallbackForTrackedObject(v8::Isolate* isolate,
+ v8::Persistent<v8::Value>* object,
+ void* param);
+
+ // IPC message handlers.
+ // Please keep in alphabetical order.
+ void OnAdvanceFocus(int instance_id, bool reverse);
+ void OnAttachACK(int instance_id,
+ const BrowserPluginMsg_Attach_ACK_Params& ack_params);
+ void OnBuffersSwapped(int instance_id,
+ const BrowserPluginMsg_BuffersSwapped_Params& params);
+ void OnCompositorFrameSwapped(const IPC::Message& message);
+ void OnGuestContentWindowReady(int instance_id,
+ int content_window_routing_id);
+ void OnGuestGone(int instance_id);
+ void OnSetCursor(int instance_id, const WebCursor& cursor);
+ void OnSetMouseLock(int instance_id, bool enable);
+ void OnShouldAcceptTouchEvents(int instance_id, bool accept);
+ void OnUpdatedName(int instance_id, const std::string& name);
+ void OnUpdateRect(int instance_id,
+ const BrowserPluginMsg_UpdateRect_Params& params);
+
+ // This is the browser-process-allocated instance ID that uniquely identifies
+ // a guest WebContents.
+ int guest_instance_id_;
+ // This indicates whether this BrowserPlugin has been attached to a
+ // WebContents.
+ bool attached_;
+ base::WeakPtr<RenderViewImpl> render_view_;
+ // We cache the |render_view_|'s routing ID because we need it on destruction.
+ // If the |render_view_| is destroyed before the BrowserPlugin is destroyed
+ // then we will attempt to access a NULL pointer.
+ int render_view_routing_id_;
+ WebKit::WebPluginContainer* container_;
+ scoped_ptr<BrowserPluginBindings> bindings_;
+ scoped_ptr<BrowserPluginBackingStore> backing_store_;
+ scoped_ptr<base::SharedMemory> current_damage_buffer_;
+ scoped_ptr<base::SharedMemory> pending_damage_buffer_;
+ uint32 damage_buffer_sequence_id_;
+ bool resize_ack_received_;
+ gfx::Rect plugin_rect_;
+ float last_device_scale_factor_;
+ // Bitmap for crashed plugin. Lazily initialized, non-owning pointer.
+ SkBitmap* sad_guest_;
+ bool guest_crashed_;
+ scoped_ptr<BrowserPluginHostMsg_ResizeGuest_Params> pending_resize_params_;
+ bool auto_size_ack_pending_;
+ std::string storage_partition_id_;
+ bool persist_storage_;
+ bool valid_partition_id_;
+ int content_window_routing_id_;
+ bool plugin_focused_;
+ // Tracks the visibility of the browser plugin regardless of the whole
+ // embedder RenderView's visibility.
+ bool visible_;
+
+ WebCursor cursor_;
+
+ gfx::Size last_view_size_;
+ bool before_first_navigation_;
+ bool mouse_locked_;
+
+ typedef std::pair<int, base::WeakPtr<BrowserPlugin> > TrackedV8ObjectID;
+ std::map<int, TrackedV8ObjectID*> tracked_v8_objects_;
+
+ // BrowserPlugin outlives RenderViewImpl in Chrome Apps and so we need to
+ // store the BrowserPlugin's BrowserPluginManager in a member variable to
+ // avoid accessing the RenderViewImpl.
+ scoped_refptr<BrowserPluginManager> browser_plugin_manager_;
+
+ // Used for HW compositing.
+ bool compositing_enabled_;
+ scoped_refptr<BrowserPluginCompositingHelper> compositing_helper_;
+
+ // Used to identify the plugin to WebBindings.
+ scoped_ptr<struct _NPP> npp_;
+
+ // Weak factory used in v8 |MakeWeak| callback, since the v8 callback might
+ // get called after BrowserPlugin has been destroyed.
+ base::WeakPtrFactory<BrowserPlugin> weak_ptr_factory_;
+
+ std::vector<EditCommand> edit_commands_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserPlugin);
+};
+
+} // namespace content
+
+#endif // CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_H_