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

Unified Diff: content/renderer/browser_plugin/browser_plugin_impl.cc

Issue 11826005: Browser Plugin: Implement BrowserPluginObserver. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge with ToT Created 7 years, 10 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/renderer/browser_plugin/browser_plugin_impl.cc
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin_impl.cc
similarity index 80%
rename from content/renderer/browser_plugin/browser_plugin.cc
rename to content/renderer/browser_plugin/browser_plugin_impl.cc
index 573ff76bb1de82c478ea0952b5e622681b2d0175..716a6927a2662ecd1859266d68fc98e357b18aa6 100644
--- a/content/renderer/browser_plugin/browser_plugin.cc
+++ b/content/renderer/browser_plugin/browser_plugin_impl.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "content/renderer/browser_plugin/browser_plugin.h"
+#include "content/renderer/browser_plugin/browser_plugin_impl.h"
#include "base/json/json_string_value_serializer.h"
#include "base/message_loop.h"
@@ -12,6 +12,7 @@
#include "content/common/browser_plugin_messages.h"
#include "content/common/view_messages.h"
#include "content/public/common/content_client.h"
+#include "content/public/renderer/browser_plugin/browser_plugin_observer.h"
#include "content/public/renderer/content_renderer_client.h"
#include "content/renderer/browser_plugin/browser_plugin_bindings.h"
#include "content/renderer/browser_plugin/browser_plugin_compositing_helper.h"
@@ -72,7 +73,7 @@ static std::string GetInternalEventName(const char* event_name) {
}
} // namespace
-BrowserPlugin::BrowserPlugin(
+BrowserPluginImpl::BrowserPluginImpl(
RenderViewImpl* render_view,
WebKit::WebFrame* frame,
const WebPluginParams& params)
@@ -101,9 +102,10 @@ BrowserPlugin::BrowserPlugin(
compositing_enabled_(false),
ALLOW_THIS_IN_INITIALIZER_LIST(
weak_ptr_factory_(this)) {
+ GetContentClient()->renderer()->BrowserPluginCreated(this);
}
-BrowserPlugin::~BrowserPlugin() {
+BrowserPluginImpl::~BrowserPluginImpl() {
// If the BrowserPlugin has never navigated then the browser process and
// BrowserPluginManager don't know about it and so there is nothing to do
// here.
@@ -115,11 +117,20 @@ BrowserPlugin::~BrowserPlugin() {
instance_id_));
}
-bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) {
+void BrowserPluginImpl::AddObserver(BrowserPluginObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void BrowserPluginImpl::RemoveObserver(BrowserPluginObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
+
+bool BrowserPluginImpl::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
- IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message)
+ IPC_BEGIN_MESSAGE_MAP(BrowserPluginImpl, message)
IPC_MESSAGE_HANDLER(BrowserPluginMsg_AdvanceFocus, OnAdvanceFocus)
IPC_MESSAGE_HANDLER(BrowserPluginMsg_BuffersSwapped, OnBuffersSwapped)
+ IPC_MESSAGE_HANDLER(BrowserPluginMsg_ForwardMessage, OnForwardMessage)
IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestContentWindowReady,
OnGuestContentWindowReady)
IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestGone, OnGuestGone)
@@ -141,98 +152,57 @@ bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) {
return handled;
}
-void BrowserPlugin::UpdateDOMAttribute(const std::string& attribute_name,
- const std::string& attribute_value) {
- if (!container())
- return;
-
- WebKit::WebElement element = container()->element();
- WebKit::WebString web_attribute_name =
- WebKit::WebString::fromUTF8(attribute_name);
- if (!HasDOMAttribute(attribute_name) ||
- (std::string(element.getAttribute(web_attribute_name).utf8()) !=
- attribute_value)) {
- element.setAttribute(web_attribute_name,
- WebKit::WebString::fromUTF8(attribute_value));
- }
-}
-
-void BrowserPlugin::RemoveDOMAttribute(const std::string& attribute_name) {
- if (!container())
- return;
-
- container()->element().removeAttribute(
- WebKit::WebString::fromUTF8(attribute_name));
-}
-
-std::string BrowserPlugin::GetDOMAttributeValue(
- const std::string& attribute_name) const {
- if (!container())
- return "";
-
- return container()->element().getAttribute(
- WebKit::WebString::fromUTF8(attribute_name)).utf8();
-}
-
-bool BrowserPlugin::HasDOMAttribute(const std::string& attribute_name) const {
- if (!container())
- return false;
-
- return container()->element().hasAttribute(
- WebKit::WebString::fromUTF8(attribute_name));
-}
-
-std::string BrowserPlugin::GetNameAttribute() const {
+std::string BrowserPluginImpl::GetNameAttribute() const {
return GetDOMAttributeValue(browser_plugin::kAttributeName);
}
-std::string BrowserPlugin::GetSrcAttribute() const {
+std::string BrowserPluginImpl::GetSrcAttribute() const {
return GetDOMAttributeValue(browser_plugin::kAttributeSrc);
}
-bool BrowserPlugin::GetAutoSizeAttribute() const {
+bool BrowserPluginImpl::GetAutoSizeAttribute() const {
return HasDOMAttribute(browser_plugin::kAttributeAutoSize);
}
-int BrowserPlugin::GetMaxHeightAttribute() const {
+int BrowserPluginImpl::GetMaxHeightAttribute() const {
int max_height;
base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxHeight),
&max_height);
return max_height;
}
-int BrowserPlugin::GetMaxWidthAttribute() const {
+int BrowserPluginImpl::GetMaxWidthAttribute() const {
int max_width;
base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMaxWidth),
&max_width);
return max_width;
}
-int BrowserPlugin::GetMinHeightAttribute() const {
+int BrowserPluginImpl::GetMinHeightAttribute() const {
int min_height;
base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinHeight),
&min_height);
return min_height;
}
-int BrowserPlugin::GetMinWidthAttribute() const {
+int BrowserPluginImpl::GetMinWidthAttribute() const {
int min_width;
base::StringToInt(GetDOMAttributeValue(browser_plugin::kAttributeMinWidth),
&min_width);
return min_width;
}
-int BrowserPlugin::GetAdjustedMaxHeight() const {
+int BrowserPluginImpl::GetAdjustedMaxHeight() const {
int max_height = GetMaxHeightAttribute();
return max_height ? max_height : height();
}
-int BrowserPlugin::GetAdjustedMaxWidth() const {
+int BrowserPluginImpl::GetAdjustedMaxWidth() const {
int max_width = GetMaxWidthAttribute();
return max_width ? max_width : width();
}
-int BrowserPlugin::GetAdjustedMinHeight() const {
+int BrowserPluginImpl::GetAdjustedMinHeight() const {
int min_height = GetMinHeightAttribute();
// FrameView.cpp does not allow this value to be <= 0, so when the value is
// unset (or set to 0), we set it to the container size.
@@ -241,7 +211,7 @@ int BrowserPlugin::GetAdjustedMinHeight() const {
return std::min(min_height, GetAdjustedMaxHeight());
}
-int BrowserPlugin::GetAdjustedMinWidth() const {
+int BrowserPluginImpl::GetAdjustedMinWidth() const {
int min_width = GetMinWidthAttribute();
// FrameView.cpp does not allow this value to be <= 0, so when the value is
// unset (or set to 0), we set it to the container size.
@@ -250,11 +220,11 @@ int BrowserPlugin::GetAdjustedMinWidth() const {
return std::min(min_width, GetAdjustedMaxWidth());
}
-std::string BrowserPlugin::GetPartitionAttribute() const {
+std::string BrowserPluginImpl::GetPartitionAttribute() const {
return GetDOMAttributeValue(browser_plugin::kAttributePartition);
}
-void BrowserPlugin::ParseNameAttribute() {
+void BrowserPluginImpl::ParseNameAttribute() {
if (!navigate_src_sent_)
return;
browser_plugin_manager()->Send(
@@ -263,7 +233,7 @@ void BrowserPlugin::ParseNameAttribute() {
GetNameAttribute()));
}
-bool BrowserPlugin::ParseSrcAttribute(std::string* error_message) {
+bool BrowserPluginImpl::ParseSrcAttribute(std::string* error_message) {
if (!valid_partition_id_) {
*error_message = browser_plugin::kErrorInvalidPartition;
return false;
@@ -299,13 +269,13 @@ bool BrowserPlugin::ParseSrcAttribute(std::string* error_message) {
return true;
}
-void BrowserPlugin::ParseAutoSizeAttribute() {
+void BrowserPluginImpl::ParseAutoSizeAttribute() {
auto_size_ack_pending_ = true;
last_view_size_ = plugin_rect_.size();
UpdateGuestAutoSizeState(GetAutoSizeAttribute());
}
-void BrowserPlugin::PopulateAutoSizeParameters(
+void BrowserPluginImpl::PopulateAutoSizeParameters(
BrowserPluginHostMsg_AutoSize_Params* params, bool current_auto_size) {
params->enable = current_auto_size;
// No need to populate the params if autosize is off.
@@ -315,10 +285,10 @@ void BrowserPlugin::PopulateAutoSizeParameters(
}
}
-void BrowserPlugin::UpdateGuestAutoSizeState(bool current_auto_size) {
+void BrowserPluginImpl::UpdateGuestAutoSizeState(bool current_auto_size) {
// If we haven't yet heard back from the guest about the last resize request,
// then we don't issue another request until we do in
- // BrowserPlugin::UpdateRect.
+ // BrowserPluginImpl::UpdateRect.
if (!navigate_src_sent_ || !resize_ack_received_)
return;
BrowserPluginHostMsg_AutoSize_Params auto_size_params;
@@ -336,7 +306,8 @@ void BrowserPlugin::UpdateGuestAutoSizeState(bool current_auto_size) {
resize_guest_params));
}
-void BrowserPlugin::SizeChangedDueToAutoSize(const gfx::Size& old_view_size) {
+void BrowserPluginImpl::SizeChangedDueToAutoSize(
+ const gfx::Size& old_view_size) {
size_changed_in_flight_ = false;
std::map<std::string, base::Value*> props;
@@ -352,19 +323,19 @@ void BrowserPlugin::SizeChangedDueToAutoSize(const gfx::Size& old_view_size) {
}
// static
-bool BrowserPlugin::UsesDamageBuffer(
+bool BrowserPluginImpl::UsesDamageBuffer(
const BrowserPluginMsg_UpdateRect_Params& params) {
return params.damage_buffer_sequence_id != 0 || params.needs_ack;
}
-bool BrowserPlugin::UsesPendingDamageBuffer(
+bool BrowserPluginImpl::UsesPendingDamageBuffer(
const BrowserPluginMsg_UpdateRect_Params& params) {
if (!pending_damage_buffer_.get())
return false;
return damage_buffer_sequence_id_ == params.damage_buffer_sequence_id;
}
-void BrowserPlugin::SetInstanceID(int instance_id) {
+void BrowserPluginImpl::SetInstanceID(int instance_id) {
CHECK(instance_id != browser_plugin::kInstanceIDNone);
instance_id_ = instance_id;
browser_plugin_manager()->AddBrowserPlugin(instance_id, this);
@@ -389,16 +360,16 @@ void BrowserPlugin::SetInstanceID(int instance_id) {
navigate_src_sent_ = true;
}
-void BrowserPlugin::OnAdvanceFocus(int instance_id, bool reverse) {
+void BrowserPluginImpl::OnAdvanceFocus(int instance_id, bool reverse) {
DCHECK(render_view_);
render_view_->GetWebView()->advanceFocus(reverse);
}
-void BrowserPlugin::OnBuffersSwapped(int instance_id,
- const gfx::Size& size,
- std::string mailbox_name,
- int gpu_route_id,
- int gpu_host_id) {
+void BrowserPluginImpl::OnBuffersSwapped(int instance_id,
+ const gfx::Size& size,
+ std::string mailbox_name,
+ int gpu_route_id,
+ int gpu_host_id) {
DCHECK(instance_id == instance_id_);
EnableCompositing(true);
@@ -408,13 +379,28 @@ void BrowserPlugin::OnBuffersSwapped(int instance_id,
gpu_host_id);
}
-void BrowserPlugin::OnGuestContentWindowReady(int instance_id,
- int content_window_routing_id) {
+void BrowserPluginImpl::OnForwardMessage(int instance_id,
+ const IPC::Message& msg) {
+ if (!observers_.might_have_observers())
+ return;
+ ObserverListBase<BrowserPluginObserver>::Iterator it(observers_);
+ BrowserPluginObserver* observer;
+ while ((observer = it.GetNext()) != NULL) {
+ if (observer->OnMessageReceived(msg))
+ return;
+ }
+}
+
+void BrowserPluginImpl::OnGuestContentWindowReady(
+ int instance_id,
+ int content_window_routing_id) {
DCHECK(content_window_routing_id != MSG_ROUTING_NONE);
content_window_routing_id_ = content_window_routing_id;
}
-void BrowserPlugin::OnGuestGone(int instance_id, int process_id, int status) {
+void BrowserPluginImpl::OnGuestGone(int instance_id,
+ int process_id,
+ int status) {
// Set the BrowserPlugin in a crashed state before firing event listeners so
// that operations on the BrowserPlugin within listeners are aware that
// BrowserPlugin is in a crashed state.
@@ -430,7 +416,7 @@ void BrowserPlugin::OnGuestGone(int instance_id, int process_id, int status) {
// Event listeners may remove the BrowserPlugin from the document. If that
// happens, the BrowserPlugin will be scheduled for later deletion (see
- // BrowserPlugin::destroy()). That will clear the container_ reference,
+ // BrowserPluginImpl::destroy()). That will clear the container_ reference,
// but leave other member variables valid below.
TriggerEvent(browser_plugin::kEventExit, &props);
@@ -445,22 +431,22 @@ void BrowserPlugin::OnGuestGone(int instance_id, int process_id, int status) {
EnableCompositing(false);
}
-void BrowserPlugin::OnGuestResponsive(int instance_id, int process_id) {
+void BrowserPluginImpl::OnGuestResponsive(int instance_id, int process_id) {
std::map<std::string, base::Value*> props;
props[browser_plugin::kProcessId] = new base::FundamentalValue(process_id);
TriggerEvent(browser_plugin::kEventResponsive, &props);
}
-void BrowserPlugin::OnGuestUnresponsive(int instance_id, int process_id) {
+void BrowserPluginImpl::OnGuestUnresponsive(int instance_id, int process_id) {
std::map<std::string, base::Value*> props;
props[browser_plugin::kProcessId] = new base::FundamentalValue(process_id);
TriggerEvent(browser_plugin::kEventUnresponsive, &props);
}
-void BrowserPlugin::OnLoadAbort(int instance_id,
- const GURL& url,
- bool is_top_level,
- const std::string& type) {
+void BrowserPluginImpl::OnLoadAbort(int instance_id,
+ const GURL& url,
+ bool is_top_level,
+ const std::string& type) {
std::map<std::string, base::Value*> props;
props[browser_plugin::kURL] = new base::StringValue(url.spec());
props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level);
@@ -468,7 +454,7 @@ void BrowserPlugin::OnLoadAbort(int instance_id,
TriggerEvent(browser_plugin::kEventLoadAbort, &props);
}
-void BrowserPlugin::OnLoadCommit(
+void BrowserPluginImpl::OnLoadCommit(
int instance_id,
const BrowserPluginMsg_LoadCommit_Params& params) {
// If the guest has just committed a new navigation then it is no longer
@@ -489,10 +475,10 @@ void BrowserPlugin::OnLoadCommit(
TriggerEvent(browser_plugin::kEventLoadCommit, &props);
}
-void BrowserPlugin::OnLoadRedirect(int instance_id,
- const GURL& old_url,
- const GURL& new_url,
- bool is_top_level) {
+void BrowserPluginImpl::OnLoadRedirect(int instance_id,
+ const GURL& old_url,
+ const GURL& new_url,
+ bool is_top_level) {
std::map<std::string, base::Value*> props;
props[browser_plugin::kOldURL] = new base::StringValue(old_url.spec());
props[browser_plugin::kNewURL] = new base::StringValue(new_url.spec());
@@ -500,9 +486,9 @@ void BrowserPlugin::OnLoadRedirect(int instance_id,
TriggerEvent(browser_plugin::kEventLoadRedirect, &props);
}
-void BrowserPlugin::OnLoadStart(int instance_id,
- const GURL& url,
- bool is_top_level) {
+void BrowserPluginImpl::OnLoadStart(int instance_id,
+ const GURL& url,
+ bool is_top_level) {
std::map<std::string, base::Value*> props;
props[browser_plugin::kURL] = new base::StringValue(url.spec());
props[browser_plugin::kIsTopLevel] = new base::FundamentalValue(is_top_level);
@@ -510,11 +496,11 @@ void BrowserPlugin::OnLoadStart(int instance_id,
TriggerEvent(browser_plugin::kEventLoadStart, &props);
}
-void BrowserPlugin::OnLoadStop(int instance_id) {
+void BrowserPluginImpl::OnLoadStop(int instance_id) {
TriggerEvent(browser_plugin::kEventLoadStop, NULL);
}
-void BrowserPlugin::OnRequestPermission(
+void BrowserPluginImpl::OnRequestPermission(
int instance_id,
BrowserPluginPermissionType permission_type,
int request_id,
@@ -523,11 +509,12 @@ void BrowserPlugin::OnRequestPermission(
RequestMediaPermission(request_id, request_info);
}
-void BrowserPlugin::OnSetCursor(int instance_id, const WebCursor& cursor) {
+void BrowserPluginImpl::OnSetCursor(int instance_id, const WebCursor& cursor) {
cursor_ = cursor;
}
-void BrowserPlugin::OnShouldAcceptTouchEvents(int instance_id, bool accept) {
+void BrowserPluginImpl::OnShouldAcceptTouchEvents(int instance_id,
+ bool accept) {
if (container()) {
container()->requestTouchEventType(accept ?
WebKit::WebPluginContainer::TouchEventRequestTypeRaw :
@@ -535,11 +522,12 @@ void BrowserPlugin::OnShouldAcceptTouchEvents(int instance_id, bool accept) {
}
}
-void BrowserPlugin::OnUpdatedName(int instance_id, const std::string& name) {
+void BrowserPluginImpl::OnUpdatedName(int instance_id,
+ const std::string& name) {
UpdateDOMAttribute(browser_plugin::kAttributeName, name);
}
-void BrowserPlugin::RequestMediaPermission(
+void BrowserPluginImpl::RequestMediaPermission(
int request_id, const base::DictionaryValue& request_info) {
if (!HasEventListeners(browser_plugin::kEventRequestPermission)) {
// Automatically deny the request if there are no event listeners for
@@ -568,7 +556,7 @@ void BrowserPlugin::RequestMediaPermission(
TriggerEvent(browser_plugin::kEventRequestPermission, &props);
}
-bool BrowserPlugin::HasEventListeners(const std::string& event_name) {
+bool BrowserPluginImpl::HasEventListeners(const std::string& event_name) {
if (!container())
return false;
@@ -588,7 +576,7 @@ bool BrowserPlugin::HasEventListeners(const std::string& event_name) {
return false;
}
-void BrowserPlugin::OnUpdateRect(
+void BrowserPluginImpl::OnUpdateRect(
int instance_id,
const BrowserPluginMsg_UpdateRect_Params& params) {
bool use_new_damage_buffer = !backing_store_;
@@ -665,7 +653,7 @@ void BrowserPlugin::OnUpdateRect(
size_changed_in_flight_ = true;
MessageLoop::current()->PostTask(
FROM_HERE,
- base::Bind(&BrowserPlugin::SizeChangedDueToAutoSize,
+ base::Bind(&BrowserPluginImpl::SizeChangedDueToAutoSize,
base::Unretained(this),
old_view_size));
}
@@ -716,18 +704,18 @@ void BrowserPlugin::OnUpdateRect(
resize_guest_params));
}
-void BrowserPlugin::ParseSizeContraintsChanged() {
+void BrowserPluginImpl::ParseSizeContraintsChanged() {
bool auto_size = GetAutoSizeAttribute();
if (auto_size)
UpdateGuestAutoSizeState(true);
}
-bool BrowserPlugin::InAutoSizeBounds(const gfx::Size& size) const {
+bool BrowserPluginImpl::InAutoSizeBounds(const gfx::Size& size) const {
return size.width() <= GetAdjustedMaxWidth() &&
size.height() <= GetAdjustedMaxHeight();
}
-NPObject* BrowserPlugin::GetContentWindow() const {
+NPObject* BrowserPluginImpl::GetContentWindow() const {
if (content_window_routing_id_ == MSG_ROUTING_NONE)
return NULL;
RenderViewImpl* guest_render_view = static_cast<RenderViewImpl*>(
@@ -738,16 +726,16 @@ NPObject* BrowserPlugin::GetContentWindow() const {
return guest_frame->windowObject();
}
-bool BrowserPlugin::CanGoBack() const {
+bool BrowserPluginImpl::CanGoBack() const {
return nav_entry_count_ > 1 && current_nav_entry_index_ > 0;
}
-bool BrowserPlugin::CanGoForward() const {
+bool BrowserPluginImpl::CanGoForward() const {
return current_nav_entry_index_ >= 0 &&
current_nav_entry_index_ < (nav_entry_count_ - 1);
}
-bool BrowserPlugin::ParsePartitionAttribute(std::string* error_message) {
+bool BrowserPluginImpl::ParsePartitionAttribute(std::string* error_message) {
if (allocate_instance_id_sent_) {
*error_message = browser_plugin::kErrorAlreadyNavigated;
return false;
@@ -779,13 +767,14 @@ bool BrowserPlugin::ParsePartitionAttribute(std::string* error_message) {
return true;
}
-bool BrowserPlugin::CanRemovePartitionAttribute(std::string* error_message) {
+bool BrowserPluginImpl::CanRemovePartitionAttribute(
+ std::string* error_message) {
if (navigate_src_sent_)
*error_message = browser_plugin::kErrorCannotRemovePartition;
return !navigate_src_sent_;
}
-void BrowserPlugin::ParseAttributes() {
+void BrowserPluginImpl::ParseAttributes() {
// TODO(mthiesse): Handle errors here?
std::string error;
ParsePartitionAttribute(&error);
@@ -795,47 +784,13 @@ void BrowserPlugin::ParseAttributes() {
ParseSrcAttribute(&error);
}
-float BrowserPlugin::GetDeviceScaleFactor() const {
+float BrowserPluginImpl::GetDeviceScaleFactor() const {
if (!render_view_)
return 1.0f;
return render_view_->GetWebView()->deviceScaleFactor();
}
-void BrowserPlugin::TriggerEvent(const std::string& event_name,
- std::map<std::string, base::Value*>* props) {
- if (!container() || !container()->element().document().frame())
- return;
- v8::HandleScope handle_scope;
- std::string json_string;
- if (props) {
- base::DictionaryValue dict;
- for (std::map<std::string, base::Value*>::iterator iter = props->begin(),
- end = props->end(); iter != end; ++iter) {
- dict.Set(iter->first, iter->second);
- }
-
- JSONStringValueSerializer serializer(&json_string);
- if (!serializer.Serialize(dict))
- return;
- }
-
- WebKit::WebFrame* frame = container()->element().document().frame();
- WebKit::WebDOMEvent dom_event = frame->document().createEvent("CustomEvent");
- WebKit::WebDOMCustomEvent event = dom_event.to<WebKit::WebDOMCustomEvent>();
-
- // The events triggered directly from the plugin <object> are internal events
- // whose implementation details can (and likely will) change over time. The
- // wrapper/shim (e.g. <webview> tag) should receive these events, and expose a
- // more appropriate (and stable) event to the consumers as part of the API.
- event.initCustomEvent(
- WebKit::WebString::fromUTF8(GetInternalEventName(event_name.c_str())),
- false, false,
- WebKit::WebSerializedScriptValue::serialize(
- v8::String::New(json_string.c_str(), json_string.size())));
- container()->element().dispatchEvent(event);
-}
-
-void BrowserPlugin::OnRequestObjectGarbageCollected(int request_id) {
+void BrowserPluginImpl::OnRequestObjectGarbageCollected(int request_id) {
// Remove from alive objects.
std::map<int, AliveV8PermissionRequestItem*>::iterator iter =
alive_v8_permission_request_objects_.find(request_id);
@@ -846,7 +801,7 @@ void BrowserPlugin::OnRequestObjectGarbageCollected(int request_id) {
RespondPermissionIfRequestIsPending(request_id, false /*allow*/);
}
-void BrowserPlugin::PersistRequestObject(
+void BrowserPluginImpl::PersistRequestObject(
const NPVariant* request, const std::string& type, int id) {
CHECK(alive_v8_permission_request_objects_.find(id) ==
alive_v8_permission_request_objects_.end());
@@ -859,7 +814,7 @@ void BrowserPlugin::PersistRequestObject(
v8::Persistent<v8::Value>::New(WebKit::WebBindings::toV8Value(request));
AliveV8PermissionRequestItem* new_item =
- new std::pair<int, base::WeakPtr<BrowserPlugin> >(
+ new std::pair<int, base::WeakPtr<BrowserPluginImpl> >(
id, weak_ptr_factory_.GetWeakPtr());
std::pair<std::map<int, AliveV8PermissionRequestItem*>::iterator, bool>
@@ -871,7 +826,7 @@ void BrowserPlugin::PersistRequestObject(
}
// static
-void BrowserPlugin::WeakCallbackForPersistObject(
+void BrowserPluginImpl::WeakCallbackForPersistObject(
v8::Persistent<v8::Value> object, void* param) {
v8::Persistent<v8::Object> persistent_object =
v8::Persistent<v8::Object>::Cast(object);
@@ -879,7 +834,7 @@ void BrowserPlugin::WeakCallbackForPersistObject(
AliveV8PermissionRequestItem* item_ptr =
static_cast<AliveV8PermissionRequestItem*>(param);
int request_id = item_ptr->first;
- base::WeakPtr<BrowserPlugin> plugin = item_ptr->second;
+ base::WeakPtr<BrowserPluginImpl> plugin = item_ptr->second;
delete item_ptr;
persistent_object.Dispose();
@@ -891,12 +846,12 @@ void BrowserPlugin::WeakCallbackForPersistObject(
// don't need to worry about BrowserPlugin going away.
MessageLoop::current()->PostTask(
FROM_HERE,
- base::Bind(&BrowserPlugin::OnRequestObjectGarbageCollected,
+ base::Bind(&BrowserPluginImpl::OnRequestObjectGarbageCollected,
plugin, request_id));
}
}
-void BrowserPlugin::Back() {
+void BrowserPluginImpl::Back() {
if (!navigate_src_sent_)
return;
browser_plugin_manager()->Send(
@@ -904,7 +859,7 @@ void BrowserPlugin::Back() {
instance_id_, -1));
}
-void BrowserPlugin::Forward() {
+void BrowserPluginImpl::Forward() {
if (!navigate_src_sent_)
return;
browser_plugin_manager()->Send(
@@ -912,7 +867,7 @@ void BrowserPlugin::Forward() {
instance_id_, 1));
}
-void BrowserPlugin::Go(int relative_index) {
+void BrowserPluginImpl::Go(int relative_index) {
if (!navigate_src_sent_)
return;
browser_plugin_manager()->Send(
@@ -921,7 +876,7 @@ void BrowserPlugin::Go(int relative_index) {
relative_index));
}
-void BrowserPlugin::TerminateGuest() {
+void BrowserPluginImpl::TerminateGuest() {
if (!navigate_src_sent_ || guest_crashed_)
return;
browser_plugin_manager()->Send(
@@ -929,7 +884,7 @@ void BrowserPlugin::TerminateGuest() {
instance_id_));
}
-void BrowserPlugin::Stop() {
+void BrowserPluginImpl::Stop() {
if (!navigate_src_sent_)
return;
browser_plugin_manager()->Send(
@@ -937,7 +892,7 @@ void BrowserPlugin::Stop() {
instance_id_));
}
-void BrowserPlugin::Reload() {
+void BrowserPluginImpl::Reload() {
if (!navigate_src_sent_)
return;
browser_plugin_manager()->Send(
@@ -945,7 +900,7 @@ void BrowserPlugin::Reload() {
instance_id_));
}
-void BrowserPlugin::UpdateGuestFocusState() {
+void BrowserPluginImpl::UpdateGuestFocusState() {
if (!navigate_src_sent_)
return;
bool should_be_focused = ShouldGuestBeFocused();
@@ -955,18 +910,18 @@ void BrowserPlugin::UpdateGuestFocusState() {
should_be_focused));
}
-bool BrowserPlugin::ShouldGuestBeFocused() const {
+bool BrowserPluginImpl::ShouldGuestBeFocused() const {
bool embedder_focused = false;
if (render_view_)
embedder_focused = render_view_->has_focus();
return plugin_focused_ && embedder_focused;
}
-WebKit::WebPluginContainer* BrowserPlugin::container() const {
+WebKit::WebPluginContainer* BrowserPluginImpl::container() const {
return container_;
}
-void BrowserPlugin::RespondPermission(
+void BrowserPluginImpl::RespondPermission(
BrowserPluginPermissionType permission_type, int request_id, bool allow) {
switch (permission_type) {
case BrowserPluginPermissionTypeMedia:
@@ -983,7 +938,7 @@ void BrowserPlugin::RespondPermission(
}
}
-void BrowserPlugin::RespondPermissionIfRequestIsPending(
+void BrowserPluginImpl::RespondPermissionIfRequestIsPending(
int request_id, bool allow) {
PendingPermissionRequests::iterator iter =
pending_permission_requests_.find(request_id);
@@ -995,11 +950,12 @@ void BrowserPlugin::RespondPermissionIfRequestIsPending(
RespondPermission(permission_type, request_id, allow);
}
-void BrowserPlugin::OnEmbedderDecidedPermission(int request_id, bool allow) {
+void BrowserPluginImpl::OnEmbedderDecidedPermission(int request_id,
+ bool allow) {
RespondPermissionIfRequestIsPending(request_id, allow);
}
-bool BrowserPlugin::initialize(WebPluginContainer* container) {
+bool BrowserPluginImpl::initialize(WebPluginContainer* container) {
if (!container)
return false;
@@ -1013,7 +969,7 @@ bool BrowserPlugin::initialize(WebPluginContainer* container) {
return true;
}
-void BrowserPlugin::EnableCompositing(bool enable) {
+void BrowserPluginImpl::EnableCompositing(bool enable) {
if (compositing_enabled_ == enable)
return;
@@ -1047,16 +1003,23 @@ void BrowserPlugin::EnableCompositing(bool enable) {
compositing_helper_->EnableCompositing(enable);
}
-void BrowserPlugin::destroy() {
+void BrowserPluginImpl::destroy() {
// The BrowserPlugin's WebPluginContainer is deleted immediately after this
// call returns, so let's not keep a reference to it around.
container_ = NULL;
+ // BrowserPluginObservers might create additional bindings. These bindings
+ // might refer back to the observers that created them. In order to ensure
+ // that bindings can always refer to valid observers, we get rid of bindings
+ // prior to cleaning up observers.
+ bindings_.reset();
+ FOR_EACH_OBSERVER(BrowserPluginObserver, observers_, BrowserPluginGone());
+ FOR_EACH_OBSERVER(BrowserPluginObserver, observers_, OnDestruct());
if (compositing_helper_)
compositing_helper_->OnContainerDestroy();
MessageLoop::current()->DeleteSoon(FROM_HERE, this);
}
-NPObject* BrowserPlugin::scriptableObject() {
+NPObject* BrowserPluginImpl::scriptableObject() {
if (!bindings_.get())
return NULL;
@@ -1066,19 +1029,18 @@ NPObject* BrowserPlugin::scriptableObject() {
return browser_plugin_np_object;
}
-bool BrowserPlugin::supportsKeyboardFocus() const {
+bool BrowserPluginImpl::supportsKeyboardFocus() const {
return true;
}
-bool BrowserPlugin::canProcessDrag() const {
+bool BrowserPluginImpl::canProcessDrag() const {
return true;
}
-void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) {
+void BrowserPluginImpl::paint(WebCanvas* canvas, const WebRect& rect) {
if (guest_crashed_) {
if (!sad_guest_) // Lazily initialize bitmap.
- sad_guest_ = content::GetContentClient()->renderer()->
- GetSadWebViewBitmap();
+ sad_guest_ = GetContentClient()->renderer()->GetSadWebViewBitmap();
// content_shell does not have the sad plugin bitmap, so we'll paint black
// instead to make it clear that something went wrong.
if (sad_guest_) {
@@ -1109,7 +1071,7 @@ void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) {
canvas->drawBitmap(backing_store_->GetBitmap(), 0, 0);
}
-bool BrowserPlugin::InBounds(const gfx::Point& position) const {
+bool BrowserPluginImpl::InBounds(const gfx::Point& position) const {
// Note that even for plugins that are rotated using rotate transformations,
// we use the the |plugin_rect_| provided by updateGeometry, which means we
// will be off if |position| is within the plugin rect but does not fall
@@ -1124,13 +1086,120 @@ bool BrowserPlugin::InBounds(const gfx::Point& position) const {
return result;
}
-gfx::Point BrowserPlugin::ToLocalCoordinates(const gfx::Point& point) const {
+RenderView* BrowserPluginImpl::GetRenderView() const {
+ return render_view_.get();
+}
+
+WebKit::WebPluginContainer* BrowserPluginImpl::GetContainer() const {
+ return container();
+}
+
+void BrowserPluginImpl::AddMethodBinding(
+ BrowserPluginMethodBinding* method_binding) {
+ bindings_->AddMethodBinding(method_binding);
+}
+
+void BrowserPluginImpl::AddPropertyBinding(
+ BrowserPluginPropertyBinding* method_binding) {
+ bindings_->AddPropertyBinding(method_binding);
+}
+
+void BrowserPluginImpl::TriggerEvent(
+ const std::string& event_name,
+ std::map<std::string, base::Value*>* props) {
+ if (!container() || !container()->element().document().frame())
+ return;
+ v8::HandleScope handle_scope;
+ std::string json_string;
+ if (props) {
+ base::DictionaryValue dict;
+ for (std::map<std::string, base::Value*>::iterator iter = props->begin(),
+ end = props->end(); iter != end; ++iter) {
+ dict.Set(iter->first, iter->second);
+ }
+
+ JSONStringValueSerializer serializer(&json_string);
+ if (!serializer.Serialize(dict))
+ return;
+ }
+
+ WebKit::WebFrame* frame = container()->element().document().frame();
+ WebKit::WebDOMEvent dom_event = frame->document().createEvent("CustomEvent");
+ WebKit::WebDOMCustomEvent event = dom_event.to<WebKit::WebDOMCustomEvent>();
+
+ // The events triggered directly from the plugin <object> are internal events
+ // whose implementation details can (and likely will) change over time. The
+ // wrapper/shim (e.g. <webview> tag) should receive these events, and expose a
+ // more appropriate (and stable) event to the consumers as part of the API.
+ event.initCustomEvent(
+ WebKit::WebString::fromUTF8(GetInternalEventName(event_name.c_str())),
+ false, false,
+ WebKit::WebSerializedScriptValue::serialize(
+ v8::String::New(json_string.c_str(), json_string.size())));
+ container()->element().dispatchEvent(event);
+}
+
+void BrowserPluginImpl::UpdateDOMAttribute(const std::string& attribute_name,
+ const std::string& attribute_value) {
+ if (!container())
+ return;
+
+ WebKit::WebElement element = container()->element();
+ WebKit::WebString web_attribute_name =
+ WebKit::WebString::fromUTF8(attribute_name);
+ if (!HasDOMAttribute(attribute_name) ||
+ (std::string(element.getAttribute(web_attribute_name).utf8()) !=
+ attribute_value)) {
+ element.setAttribute(web_attribute_name,
+ WebKit::WebString::fromUTF8(attribute_value));
+ }
+}
+void BrowserPluginImpl::RemoveDOMAttribute(const std::string& attribute_name) {
+ if (!container())
+ return;
+
+ container()->element().removeAttribute(
+ WebKit::WebString::fromUTF8(attribute_name));
+}
+
+std::string BrowserPluginImpl::GetDOMAttributeValue(
+ const std::string& attribute_name) const {
+ if (!container())
+ return "";
+
+ return container()->element().getAttribute(
+ WebKit::WebString::fromUTF8(attribute_name)).utf8();
+}
+
+bool BrowserPluginImpl::HasDOMAttribute(
+ const std::string& attribute_name) const {
+ if (!container())
+ return false;
+
+ return container()->element().hasAttribute(
+ WebKit::WebString::fromUTF8(attribute_name));
+}
+
+bool BrowserPluginImpl::HasNavigated() const {
+ return navigate_src_sent_;
+}
+
+bool BrowserPluginImpl::Send(IPC::Message* message) {
+ IPC::Message* wrapper_msg =
+ new BrowserPluginHostMsg_ForwardMessage(
+ render_view_routing_id_, instance_id_, *message);
+ delete message;
+ return browser_plugin_manager()->Send(wrapper_msg);
+}
+
+gfx::Point BrowserPluginImpl::ToLocalCoordinates(
+ const gfx::Point& point) const {
if (container_)
return container_->windowToLocalPoint(WebKit::WebPoint(point));
return gfx::Point(point.x() - plugin_rect_.x(), point.y() - plugin_rect_.y());
}
-void BrowserPlugin::updateGeometry(
+void BrowserPluginImpl::updateGeometry(
const WebRect& window_rect,
const WebRect& clip_rect,
const WebVector<WebRect>& cut_outs_rects,
@@ -1160,12 +1229,12 @@ void BrowserPlugin::updateGeometry(
params));
}
-void BrowserPlugin::SwapDamageBuffers() {
+void BrowserPluginImpl::SwapDamageBuffers() {
current_damage_buffer_.reset(pending_damage_buffer_.release());
resize_ack_received_ = true;
}
-void BrowserPlugin::PopulateResizeGuestParameters(
+void BrowserPluginImpl::PopulateResizeGuestParameters(
BrowserPluginHostMsg_ResizeGuest_Params* params,
const gfx::Size& view_size) {
params->view_size = view_size;
@@ -1193,7 +1262,7 @@ void BrowserPlugin::PopulateResizeGuestParameters(
params->damage_buffer_sequence_id = ++damage_buffer_sequence_id_;
}
-void BrowserPlugin::GetDamageBufferWithSizeParams(
+void BrowserPluginImpl::GetDamageBufferWithSizeParams(
BrowserPluginHostMsg_AutoSize_Params* auto_size_params,
BrowserPluginHostMsg_ResizeGuest_Params* resize_guest_params) {
if (auto_size_params)
@@ -1207,7 +1276,7 @@ void BrowserPlugin::GetDamageBufferWithSizeParams(
}
#if defined(OS_POSIX)
-base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
+base::SharedMemory* BrowserPluginImpl::CreateDamageBuffer(
const size_t size,
base::SharedMemoryHandle* damage_buffer_handle) {
scoped_ptr<base::SharedMemory> shared_buf(
@@ -1227,7 +1296,7 @@ base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
return NULL;
}
#elif defined(OS_WIN)
-base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
+base::SharedMemory* BrowserPluginImpl::CreateDamageBuffer(
const size_t size,
base::SharedMemoryHandle* damage_buffer_handle) {
scoped_ptr<base::SharedMemory> shared_buf(new base::SharedMemory());
@@ -1236,7 +1305,6 @@ base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
NOTREACHED() << "Buffer allocation failed";
return NULL;
}
-
// Insert the magic word.
*static_cast<unsigned int*>(shared_buf->memory()) = 0xdeadbeef;
if (shared_buf->ShareToProcess(base::GetCurrentProcessHandle(),
@@ -1247,7 +1315,7 @@ base::SharedMemory* BrowserPlugin::CreateDamageBuffer(
}
#endif
-void BrowserPlugin::updateFocus(bool focused) {
+void BrowserPluginImpl::updateFocus(bool focused) {
if (plugin_focused_ == focused)
return;
@@ -1258,7 +1326,7 @@ void BrowserPlugin::updateFocus(bool focused) {
UpdateGuestFocusState();
}
-void BrowserPlugin::updateVisibility(bool visible) {
+void BrowserPluginImpl::updateVisibility(bool visible) {
if (visible_ == visible)
return;
@@ -1275,12 +1343,12 @@ void BrowserPlugin::updateVisibility(bool visible) {
visible));
}
-bool BrowserPlugin::acceptsInputEvents() {
+bool BrowserPluginImpl::acceptsInputEvents() {
return true;
}
-bool BrowserPlugin::handleInputEvent(const WebKit::WebInputEvent& event,
- WebKit::WebCursorInfo& cursor_info) {
+bool BrowserPluginImpl::handleInputEvent(const WebKit::WebInputEvent& event,
+ WebKit::WebCursorInfo& cursor_info) {
if (guest_crashed_ || !navigate_src_sent_ ||
event.type == WebKit::WebInputEvent::ContextMenu)
return false;
@@ -1293,42 +1361,42 @@ bool BrowserPlugin::handleInputEvent(const WebKit::WebInputEvent& event,
return true;
}
-bool BrowserPlugin::handleDragStatusUpdate(WebKit::WebDragStatus drag_status,
- const WebKit::WebDragData& drag_data,
- WebKit::WebDragOperationsMask mask,
- const WebKit::WebPoint& position,
- const WebKit::WebPoint& screen) {
+bool BrowserPluginImpl::handleDragStatusUpdate(
+ WebKit::WebDragStatus drag_status,
+ const WebKit::WebDragData& drag_data,
+ WebKit::WebDragOperationsMask mask,
+ const WebKit::WebPoint& position,
+ const WebKit::WebPoint& screen) {
if (guest_crashed_ || !navigate_src_sent_)
return false;
- browser_plugin_manager()->Send(
- new BrowserPluginHostMsg_DragStatusUpdate(
- render_view_routing_id_,
- instance_id_,
- drag_status,
- WebDropData(drag_data),
- mask,
- position));
+ browser_plugin_manager()->Send(new BrowserPluginHostMsg_DragStatusUpdate(
+ render_view_routing_id_,
+ instance_id_,
+ drag_status,
+ WebDropData(drag_data),
+ mask,
+ position));
return false;
}
-void BrowserPlugin::didReceiveResponse(
+void BrowserPluginImpl::didReceiveResponse(
const WebKit::WebURLResponse& response) {
}
-void BrowserPlugin::didReceiveData(const char* data, int data_length) {
+void BrowserPluginImpl::didReceiveData(const char* data, int data_length) {
}
-void BrowserPlugin::didFinishLoading() {
+void BrowserPluginImpl::didFinishLoading() {
}
-void BrowserPlugin::didFailLoading(const WebKit::WebURLError& error) {
+void BrowserPluginImpl::didFailLoading(const WebKit::WebURLError& error) {
}
-void BrowserPlugin::didFinishLoadingFrameRequest(const WebKit::WebURL& url,
- void* notify_data) {
+void BrowserPluginImpl::didFinishLoadingFrameRequest(const WebKit::WebURL& url,
+ void* notify_data) {
}
-void BrowserPlugin::didFailLoadingFrameRequest(
+void BrowserPluginImpl::didFailLoadingFrameRequest(
const WebKit::WebURL& url,
void* notify_data,
const WebKit::WebURLError& error) {
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin_impl.h ('k') | content/renderer/browser_plugin/browser_plugin_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698