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

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

Issue 16057004: <webview>: Fix navigation/attachment race (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 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
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/browser_plugin/browser_plugin.cc
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc
index a7c0c7125d0aee08180bada2dbf98229c91be878..299a1423cb6c3440e1cbda52df02ced49e2e9ebf 100644
--- a/content/renderer/browser_plugin/browser_plugin.cc
+++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -137,7 +137,7 @@ BrowserPlugin::~BrowserPlugin() {
// 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.
- if (!HasGuest())
+ if (!HasInstanceID())
return;
browser_plugin_manager()->RemoveBrowserPlugin(instance_id_);
browser_plugin_manager()->Send(
@@ -301,7 +301,7 @@ std::string BrowserPlugin::GetPartitionAttribute() const {
}
void BrowserPlugin::ParseNameAttribute() {
- if (!HasGuest())
+ if (!HasInstanceID())
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_SetName(render_view_routing_id_,
@@ -321,7 +321,7 @@ bool BrowserPlugin::ParseSrcAttribute(std::string* error_message) {
// If we haven't created the guest yet, do so now. We will navigate it right
// after creation. If |src| is empty, we can delay the creation until we
// actually need it.
- if (!HasGuest()) {
+ if (!HasInstanceID()) {
// On initial navigation, we request an instance ID from the browser
// process. We essentially ignore all subsequent calls to SetSrcAttribute
// until we receive an instance ID. |before_first_navigation_|
@@ -365,7 +365,7 @@ void BrowserPlugin::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.
- if (!HasGuest() || !resize_ack_received_)
+ if (!HasInstanceID() || !resize_ack_received_)
return;
BrowserPluginHostMsg_AutoSize_Params auto_size_params;
BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params;
@@ -840,18 +840,22 @@ bool BrowserPlugin::AttachWindowTo(const WebKit::WebNode& node, int window_id) {
if (!browser_plugin)
return false;
- // If the BrowserPlugin already has a guest attached to it then we probably
- // shouldn't allow attaching a different guest.
+ // If the BrowserPlugin has already begun to navigate then we shouldn't allow
+ // attaching a different guest.
lazyboy 2013/05/29 00:38:25 Can you add a comment: in which case HasNavigated(
// TODO(fsamuel): We may wish to support reattaching guests in the future:
// http://crbug.com/156219.
- if (browser_plugin->HasGuest())
+ if (browser_plugin->HasNavigated())
return false;
browser_plugin->Attach(window_id);
return true;
}
-bool BrowserPlugin::HasGuest() const {
+bool BrowserPlugin::HasNavigated() const {
+ return !before_first_navigation_;
+}
+
+bool BrowserPlugin::HasInstanceID() const {
return instance_id_ != browser_plugin::kInstanceIDNone;
}
@@ -897,9 +901,9 @@ bool BrowserPlugin::ParsePartitionAttribute(std::string* error_message) {
}
bool BrowserPlugin::CanRemovePartitionAttribute(std::string* error_message) {
- if (HasGuest())
+ if (HasInstanceID())
*error_message = browser_plugin::kErrorCannotRemovePartition;
- return !HasGuest();
+ return !HasInstanceID();
}
void BrowserPlugin::ParseAttributes() {
@@ -1028,7 +1032,7 @@ void BrowserPlugin::WeakCallbackForPersistObject(
}
void BrowserPlugin::Back() {
- if (!HasGuest())
+ if (!HasInstanceID())
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_Go(render_view_routing_id_,
@@ -1036,7 +1040,7 @@ void BrowserPlugin::Back() {
}
void BrowserPlugin::Forward() {
- if (!HasGuest())
+ if (!HasInstanceID())
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_Go(render_view_routing_id_,
@@ -1044,7 +1048,7 @@ void BrowserPlugin::Forward() {
}
void BrowserPlugin::Go(int relative_index) {
- if (!HasGuest())
+ if (!HasInstanceID())
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_Go(render_view_routing_id_,
@@ -1053,7 +1057,7 @@ void BrowserPlugin::Go(int relative_index) {
}
void BrowserPlugin::TerminateGuest() {
- if (!HasGuest() || guest_crashed_)
+ if (!HasInstanceID() || guest_crashed_)
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_TerminateGuest(render_view_routing_id_,
@@ -1061,7 +1065,7 @@ void BrowserPlugin::TerminateGuest() {
}
void BrowserPlugin::Stop() {
- if (!HasGuest())
+ if (!HasInstanceID())
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_Stop(render_view_routing_id_,
@@ -1069,7 +1073,7 @@ void BrowserPlugin::Stop() {
}
void BrowserPlugin::Reload() {
- if (!HasGuest())
+ if (!HasInstanceID())
return;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_Reload(render_view_routing_id_,
@@ -1077,7 +1081,7 @@ void BrowserPlugin::Reload() {
}
void BrowserPlugin::UpdateGuestFocusState() {
- if (!HasGuest())
+ if (!HasInstanceID())
return;
bool should_be_focused = ShouldGuestBeFocused();
browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus(
@@ -1253,7 +1257,7 @@ void BrowserPlugin::paint(WebCanvas* canvas, const WebRect& rect) {
canvas->drawRect(image_data_rect, paint);
// Stay a solid color if we have never set a non-empty src, or we don't have a
// backing store.
- if (!backing_store_.get() || !HasGuest())
+ if (!backing_store_.get() || !HasInstanceID())
return;
float inverse_scale_factor = 1.0f / backing_store_->GetScaleFactor();
canvas->scale(inverse_scale_factor, inverse_scale_factor);
@@ -1322,7 +1326,7 @@ void BrowserPlugin::updateGeometry(
int old_width = width();
int old_height = height();
plugin_rect_ = window_rect;
- if (!HasGuest())
+ if (!HasInstanceID())
return;
// In AutoSize mode, guests don't care when the BrowserPlugin container is
@@ -1457,7 +1461,7 @@ void BrowserPlugin::updateVisibility(bool visible) {
return;
visible_ = visible;
- if (!HasGuest())
+ if (!HasInstanceID())
return;
if (compositing_helper_)
@@ -1475,7 +1479,7 @@ bool BrowserPlugin::acceptsInputEvents() {
bool BrowserPlugin::handleInputEvent(const WebKit::WebInputEvent& event,
WebKit::WebCursorInfo& cursor_info) {
- if (guest_crashed_ || !HasGuest() ||
+ if (guest_crashed_ || !HasInstanceID() ||
event.type == WebKit::WebInputEvent::ContextMenu)
return false;
@@ -1511,7 +1515,7 @@ bool BrowserPlugin::handleDragStatusUpdate(WebKit::WebDragStatus drag_status,
WebKit::WebDragOperationsMask mask,
const WebKit::WebPoint& position,
const WebKit::WebPoint& screen) {
- if (guest_crashed_ || !HasGuest())
+ if (guest_crashed_ || !HasInstanceID())
return false;
browser_plugin_manager()->Send(
new BrowserPluginHostMsg_DragStatusUpdate(
« no previous file with comments | « content/renderer/browser_plugin/browser_plugin.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698