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"); |