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

Unified Diff: content/browser/browser_plugin/browser_plugin_guest.cc

Issue 1404353004: Delay creation of BrowserPluginMsg_X messages until after attach. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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_guest.cc
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc
index 00529ffab22904afb2517c11d4d8eac2b82d20e6..f9684c6cec0f17fa52db0646a7fb37370c533743 100644
--- a/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -444,9 +444,10 @@ void BrowserPluginGuest::OnRequireSequence(
}
void BrowserPluginGuest::SetContentsOpaque(bool opaque) {
- SendMessageToEmbedder(
- new BrowserPluginMsg_SetContentsOpaque(
- browser_plugin_instance_id(), opaque));
+ SendMessageToEmbedder([opaque](int browser_plugin_instance_id) {
+ return new BrowserPluginMsg_SetContentsOpaque(browser_plugin_instance_id,
+ opaque);
+ });
}
bool BrowserPluginGuest::Find(int request_id,
@@ -504,6 +505,8 @@ gfx::Point BrowserPluginGuest::GetScreenCoordinates(
return screen_pos;
}
+// TODO(wjmaclean): Remove this function once all messages are handled with
+// functionals.
void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) {
// During tests, attache() may be true when there is no owner_web_contents_;
// in this case just queue any messages we receive.
@@ -519,6 +522,22 @@ void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) {
owner_web_contents_->Send(msg);
}
+void BrowserPluginGuest::SendMessageToEmbedder(
+ BrowserPluginMessageFunc msg_func) {
+ // During tests, attache() may be true when there is no owner_web_contents_;
lazyboy 2015/10/16 00:15:48 attached()
+ // in this case just queue any messages we receive.
+ if (!attached() || !owner_web_contents_) {
+ // Some pages such as data URLs, javascript URLs, and about:blank
+ // do not load external resources and so they load prior to attachment.
+ // As a result, we must save all these IPCs until attachment and then
+ // forward them so that the embedder gets a chance to see and process
+ // the load events.
+ pending_message_funcs_.push_back(msg_func);
+ return;
+ }
+ owner_web_contents_->Send(msg_func(browser_plugin_instance_id()));
+}
+
void BrowserPluginGuest::DragSourceEndedAt(int client_x, int client_y,
int screen_x, int screen_y, blink::WebDragOperation operation) {
web_contents()->GetRenderViewHost()->DragSourceEndedAt(client_x, client_y,
@@ -568,11 +587,19 @@ void BrowserPluginGuest::SendQueuedMessages() {
if (!attached())
return;
+ // TODO(wjmaclean): Remove this block once all messages are handled with
+ // functionals.
while (!pending_messages_.empty()) {
linked_ptr<IPC::Message> message_ptr = pending_messages_.front();
Fady Samuel 2015/10/16 02:48:43 Perhaps you can grab the payload of the IPC::Messa
pending_messages_.pop_front();
SendMessageToEmbedder(message_ptr.release());
}
+
+ while (!pending_message_funcs_.empty()) {
lazyboy 2015/10/16 00:15:48 Having two queues will send messages out of order,
+ SendMessageToEmbedder(
+ pending_message_funcs_.front()(browser_plugin_instance_id()));
+ pending_message_funcs_.pop_front();
+ }
}
void BrowserPluginGuest::SendTextInputTypeChangedToView(

Powered by Google App Engine
This is Rietveld 408576698