Chromium Code Reviews| 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"); |