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 |