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

Side by Side Diff: content/browser/browser_plugin/browser_plugin_guest.cc

Issue 299753011: Move allocate instance id to chrome/. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address comments from fady Created 6 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/browser_plugin/browser_plugin_guest.h" 5 #include "content/browser/browser_plugin/browser_plugin_guest.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 OnExecuteEditCommand) 146 OnExecuteEditCommand)
147 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ExtendSelectionAndDelete, 147 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ExtendSelectionAndDelete,
148 OnExtendSelectionAndDelete) 148 OnExtendSelectionAndDelete)
149 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_HandleInputEvent, 149 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_HandleInputEvent,
150 OnHandleInputEvent) 150 OnHandleInputEvent)
151 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ImeConfirmComposition, 151 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ImeConfirmComposition,
152 OnImeConfirmComposition) 152 OnImeConfirmComposition)
153 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ImeSetComposition, 153 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ImeSetComposition,
154 OnImeSetComposition) 154 OnImeSetComposition)
155 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_LockMouse_ACK, OnLockMouseAck) 155 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_LockMouse_ACK, OnLockMouseAck)
156 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_NavigateGuest, OnNavigateGuest)
157 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_PluginDestroyed, OnPluginDestroyed) 156 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_PluginDestroyed, OnPluginDestroyed)
158 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ReclaimCompositorResources, 157 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ReclaimCompositorResources,
159 OnReclaimCompositorResources) 158 OnReclaimCompositorResources)
160 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ResizeGuest, OnResizeGuest) 159 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_ResizeGuest, OnResizeGuest)
161 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetAutoSize, OnSetSize) 160 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetAutoSize, OnSetSize)
162 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent, 161 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent,
163 OnSetEditCommandsForNextKeyEvent) 162 OnSetEditCommandsForNextKeyEvent)
164 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetFocus, OnSetFocus) 163 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetFocus, OnSetFocus)
165 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetContentsOpaque, 164 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetContentsOpaque,
166 OnSetContentsOpaque) 165 OnSetContentsOpaque)
167 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetVisibility, OnSetVisibility) 166 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_SetVisibility, OnSetVisibility)
168 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UnlockMouse_ACK, OnUnlockMouseAck) 167 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UnlockMouse_ACK, OnUnlockMouseAck)
169 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UpdateGeometry, OnUpdateGeometry) 168 IPC_MESSAGE_HANDLER(BrowserPluginHostMsg_UpdateGeometry, OnUpdateGeometry)
170 IPC_MESSAGE_UNHANDLED(handled = false) 169 IPC_MESSAGE_UNHANDLED(handled = false)
171 IPC_END_MESSAGE_MAP() 170 IPC_END_MESSAGE_MAP()
172 return handled; 171 return handled;
173 } 172 }
174 173
175 void BrowserPluginGuest::Initialize( 174 void BrowserPluginGuest::Initialize(
176 const BrowserPluginHostMsg_Attach_Params& params, 175 const BrowserPluginHostMsg_Attach_Params& params,
177 WebContentsImpl* embedder_web_contents) { 176 WebContentsImpl* embedder_web_contents,
177 const base::DictionaryValue& extra_params) {
178 printf("BPG::Initialize()\n");
178 focused_ = params.focused; 179 focused_ = params.focused;
179 guest_visible_ = params.visible; 180 guest_visible_ = params.visible;
180 guest_opaque_ = params.opaque; 181 guest_opaque_ = params.opaque;
181 guest_window_rect_ = params.resize_guest_params.view_rect; 182 guest_window_rect_ = params.resize_guest_params.view_rect;
182 183
183 auto_size_enabled_ = params.auto_size_params.enable; 184 auto_size_enabled_ = params.auto_size_params.enable;
184 max_auto_size_ = params.auto_size_params.max_size; 185 max_auto_size_ = params.auto_size_params.max_size;
185 min_auto_size_ = params.auto_size_params.min_size; 186 min_auto_size_ = params.auto_size_params.min_size;
186 187
187 // Once a BrowserPluginGuest has an embedder WebContents, it's considered to 188 // Once a BrowserPluginGuest has an embedder WebContents, it's considered to
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 221
221 // Create a swapped out RenderView for the guest in the embedder render 222 // Create a swapped out RenderView for the guest in the embedder render
222 // process, so that the embedder can access the guest's window object. 223 // process, so that the embedder can access the guest's window object.
223 int guest_routing_id = 224 int guest_routing_id =
224 GetWebContents()->CreateSwappedOutRenderView( 225 GetWebContents()->CreateSwappedOutRenderView(
225 embedder_web_contents_->GetSiteInstance()); 226 embedder_web_contents_->GetSiteInstance());
226 SendMessageToEmbedder( 227 SendMessageToEmbedder(
227 new BrowserPluginMsg_GuestContentWindowReady(instance_id_, 228 new BrowserPluginMsg_GuestContentWindowReady(instance_id_,
228 guest_routing_id)); 229 guest_routing_id));
229 230
230 if (!params.src.empty()) {
231 // params.src will be validated in BrowserPluginGuest::OnNavigateGuest.
232 OnNavigateGuest(instance_id_, params.src);
233 has_render_view_ = true;
234 }
235
236 WebPreferences prefs = GetWebContents()->GetWebkitPrefs(); 231 WebPreferences prefs = GetWebContents()->GetWebkitPrefs();
237 prefs.navigate_on_drag_drop = false; 232 prefs.navigate_on_drag_drop = false;
238 GetWebContents()->GetRenderViewHost()->UpdateWebkitPreferences(prefs); 233 GetWebContents()->GetRenderViewHost()->UpdateWebkitPreferences(prefs);
239 234
240 // Enable input method for guest if it's enabled for the embedder. 235 // Enable input method for guest if it's enabled for the embedder.
241 if (static_cast<RenderViewHostImpl*>( 236 if (static_cast<RenderViewHostImpl*>(
242 embedder_web_contents_->GetRenderViewHost())->input_method_active()) { 237 embedder_web_contents_->GetRenderViewHost())->input_method_active()) {
243 RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>( 238 RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>(
244 GetWebContents()->GetRenderViewHost()); 239 GetWebContents()->GetRenderViewHost());
245 guest_rvh->SetInputMethodActive(true); 240 guest_rvh->SetInputMethodActive(true);
246 } 241 }
247 242
248 // Inform the embedder of the guest's information. 243 // Inform the embedder of the guest's attachment.
249 // We pull the partition information from the site's URL, which is of the form 244 SendMessageToEmbedder(new BrowserPluginMsg_Attach_ACK(instance_id_));
250 // guest://site/{persist}?{partition_name}.
251 const GURL& site_url = GetWebContents()->GetSiteInstance()->GetSiteURL();
252 BrowserPluginMsg_Attach_ACK_Params ack_params;
253 ack_params.storage_partition_id = site_url.query();
254 ack_params.persist_storage =
255 site_url.path().find("persist") != std::string::npos;
256 SendMessageToEmbedder(
257 new BrowserPluginMsg_Attach_ACK(instance_id_, ack_params));
258 245
259 if (delegate_) 246 if (delegate_) {
260 delegate_->DidAttach(); 247 delegate_->DidAttach(extra_params);
248 has_render_view_ = true;
249 }
261 } 250 }
262 251
263 BrowserPluginGuest::~BrowserPluginGuest() { 252 BrowserPluginGuest::~BrowserPluginGuest() {
264 while (!pending_messages_.empty()) {
265 delete pending_messages_.front();
266 pending_messages_.pop();
267 }
268 } 253 }
269 254
270 // static 255 // static
271 BrowserPluginGuest* BrowserPluginGuest::Create( 256 BrowserPluginGuest* BrowserPluginGuest::Create(
272 int instance_id, 257 int instance_id,
273 SiteInstance* guest_site_instance, 258 SiteInstance* guest_site_instance,
274 WebContentsImpl* web_contents, 259 WebContentsImpl* web_contents,
275 scoped_ptr<base::DictionaryValue> extra_params, 260 scoped_ptr<base::DictionaryValue> extra_params,
276 BrowserPluginGuest* opener) { 261 BrowserPluginGuest* opener) {
277 RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Create")); 262 RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Create"));
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 size.height() <= max_auto_size_.height(); 366 size.height() <= max_auto_size_.height();
382 } 367 }
383 368
384 void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) { 369 void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) {
385 if (!attached()) { 370 if (!attached()) {
386 // Some pages such as data URLs, javascript URLs, and about:blank 371 // Some pages such as data URLs, javascript URLs, and about:blank
387 // do not load external resources and so they load prior to attachment. 372 // do not load external resources and so they load prior to attachment.
388 // As a result, we must save all these IPCs until attachment and then 373 // As a result, we must save all these IPCs until attachment and then
389 // forward them so that the embedder gets a chance to see and process 374 // forward them so that the embedder gets a chance to see and process
390 // the load events. 375 // the load events.
391 pending_messages_.push(msg); 376 pending_messages_.push_back(linked_ptr<IPC::Message>(msg));
392 return; 377 return;
393 } 378 }
394 msg->set_routing_id(embedder_web_contents_->GetRoutingID()); 379 msg->set_routing_id(embedder_web_contents_->GetRoutingID());
395 embedder_web_contents_->Send(msg); 380 embedder_web_contents_->Send(msg);
396 } 381 }
397 382
398 void BrowserPluginGuest::DragSourceEndedAt(int client_x, int client_y, 383 void BrowserPluginGuest::DragSourceEndedAt(int client_x, int client_y,
399 int screen_x, int screen_y, blink::WebDragOperation operation) { 384 int screen_x, int screen_y, blink::WebDragOperation operation) {
400 web_contents()->GetRenderViewHost()->DragSourceEndedAt(client_x, client_y, 385 web_contents()->GetRenderViewHost()->DragSourceEndedAt(client_x, client_y,
401 screen_x, screen_y, operation); 386 screen_x, screen_y, operation);
402 } 387 }
403 388
404 void BrowserPluginGuest::EndSystemDrag() { 389 void BrowserPluginGuest::EndSystemDrag() {
405 RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>( 390 RenderViewHostImpl* guest_rvh = static_cast<RenderViewHostImpl*>(
406 GetWebContents()->GetRenderViewHost()); 391 GetWebContents()->GetRenderViewHost());
407 guest_rvh->DragSourceSystemDragEnded(); 392 guest_rvh->DragSourceSystemDragEnded();
408 } 393 }
409 394
410 void BrowserPluginGuest::SetDelegate(BrowserPluginGuestDelegate* delegate) { 395 void BrowserPluginGuest::SetDelegate(BrowserPluginGuestDelegate* delegate) {
411 DCHECK(!delegate_); 396 DCHECK(!delegate_);
412 delegate_.reset(delegate); 397 delegate_.reset(delegate);
413 } 398 }
414 399
415 void BrowserPluginGuest::SendQueuedMessages() { 400 void BrowserPluginGuest::SendQueuedMessages() {
416 if (!attached()) 401 if (!attached())
417 return; 402 return;
418 403
419 while (!pending_messages_.empty()) { 404 while (!pending_messages_.empty()) {
420 IPC::Message* message = pending_messages_.front(); 405 linked_ptr<IPC::Message> message_ptr = pending_messages_.front();
421 pending_messages_.pop(); 406 pending_messages_.pop_front();
422 SendMessageToEmbedder(message); 407 SendMessageToEmbedder(message_ptr.release());
423 } 408 }
424 } 409 }
425 410
426 void BrowserPluginGuest::DidCommitProvisionalLoadForFrame( 411 void BrowserPluginGuest::DidCommitProvisionalLoadForFrame(
427 int64 frame_id, 412 int64 frame_id,
428 const base::string16& frame_unique_name, 413 const base::string16& frame_unique_name,
429 bool is_main_frame, 414 bool is_main_frame,
430 const GURL& url, 415 const GURL& url,
431 PageTransition transition_type, 416 PageTransition transition_type,
432 RenderViewHost* render_view_host) { 417 RenderViewHost* render_view_host) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 switch (message.type()) { 475 switch (message.type()) {
491 case BrowserPluginHostMsg_CompositorFrameSwappedACK::ID: 476 case BrowserPluginHostMsg_CompositorFrameSwappedACK::ID:
492 case BrowserPluginHostMsg_CopyFromCompositingSurfaceAck::ID: 477 case BrowserPluginHostMsg_CopyFromCompositingSurfaceAck::ID:
493 case BrowserPluginHostMsg_DragStatusUpdate::ID: 478 case BrowserPluginHostMsg_DragStatusUpdate::ID:
494 case BrowserPluginHostMsg_ExecuteEditCommand::ID: 479 case BrowserPluginHostMsg_ExecuteEditCommand::ID:
495 case BrowserPluginHostMsg_ExtendSelectionAndDelete::ID: 480 case BrowserPluginHostMsg_ExtendSelectionAndDelete::ID:
496 case BrowserPluginHostMsg_HandleInputEvent::ID: 481 case BrowserPluginHostMsg_HandleInputEvent::ID:
497 case BrowserPluginHostMsg_ImeConfirmComposition::ID: 482 case BrowserPluginHostMsg_ImeConfirmComposition::ID:
498 case BrowserPluginHostMsg_ImeSetComposition::ID: 483 case BrowserPluginHostMsg_ImeSetComposition::ID:
499 case BrowserPluginHostMsg_LockMouse_ACK::ID: 484 case BrowserPluginHostMsg_LockMouse_ACK::ID:
500 case BrowserPluginHostMsg_NavigateGuest::ID:
501 case BrowserPluginHostMsg_PluginDestroyed::ID: 485 case BrowserPluginHostMsg_PluginDestroyed::ID:
502 case BrowserPluginHostMsg_ReclaimCompositorResources::ID: 486 case BrowserPluginHostMsg_ReclaimCompositorResources::ID:
503 case BrowserPluginHostMsg_ResizeGuest::ID: 487 case BrowserPluginHostMsg_ResizeGuest::ID:
504 case BrowserPluginHostMsg_SetAutoSize::ID: 488 case BrowserPluginHostMsg_SetAutoSize::ID:
505 case BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent::ID: 489 case BrowserPluginHostMsg_SetEditCommandsForNextKeyEvent::ID:
506 case BrowserPluginHostMsg_SetFocus::ID: 490 case BrowserPluginHostMsg_SetFocus::ID:
507 case BrowserPluginHostMsg_SetContentsOpaque::ID: 491 case BrowserPluginHostMsg_SetContentsOpaque::ID:
508 case BrowserPluginHostMsg_SetVisibility::ID: 492 case BrowserPluginHostMsg_SetVisibility::ID:
509 case BrowserPluginHostMsg_UnlockMouse_ACK::ID: 493 case BrowserPluginHostMsg_UnlockMouse_ACK::ID:
510 case BrowserPluginHostMsg_UpdateGeometry::ID: 494 case BrowserPluginHostMsg_UpdateGeometry::ID:
(...skipping 28 matching lines...) Expand all
539 #endif 523 #endif
540 IPC_MESSAGE_HANDLER(ViewHostMsg_UnlockMouse, OnUnlockMouse) 524 IPC_MESSAGE_HANDLER(ViewHostMsg_UnlockMouse, OnUnlockMouse)
541 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnUpdateRect) 525 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnUpdateRect)
542 IPC_MESSAGE_UNHANDLED(handled = false) 526 IPC_MESSAGE_UNHANDLED(handled = false)
543 IPC_END_MESSAGE_MAP() 527 IPC_END_MESSAGE_MAP()
544 return handled; 528 return handled;
545 } 529 }
546 530
547 void BrowserPluginGuest::Attach( 531 void BrowserPluginGuest::Attach(
548 WebContentsImpl* embedder_web_contents, 532 WebContentsImpl* embedder_web_contents,
549 BrowserPluginHostMsg_Attach_Params params, 533 const BrowserPluginHostMsg_Attach_Params& params,
550 const base::DictionaryValue& extra_params) { 534 const base::DictionaryValue& extra_params) {
551 if (attached()) 535 if (attached())
552 return; 536 return;
553 537
554 // Clear parameters that get inherited from the opener.
555 params.storage_partition_id.clear();
556 params.persist_storage = false;
557 params.src.clear();
558
559 // If a RenderView has already been created for this new window, then we need 538 // If a RenderView has already been created for this new window, then we need
560 // to initialize the browser-side state now so that the RenderFrameHostManager 539 // to initialize the browser-side state now so that the RenderFrameHostManager
561 // does not create a new RenderView on navigation. 540 // does not create a new RenderView on navigation.
562 if (has_render_view_) { 541 if (has_render_view_) {
563 static_cast<RenderViewHostImpl*>( 542 static_cast<RenderViewHostImpl*>(
564 GetWebContents()->GetRenderViewHost())->Init(); 543 GetWebContents()->GetRenderViewHost())->Init();
565 WebContentsViewGuest* new_view = 544 WebContentsViewGuest* new_view =
566 static_cast<WebContentsViewGuest*>(GetWebContents()->GetView()); 545 static_cast<WebContentsViewGuest*>(GetWebContents()->GetView());
567 new_view->CreateViewForWidget(web_contents()->GetRenderViewHost()); 546 new_view->CreateViewForWidget(web_contents()->GetRenderViewHost());
568 } 547 }
569 548
570 Initialize(params, embedder_web_contents); 549 Initialize(params, embedder_web_contents, extra_params);
571 550
572 SendQueuedMessages(); 551 SendQueuedMessages();
573 552
574 RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Attached")); 553 RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Attached"));
575 } 554 }
576 555
577 void BrowserPluginGuest::OnCompositorFrameSwappedACK( 556 void BrowserPluginGuest::OnCompositorFrameSwappedACK(
578 int instance_id, 557 int instance_id,
579 const FrameHostMsg_CompositorFrameSwappedACK_Params& params) { 558 const FrameHostMsg_CompositorFrameSwappedACK_Params& params) {
580 RenderWidgetHostImpl::SendSwapCompositorFrameAck(params.producing_route_id, 559 RenderWidgetHostImpl::SendSwapCompositorFrameAck(params.producing_route_id,
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 weak_ptr_factory_.GetWeakPtr())); 712 weak_ptr_factory_.GetWeakPtr()));
734 } 713 }
735 714
736 void BrowserPluginGuest::OnLockMouseAck(int instance_id, bool succeeded) { 715 void BrowserPluginGuest::OnLockMouseAck(int instance_id, bool succeeded) {
737 Send(new ViewMsg_LockMouse_ACK(routing_id(), succeeded)); 716 Send(new ViewMsg_LockMouse_ACK(routing_id(), succeeded));
738 pending_lock_request_ = false; 717 pending_lock_request_ = false;
739 if (succeeded) 718 if (succeeded)
740 mouse_locked_ = true; 719 mouse_locked_ = true;
741 } 720 }
742 721
743 void BrowserPluginGuest::OnNavigateGuest(int instance_id,
744 const std::string& src) {
745 if (!delegate_)
746 return;
747 delegate_->NavigateGuest(src);
748 }
749
750 void BrowserPluginGuest::OnPluginDestroyed(int instance_id) { 722 void BrowserPluginGuest::OnPluginDestroyed(int instance_id) {
751 Destroy(); 723 Destroy();
752 } 724 }
753 725
754 void BrowserPluginGuest::OnResizeGuest( 726 void BrowserPluginGuest::OnResizeGuest(
755 int instance_id, 727 int instance_id,
756 const BrowserPluginHostMsg_ResizeGuest_Params& params) { 728 const BrowserPluginHostMsg_ResizeGuest_Params& params) {
757 if (!params.size_changed) 729 if (!params.size_changed)
758 return; 730 return;
759 // BrowserPlugin manages resize flow control itself and does not depend 731 // BrowserPlugin manages resize flow control itself and does not depend
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
969 void BrowserPluginGuest::OnImeCompositionRangeChanged( 941 void BrowserPluginGuest::OnImeCompositionRangeChanged(
970 const gfx::Range& range, 942 const gfx::Range& range,
971 const std::vector<gfx::Rect>& character_bounds) { 943 const std::vector<gfx::Rect>& character_bounds) {
972 static_cast<RenderWidgetHostViewBase*>( 944 static_cast<RenderWidgetHostViewBase*>(
973 web_contents()->GetRenderWidgetHostView())->ImeCompositionRangeChanged( 945 web_contents()->GetRenderWidgetHostView())->ImeCompositionRangeChanged(
974 range, character_bounds); 946 range, character_bounds);
975 } 947 }
976 #endif 948 #endif
977 949
978 } // namespace content 950 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698