Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "android_webview/browser/browser_view_renderer_impl.h" | 5 #include "android_webview/browser/browser_view_renderer_impl.h" |
| 6 | 6 |
| 7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
| 8 #include <sys/system_properties.h> | 8 #include <sys/system_properties.h> |
| 9 | 9 |
| 10 #include "android_webview/common/renderer_picture_map.h" | 10 #include "android_webview/common/renderer_picture_map.h" |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 36 #ifndef GL_TEXTURE_BINDING_EXTERNAL_OES | 36 #ifndef GL_TEXTURE_BINDING_EXTERNAL_OES |
| 37 #define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 | 37 #define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 |
| 38 #endif | 38 #endif |
| 39 | 39 |
| 40 using base::android::AttachCurrentThread; | 40 using base::android::AttachCurrentThread; |
| 41 using base::android::JavaRef; | 41 using base::android::JavaRef; |
| 42 using base::android::ScopedJavaLocalRef; | 42 using base::android::ScopedJavaLocalRef; |
| 43 using content::Compositor; | 43 using content::Compositor; |
| 44 using content::ContentViewCore; | 44 using content::ContentViewCore; |
| 45 | 45 |
| 46 namespace android_webview { | |
| 47 | |
| 46 namespace { | 48 namespace { |
| 47 | 49 |
| 48 // Provides software rendering functions from the Android glue layer. | 50 // Provides software rendering functions from the Android glue layer. |
| 49 // Allows preventing extra copies of data when rendering. | 51 // Allows preventing extra copies of data when rendering. |
| 50 AwDrawSWFunctionTable* g_sw_draw_functions = NULL; | 52 AwDrawSWFunctionTable* g_sw_draw_functions = NULL; |
| 51 | 53 |
| 52 // Tells if the Skia library versions in Android and Chromium are compatible. | 54 // Tells if the Skia library versions in Android and Chromium are compatible. |
| 53 // If they are then it's possible to pass Skia objects like SkPictures to the | 55 // If they are then it's possible to pass Skia objects like SkPictures to the |
| 54 // Android glue layer via the SW rendering functions. | 56 // Android glue layer via the SW rendering functions. |
| 55 // If they are not, then additional copies and rasterizations are required | 57 // If they are not, then additional copies and rasterizations are required |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 } | 95 } |
| 94 | 96 |
| 95 if (AndroidBitmap_unlockPixels(env, jbitmap.obj()) < 0) { | 97 if (AndroidBitmap_unlockPixels(env, jbitmap.obj()) < 0) { |
| 96 LOG(ERROR) << "Error unlocking java bitmap pixels."; | 98 LOG(ERROR) << "Error unlocking java bitmap pixels."; |
| 97 return false; | 99 return false; |
| 98 } | 100 } |
| 99 | 101 |
| 100 return succeeded; | 102 return succeeded; |
| 101 } | 103 } |
| 102 | 104 |
| 105 const void* kUserDataKey = &kUserDataKey; | |
| 106 | |
| 103 } // namespace | 107 } // namespace |
| 104 | 108 |
| 105 namespace android_webview { | 109 class BrowserViewRendererImpl::UserData : public content::WebContents::Data { |
| 110 public: | |
| 111 UserData(BrowserViewRendererImpl* ptr) : instance_(ptr) {} | |
| 112 virtual ~UserData() { | |
| 113 instance_->WebContentsGone(); | |
| 114 } | |
| 115 | |
| 116 static BrowserViewRendererImpl* GetInstance(content::WebContents* contents) { | |
| 117 if (!contents) | |
| 118 return NULL; | |
| 119 UserData* data = reinterpret_cast<UserData*>( | |
| 120 contents->GetUserData(kUserDataKey)); | |
| 121 return data ? data->instance_ : NULL; | |
| 122 } | |
| 123 | |
| 124 private: | |
| 125 BrowserViewRendererImpl* instance_; | |
| 126 }; | |
| 106 | 127 |
| 107 // static | 128 // static |
| 108 BrowserViewRendererImpl* BrowserViewRendererImpl::Create( | 129 BrowserViewRendererImpl* BrowserViewRendererImpl::Create( |
| 109 BrowserViewRenderer::Client* client, | 130 BrowserViewRenderer::Client* client, |
| 110 JavaHelper* java_helper) { | 131 JavaHelper* java_helper) { |
| 111 return new BrowserViewRendererImpl(client, java_helper); | 132 return new BrowserViewRendererImpl(client, java_helper); |
| 112 } | 133 } |
| 113 | 134 |
| 135 // static | |
| 136 BrowserViewRendererImpl* BrowserViewRendererImpl::FromWebContents( | |
| 137 content::WebContents* contents) { | |
| 138 return UserData::GetInstance(contents); | |
| 139 } | |
| 140 | |
| 114 BrowserViewRendererImpl::BrowserViewRendererImpl( | 141 BrowserViewRendererImpl::BrowserViewRendererImpl( |
| 115 BrowserViewRenderer::Client* client, | 142 BrowserViewRenderer::Client* client, |
| 116 JavaHelper* java_helper) | 143 JavaHelper* java_helper) |
| 117 : client_(client), | 144 : client_(client), |
| 118 java_helper_(java_helper), | 145 java_helper_(java_helper), |
| 119 view_renderer_host_(new ViewRendererHost(NULL, this)), | 146 view_renderer_host_(new ViewRendererHost(NULL, this)), |
| 120 ALLOW_THIS_IN_INITIALIZER_LIST(compositor_(Compositor::Create(this))), | 147 ALLOW_THIS_IN_INITIALIZER_LIST(compositor_(Compositor::Create(this))), |
| 121 view_clip_layer_(cc::Layer::create()), | 148 view_clip_layer_(cc::Layer::create()), |
| 122 transform_layer_(cc::Layer::create()), | 149 transform_layer_(cc::Layer::create()), |
| 123 scissor_clip_layer_(cc::Layer::create()), | 150 scissor_clip_layer_(cc::Layer::create()), |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 151 void BrowserViewRendererImpl::SetAwDrawSWFunctionTable( | 178 void BrowserViewRendererImpl::SetAwDrawSWFunctionTable( |
| 152 AwDrawSWFunctionTable* table) { | 179 AwDrawSWFunctionTable* table) { |
| 153 g_sw_draw_functions = table; | 180 g_sw_draw_functions = table; |
| 154 g_is_skia_version_compatible = | 181 g_is_skia_version_compatible = |
| 155 g_sw_draw_functions->is_skia_version_compatible(&SkGraphics::GetVersion); | 182 g_sw_draw_functions->is_skia_version_compatible(&SkGraphics::GetVersion); |
| 156 LOG_IF(WARNING, !g_is_skia_version_compatible) | 183 LOG_IF(WARNING, !g_is_skia_version_compatible) |
| 157 << "Skia versions are not compatible, rendering performance will suffer."; | 184 << "Skia versions are not compatible, rendering performance will suffer."; |
| 158 } | 185 } |
| 159 | 186 |
| 160 void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) { | 187 void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) { |
| 188 // First remove association from the prior ContentViewCore / WebContents. | |
| 161 if (web_contents_) { | 189 if (web_contents_) { |
| 162 ContentViewCore* previous_content_view_core = | 190 ContentViewCore* previous_content_view_core = |
| 163 ContentViewCore::FromWebContents(web_contents_); | 191 ContentViewCore::FromWebContents(web_contents_); |
| 164 if (previous_content_view_core) { | 192 if (previous_content_view_core) { |
| 165 previous_content_view_core->RemoveFrameInfoCallback( | 193 previous_content_view_core->RemoveFrameInfoCallback( |
| 166 update_frame_info_callback_); | 194 update_frame_info_callback_); |
| 167 } | 195 } |
| 196 web_contents_->SetUserData(kUserDataKey, NULL); | |
| 197 DCHECK(!web_contents_); // WebContentsGone should have been called. | |
| 168 } | 198 } |
| 169 | 199 |
| 170 web_contents_ = content_view_core ? | |
| 171 content_view_core->GetWebContents() : NULL; | |
| 172 view_renderer_host_->Observe(web_contents_); | |
| 173 | |
| 174 if (!content_view_core) | 200 if (!content_view_core) |
| 175 return; | 201 return; |
| 176 | 202 |
| 203 web_contents_ = content_view_core->GetWebContents(); | |
| 204 web_contents_->SetUserData(kUserDataKey, new UserData(this)); | |
| 205 view_renderer_host_->Observe(web_contents_); | |
| 206 | |
| 177 content_view_core->AddFrameInfoCallback(update_frame_info_callback_); | 207 content_view_core->AddFrameInfoCallback(update_frame_info_callback_); |
| 178 dpi_scale_ = content_view_core->GetDpiScale(); | 208 dpi_scale_ = content_view_core->GetDpiScale(); |
| 179 | 209 |
| 180 view_clip_layer_->removeAllChildren(); | 210 view_clip_layer_->removeAllChildren(); |
| 181 view_clip_layer_->addChild(content_view_core->GetLayer()); | 211 view_clip_layer_->addChild(content_view_core->GetLayer()); |
| 182 Invalidate(); | 212 Invalidate(); |
| 183 } | 213 } |
| 184 | 214 |
| 215 void BrowserViewRendererImpl::WebContentsGone() { | |
| 216 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
| |
| 217 } | |
| 218 | |
| 185 void BrowserViewRendererImpl::DrawGL(AwDrawGLInfo* draw_info) { | 219 void BrowserViewRendererImpl::DrawGL(AwDrawGLInfo* draw_info) { |
| 186 TRACE_EVENT0("android_webview", "BrowserViewRendererImpl::DrawGL"); | 220 TRACE_EVENT0("android_webview", "BrowserViewRendererImpl::DrawGL"); |
| 187 | 221 |
| 188 if (view_size_.IsEmpty() || !scissor_clip_layer_ || | 222 if (view_size_.IsEmpty() || !scissor_clip_layer_ || |
| 189 draw_info->mode == AwDrawGLInfo::kModeProcess) | 223 draw_info->mode == AwDrawGLInfo::kModeProcess) |
| 190 return; | 224 return; |
| 191 | 225 |
| 192 DCHECK_EQ(draw_info->mode, AwDrawGLInfo::kModeDraw); | 226 DCHECK_EQ(draw_info->mode, AwDrawGLInfo::kModeDraw); |
| 193 | 227 |
| 194 SetCompositorVisibility(view_visible_); | 228 SetCompositorVisibility(view_visible_); |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 627 | 661 |
| 628 void BrowserViewRendererImpl::OnFrameInfoUpdated( | 662 void BrowserViewRendererImpl::OnFrameInfoUpdated( |
| 629 const gfx::SizeF& content_size, | 663 const gfx::SizeF& content_size, |
| 630 const gfx::Vector2dF& scroll_offset, | 664 const gfx::Vector2dF& scroll_offset, |
| 631 float page_scale_factor) { | 665 float page_scale_factor) { |
| 632 page_scale_ = page_scale_factor; | 666 page_scale_ = page_scale_factor; |
| 633 content_size_css_ = content_size; | 667 content_size_css_ = content_size; |
| 634 } | 668 } |
| 635 | 669 |
| 636 } // namespace android_webview | 670 } // namespace android_webview |
| OLD | NEW |