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

Unified Diff: android_webview/browser/browser_view_renderer_impl.cc

Issue 12668003: Fix for crash in testWindows test (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: mutual deregistration Created 7 years, 9 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 | « android_webview/browser/browser_view_renderer_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/browser/browser_view_renderer_impl.cc
diff --git a/android_webview/browser/browser_view_renderer_impl.cc b/android_webview/browser/browser_view_renderer_impl.cc
index ef1f9d189e24e90545a8e54f00b0ecb25fe7c868..27cca47dea15142a3ca38abf9fd8564b57864fcb 100644
--- a/android_webview/browser/browser_view_renderer_impl.cc
+++ b/android_webview/browser/browser_view_renderer_impl.cc
@@ -43,6 +43,8 @@ using base::android::ScopedJavaLocalRef;
using content::Compositor;
using content::ContentViewCore;
+namespace android_webview {
+
namespace {
// Provides software rendering functions from the Android glue layer.
@@ -100,9 +102,28 @@ static bool RasterizeIntoBitmap(JNIEnv* env,
return succeeded;
}
+const void* kUserDataKey = &kUserDataKey;
+
} // namespace
-namespace android_webview {
+class BrowserViewRendererImpl::UserData : public content::WebContents::Data {
+ public:
+ UserData(BrowserViewRendererImpl* ptr) : instance_(ptr) {}
+ virtual ~UserData() {
+ instance_->WebContentsGone();
+ }
+
+ static BrowserViewRendererImpl* GetInstance(content::WebContents* contents) {
+ if (!contents)
+ return NULL;
+ UserData* data = reinterpret_cast<UserData*>(
+ contents->GetUserData(kUserDataKey));
+ return data ? data->instance_ : NULL;
+ }
+
+ private:
+ BrowserViewRendererImpl* instance_;
+};
// static
BrowserViewRendererImpl* BrowserViewRendererImpl::Create(
@@ -111,6 +132,12 @@ BrowserViewRendererImpl* BrowserViewRendererImpl::Create(
return new BrowserViewRendererImpl(client, java_helper);
}
+// static
+BrowserViewRendererImpl* BrowserViewRendererImpl::FromWebContents(
+ content::WebContents* contents) {
+ return UserData::GetInstance(contents);
+}
+
BrowserViewRendererImpl::BrowserViewRendererImpl(
BrowserViewRenderer::Client* client,
JavaHelper* java_helper)
@@ -158,6 +185,7 @@ void BrowserViewRendererImpl::SetAwDrawSWFunctionTable(
}
void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) {
+ // First remove association from the prior ContentViewCore / WebContents.
if (web_contents_) {
ContentViewCore* previous_content_view_core =
ContentViewCore::FromWebContents(web_contents_);
@@ -165,15 +193,17 @@ void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) {
previous_content_view_core->RemoveFrameInfoCallback(
update_frame_info_callback_);
}
+ web_contents_->SetUserData(kUserDataKey, NULL);
+ DCHECK(!web_contents_); // WebContentsGone should have been called.
}
- web_contents_ = content_view_core ?
- content_view_core->GetWebContents() : NULL;
- view_renderer_host_->Observe(web_contents_);
-
if (!content_view_core)
return;
+ web_contents_ = content_view_core->GetWebContents();
+ web_contents_->SetUserData(kUserDataKey, new UserData(this));
+ view_renderer_host_->Observe(web_contents_);
+
content_view_core->AddFrameInfoCallback(update_frame_info_callback_);
dpi_scale_ = content_view_core->GetDpiScale();
@@ -182,6 +212,10 @@ void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) {
Invalidate();
}
+void BrowserViewRendererImpl::WebContentsGone() {
+ web_contents_ = NULL;
Leandro Graciá Gil 2013/03/11 12:07:54 Should we un-observe in view_renderer_host_?
joth 2013/03/11 16:18:31 No, not really. view_renderer_host_ is a WebConten
+}
+
void BrowserViewRendererImpl::DrawGL(AwDrawGLInfo* draw_info) {
TRACE_EVENT0("android_webview", "BrowserViewRendererImpl::DrawGL");
« no previous file with comments | « android_webview/browser/browser_view_renderer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698