Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(505)

Unified Diff: content/browser/browser_plugin/browser_plugin_host.h

Issue 10560022: Browser Plugin: New Implementation (Browser Side) (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Added browser test + Fixed a silly initial loading bug :-) Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/browser_plugin/browser_plugin_host.h
diff --git a/content/browser/browser_plugin/browser_plugin_host.h b/content/browser/browser_plugin/browser_plugin_host.h
new file mode 100644
index 0000000000000000000000000000000000000000..73b839941162118e503edfcec465349096c37439
--- /dev/null
+++ b/content/browser/browser_plugin/browser_plugin_host.h
@@ -0,0 +1,184 @@
+// Copyright (c) 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_BROWSER_BROWSER_PLUGIN_BROWSER_PLUGIN_HOST_H__
+#define CONTENT_BROWSER_BROWSER_PLUGIN_BROWSER_PLUGIN_HOST_H__
+
+#include <map>
+
+#include "base/compiler_specific.h"
+#include "base/id_map.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "ppapi/c/pp_instance.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
+#include "ui/gfx/rect.h"
+#include "ui/gfx/size.h"
+#include "ui/surface/transport_dib.h"
+#include "webkit/glue/webcursor.h"
+
+class WebContentsImpl;
+struct BrowserPluginHostMsg_PostMessage_Params;
+struct ViewHostMsg_UpdateRect_Params;
+
+namespace IPC {
+struct ChannelHandle;
+}
+
+namespace content {
+
+class BrowserPluginHost;
+class RenderProcessHost;
+class RenderWidgetHostView;
+
+typedef std::map<WebContents*, int64> GuestMap;
+typedef std::map<int, BrowserPluginHost*> ContainerInstanceMap;
+
+// A BrowserPluginHost object is used by both embedders and guests.
Charlie Reis 2012/08/13 17:50:14 I still think having the BrowserPluginHost act as
+// The primary purpose of BrowserPluginHost is to allow an embedder
+// to manage the lifetime of its guests. It cleans up its guests
+// on navigation, crashes, and "hides" guests when it hides.
+// For the guest, BrowserPluginHost keeps track of its embedder,
+// and its BrowserPlugin instance ID.
+class BrowserPluginHost : public WebContentsObserver,
+ public NotificationObserver,
+ public WebContentsDelegate {
+ public:
+ // BrowserPluginHost is owned by a WebContentsImpl. Here it takes in its
+ // owner. The owner can be either a guest or embedder WebContents.
+ explicit BrowserPluginHost(WebContentsImpl* web_contents);
+
+ virtual ~BrowserPluginHost();
+
+ // This is called on navigation of the browser plugin. On the first
+ // navigation, it creates a new WebContentsImpl for the guest, associates
+ // it with its embedder, and navigates it to the src URL. On subsequent
+ // navigations, it calls up the guest's existign WebContents and navigates
+ // it.
+ void NavigateOrCreateGuest(RenderViewHost* render_view_host,
Charlie Reis 2012/08/13 17:50:14 I had asked this to be renamed to NavigateGuest in
Fady Samuel 2012/08/13 21:30:08 Ohh sorry, it looks like I missed addressing that
+ int instance_id,
+ long long frame_id,
+ const std::string& src,
+ const gfx::Size& size);
+
+ // This is called when the browser plugin's container has resized in the
+ // embedder. In additon to specifying the new size, and new scale factor,
+ // it also passes a TransportDIB that is shared with the embedder.
+ // The browser process is free to write to this buffer whenever it receives
+ // damage from the guest because if it receives damage from the guest,
+ // then the previous damage has already been accessed and ACK'ed by the
+ // embedder.
+ void ResizeGuest(int instance_id,
+ TransportDIB* damage_buffer,
+ int width,
+ int height,
+ bool resize_pending,
+ float scale_factor);
+
+ void UpdateRect(RenderViewHost* render_view_host,
+ const ViewHostMsg_UpdateRect_Params& params);
+
+ // Called on the guest BrowserPluginHost.
+ void UpdateRectACK(int message_id, const gfx::Size& size);
+ void HandleInputEvent(RenderViewHost* render_view_host,
+ const gfx::Rect& guest_rect,
+ const WebKit::WebInputEvent& event,
+ IPC::Message* reply_message);
+ void HandleInputEventAck(RenderViewHost* render_view_host, bool handled);
+ void SetFocus(bool focused);
+ void ShowWidget(RenderViewHost* render_view_host,
+ int route_id,
+ const gfx::Rect& initial_pos);
+ void SetCursor(const WebCursor& cursor);
+
+ RenderProcessHost* embedder_render_process_host() const {
+ return embedder_render_process_host_;
Charlie Reis 2012/08/13 17:50:14 Why do we need to cache this? Is it present for b
Fady Samuel 2012/08/13 21:30:08 This is used to talk back to the embedder.
+ }
+ int instance_id() const { return instance_id_; }
Charlie Reis 2012/08/13 17:50:14 This is important enough that it needs a comment i
+ void SetDamageBuffer(TransportDIB* damage_buffer,
+ const gfx::Size& size,
+ float scale_factor);
+ TransportDIB* damage_buffer() const { return damage_buffer_; }
+ const gfx::Size& damage_buffer_size() const { return damage_buffer_size_; }
+ float damage_buffer_scale_factor() const {
+ return damage_buffer_scale_factor_;
+ }
+
+ const ContainerInstanceMap& guests_for_testing() const {
+ return guests_by_instance_id_;
+ }
+
+ protected:
+ friend class BrowserPluginHostHelper;
+ friend class BrowserPluginHostTest;
+
+ // Get a guest BrowserPluginHost by its container ID specified
+ // in BrowserPlugin.
+ BrowserPluginHost* GetGuestByInstanceID(int container_id) const;
Charlie Reis 2012/08/13 17:50:14 Why is it called ByInstanceID if you're passing in
Fady Samuel 2012/08/13 21:30:08 I used to call this container_id then I renamed it
+
+ // An embedder BrowserPluginHost keeps track of
+ // its guests so that if it navigates away, its associated RenderView
+ // crashes or it is hidden, it takes appropriate action on the guest.
+ void AddGuest(int instance_id, BrowserPluginHost* guest, int64 frame_id);
+
+ void set_embedder_render_process_host(
+ RenderProcessHost* embedder_render_process_host) {
+ embedder_render_process_host_ = embedder_render_process_host;
+ }
+ void set_instance_id(int instance_id) { instance_id_ = instance_id; }
Charlie Reis 2012/08/13 17:50:14 Can this change over time? I would recommend sett
+
+ void DestroyGuests();
+ // Destroy a specific guest if possible. This is a no-op if the guest id is
+ // unknown as we may already have removed it for a different reason.
+ void DestroyGuestByInstanceID(int instance_id);
+
+ // WebContentsDelegate implementation.
+ virtual bool TakeFocus(bool reverse) OVERRIDE;
+ virtual void RendererUnresponsive(WebContents* source) OVERRIDE;
+
+ // WebContentsObserver implementation.
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+ // Used to monitor frame navigation to cleanup guests when a frame navigates
+ // away from the browser plugin it's hosting.
+ virtual void DidCommitProvisionalLoadForFrame(
+ int64 frame_id,
+ bool is_main_frame,
+ const GURL& url,
+ PageTransition transition_type,
+ RenderViewHost* render_view_host) OVERRIDE;
+ virtual void RenderViewDeleted(RenderViewHost* render_view_host) OVERRIDE;
+ virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE;
+
+ // NotificationObserver method override.
+ virtual void Observe(int type,
+ const NotificationSource& source,
+ const NotificationDetails& details) OVERRIDE;
+
+ // A scoped container for notification registries.
+ NotificationRegistrar registrar_;
+ RenderProcessHost* embedder_render_process_host_;
+ std::string embedder_channel_name_;
+ // An identifier that uniquely identifies a browser plugin container
+ // within an embedder.
+ int instance_id_;
+ TransportDIB* damage_buffer_;
+ gfx::Size damage_buffer_size_;
+ float damage_buffer_scale_factor_;
+ GuestMap guests_;
+ ContainerInstanceMap guests_by_instance_id_;
+
+ IDMap<RenderViewHost> pending_updates_;
+ int pending_update_counter_;
+ scoped_ptr<IPC::Message> pending_input_event_reply_;
+ gfx::Rect guest_rect_;
+ WebCursor cursor_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserPluginHost);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_BROWSER_PLUGIN_OLD_BROWSER_PLUGIN_HOST_H_

Powered by Google App Engine
This is Rietveld 408576698