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

Side by Side Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 16431010: Refactor RenderProcessHost to use IPC::Listener instead of RenderWidgetHost (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix cleanup crashes. Created 7 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 | Annotate | Revision Log
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 // Represents the browser side of the browser <--> renderer communication 5 // Represents the browser side of the browser <--> renderer communication
6 // channel. There will be one RenderProcessHost per renderer process. 6 // channel. There will be one RenderProcessHost per renderer process.
7 7
8 #include "content/browser/renderer_host/render_process_host_impl.h" 8 #include "content/browser/renderer_host/render_process_host_impl.h"
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 #include "content/common/child_process_messages.h" 98 #include "content/common/child_process_messages.h"
99 #include "content/common/gpu/gpu_messages.h" 99 #include "content/common/gpu/gpu_messages.h"
100 #include "content/common/resource_messages.h" 100 #include "content/common/resource_messages.h"
101 #include "content/common/view_messages.h" 101 #include "content/common/view_messages.h"
102 #include "content/port/browser/render_widget_host_view_frame_subscriber.h" 102 #include "content/port/browser/render_widget_host_view_frame_subscriber.h"
103 #include "content/public/browser/browser_context.h" 103 #include "content/public/browser/browser_context.h"
104 #include "content/public/browser/content_browser_client.h" 104 #include "content/public/browser/content_browser_client.h"
105 #include "content/public/browser/notification_service.h" 105 #include "content/public/browser/notification_service.h"
106 #include "content/public/browser/notification_types.h" 106 #include "content/public/browser/notification_types.h"
107 #include "content/public/browser/render_process_host_factory.h" 107 #include "content/public/browser/render_process_host_factory.h"
108 #include "content/public/browser/render_widget_host.h"
108 #include "content/public/browser/resource_context.h" 109 #include "content/public/browser/resource_context.h"
109 #include "content/public/browser/user_metrics.h" 110 #include "content/public/browser/user_metrics.h"
110 #include "content/public/common/content_constants.h" 111 #include "content/public/common/content_constants.h"
111 #include "content/public/common/content_switches.h" 112 #include "content/public/common/content_switches.h"
112 #include "content/public/common/process_type.h" 113 #include "content/public/common/process_type.h"
113 #include "content/public/common/result_codes.h" 114 #include "content/public/common/result_codes.h"
114 #include "content/public/common/url_constants.h" 115 #include "content/public/common/url_constants.h"
115 #include "content/renderer/render_process_impl.h" 116 #include "content/renderer/render_process_impl.h"
116 #include "content/renderer/render_thread_impl.h" 117 #include "content/renderer/render_thread_impl.h"
117 #include "gpu/command_buffer/service/gpu_switches.h" 118 #include "gpu/command_buffer/service/gpu_switches.h"
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 if (CommandLine::ForCurrentProcess()->HasSwitch( 710 if (CommandLine::ForCurrentProcess()->HasSwitch(
710 switches::kEnableMemoryBenchmarking)) 711 switches::kEnableMemoryBenchmarking))
711 channel_->AddFilter(new MemoryBenchmarkMessageFilter()); 712 channel_->AddFilter(new MemoryBenchmarkMessageFilter());
712 #endif 713 #endif
713 } 714 }
714 715
715 int RenderProcessHostImpl::GetNextRoutingID() { 716 int RenderProcessHostImpl::GetNextRoutingID() {
716 return widget_helper_->GetNextRoutingID(); 717 return widget_helper_->GetNextRoutingID();
717 } 718 }
718 719
720 void RenderProcessHostImpl::AddRoute(
721 int32 routing_id,
722 IPC::Listener* listener) {
723 listeners_.AddWithID(listener, routing_id);
724 }
725
726 void RenderProcessHostImpl::RemoveRoute(int32 routing_id) {
727 DCHECK(listeners_.Lookup(routing_id) != NULL);
728 listeners_.Remove(routing_id);
729
730 #if defined(OS_WIN)
731 // Dump the handle table if handle auditing is enabled.
732 const CommandLine& browser_command_line =
733 *CommandLine::ForCurrentProcess();
734 if (browser_command_line.HasSwitch(switches::kAuditHandles) ||
735 browser_command_line.HasSwitch(switches::kAuditAllHandles)) {
736 DumpHandles();
737
738 // We wait to close the channels until the child process has finished
739 // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone.
740 return;
741 }
742 #endif
743 // Keep the one renderer thread around forever in single process mode.
744 if (!run_renderer_in_process())
745 Cleanup();
746 }
747
719 void RenderProcessHostImpl::SimulateSwapOutACK( 748 void RenderProcessHostImpl::SimulateSwapOutACK(
720 const ViewMsg_SwapOut_Params& params) { 749 const ViewMsg_SwapOut_Params& params) {
721 widget_helper_->SimulateSwapOutACK(params); 750 widget_helper_->SimulateSwapOutACK(params);
722 } 751 }
723 752
724 bool RenderProcessHostImpl::WaitForBackingStoreMsg( 753 bool RenderProcessHostImpl::WaitForBackingStoreMsg(
725 int render_widget_id, 754 int render_widget_id,
726 const base::TimeDelta& max_delay, 755 const base::TimeDelta& max_delay,
727 IPC::Message* msg) { 756 IPC::Message* msg) {
728 // The post task to this thread with the process id could be in queue, and we 757 // The post task to this thread with the process id could be in queue, and we
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
1191 if (!msg_is_ok) { 1220 if (!msg_is_ok) {
1192 // The message had a handler, but its de-serialization failed. 1221 // The message had a handler, but its de-serialization failed.
1193 // We consider this a capital crime. Kill the renderer if we have one. 1222 // We consider this a capital crime. Kill the renderer if we have one.
1194 LOG(ERROR) << "bad message " << msg.type() << " terminating renderer."; 1223 LOG(ERROR) << "bad message " << msg.type() << " terminating renderer.";
1195 RecordAction(UserMetricsAction("BadMessageTerminate_BRPH")); 1224 RecordAction(UserMetricsAction("BadMessageTerminate_BRPH"));
1196 ReceivedBadMessage(); 1225 ReceivedBadMessage();
1197 } 1226 }
1198 return true; 1227 return true;
1199 } 1228 }
1200 1229
1201 // Dispatch incoming messages to the appropriate RenderView/WidgetHost. 1230 // Dispatch incoming messages to the appropriate IPC::Listener.
1202 RenderWidgetHost* rwh = render_widget_hosts_.Lookup(msg.routing_id()); 1231 IPC::Listener* listener = listeners_.Lookup(msg.routing_id());
1203 if (!rwh) { 1232 if (!listener) {
1204 if (msg.is_sync()) { 1233 if (msg.is_sync()) {
1205 // The listener has gone away, so we must respond or else the caller will 1234 // The listener has gone away, so we must respond or else the caller will
1206 // hang waiting for a reply. 1235 // hang waiting for a reply.
1207 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); 1236 IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg);
1208 reply->set_reply_error(); 1237 reply->set_reply_error();
1209 Send(reply); 1238 Send(reply);
1210 } 1239 }
1211 1240
1212 // If this is a SwapBuffers, we need to ack it if we're not going to handle 1241 // If this is a SwapBuffers, we need to ack it if we're not going to handle
1213 // it so that the GPU process doesn't get stuck in unscheduled state. 1242 // it so that the GPU process doesn't get stuck in unscheduled state.
1214 bool msg_is_ok = true; 1243 bool msg_is_ok = true;
1215 IPC_BEGIN_MESSAGE_MAP_EX(RenderProcessHostImpl, msg, msg_is_ok) 1244 IPC_BEGIN_MESSAGE_MAP_EX(RenderProcessHostImpl, msg, msg_is_ok)
1216 IPC_MESSAGE_HANDLER(ViewHostMsg_CompositorSurfaceBuffersSwapped, 1245 IPC_MESSAGE_HANDLER(ViewHostMsg_CompositorSurfaceBuffersSwapped,
1217 OnCompositorSurfaceBuffersSwappedNoHost) 1246 OnCompositorSurfaceBuffersSwappedNoHost)
1218 IPC_END_MESSAGE_MAP_EX() 1247 IPC_END_MESSAGE_MAP_EX()
1219 return true; 1248 return true;
1220 } 1249 }
1221 return RenderWidgetHostImpl::From(rwh)->OnMessageReceived(msg); 1250 return listener->OnMessageReceived(msg);
1222 } 1251 }
1223 1252
1224 void RenderProcessHostImpl::OnChannelConnected(int32 peer_pid) { 1253 void RenderProcessHostImpl::OnChannelConnected(int32 peer_pid) {
1225 #if defined(IPC_MESSAGE_LOG_ENABLED) 1254 #if defined(IPC_MESSAGE_LOG_ENABLED)
1226 Send(new ChildProcessMsg_SetIPCLoggingEnabled( 1255 Send(new ChildProcessMsg_SetIPCLoggingEnabled(
1227 IPC::Logging::GetInstance()->Enabled())); 1256 IPC::Logging::GetInstance()->Enabled()));
1228 #endif 1257 #endif
1229 1258
1230 tracked_objects::ThreadData::Status status = 1259 tracked_objects::ThreadData::Status status =
1231 tracked_objects::ThreadData::status(); 1260 tracked_objects::ThreadData::status();
(...skipping 14 matching lines...) Expand all
1246 } 1275 }
1247 1276
1248 int RenderProcessHostImpl::GetID() const { 1277 int RenderProcessHostImpl::GetID() const {
1249 return id_; 1278 return id_;
1250 } 1279 }
1251 1280
1252 bool RenderProcessHostImpl::HasConnection() const { 1281 bool RenderProcessHostImpl::HasConnection() const {
1253 return channel_.get() != NULL; 1282 return channel_.get() != NULL;
1254 } 1283 }
1255 1284
1256 RenderWidgetHost* RenderProcessHostImpl::GetRenderWidgetHostByID(
1257 int routing_id) {
1258 return render_widget_hosts_.Lookup(routing_id);
1259 }
1260
1261 void RenderProcessHostImpl::SetIgnoreInputEvents(bool ignore_input_events) { 1285 void RenderProcessHostImpl::SetIgnoreInputEvents(bool ignore_input_events) {
1262 ignore_input_events_ = ignore_input_events; 1286 ignore_input_events_ = ignore_input_events;
1263 } 1287 }
1264 1288
1265 bool RenderProcessHostImpl::IgnoreInputEvents() const { 1289 bool RenderProcessHostImpl::IgnoreInputEvents() const {
1266 return ignore_input_events_; 1290 return ignore_input_events_;
1267 } 1291 }
1268 1292
1293 /*
1269 void RenderProcessHostImpl::Attach(RenderWidgetHost* host, 1294 void RenderProcessHostImpl::Attach(RenderWidgetHost* host,
1270 int routing_id) { 1295 int routing_id) {
1271 render_widget_hosts_.AddWithID(host, routing_id); 1296 render_widget_hosts_.AddWithID(host, routing_id);
1272 } 1297 }
1298 */
1273 1299
1300 /*
1274 void RenderProcessHostImpl::Release(int routing_id) { 1301 void RenderProcessHostImpl::Release(int routing_id) {
1275 DCHECK(render_widget_hosts_.Lookup(routing_id) != NULL); 1302 DCHECK(render_widget_hosts_.Lookup(routing_id) != NULL);
1276 render_widget_hosts_.Remove(routing_id); 1303 render_widget_hosts_.Remove(routing_id);
1277 1304
1278 #if defined(OS_WIN) 1305 #if defined(OS_WIN)
1279 // Dump the handle table if handle auditing is enabled. 1306 // Dump the handle table if handle auditing is enabled.
1280 const CommandLine& browser_command_line = 1307 const CommandLine& browser_command_line =
1281 *CommandLine::ForCurrentProcess(); 1308 *CommandLine::ForCurrentProcess();
1282 if (browser_command_line.HasSwitch(switches::kAuditHandles) || 1309 if (browser_command_line.HasSwitch(switches::kAuditHandles) ||
1283 browser_command_line.HasSwitch(switches::kAuditAllHandles)) { 1310 browser_command_line.HasSwitch(switches::kAuditAllHandles)) {
1284 DumpHandles(); 1311 DumpHandles();
1285 1312
1286 // We wait to close the channels until the child process has finished 1313 // We wait to close the channels until the child process has finished
1287 // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone. 1314 // dumping handles and sends us ChildProcessHostMsg_DumpHandlesDone.
1288 return; 1315 return;
1289 } 1316 }
1290 #endif 1317 #endif
1291 // Keep the one renderer thread around forever in single process mode. 1318 // Keep the one renderer thread around forever in single process mode.
1292 if (!run_renderer_in_process()) 1319 if (!run_renderer_in_process())
1293 Cleanup(); 1320 Cleanup();
1294 } 1321 }
1322 */
1295 1323
1296 void RenderProcessHostImpl::Cleanup() { 1324 void RenderProcessHostImpl::Cleanup() {
1297 // When no other owners of this object, we can delete ourselves 1325 // When no other owners of this object, we can delete ourselves
1298 if (render_widget_hosts_.IsEmpty()) { 1326 if (listeners_.IsEmpty()) {
1299 DCHECK_EQ(0, pending_views_); 1327 DCHECK_EQ(0, pending_views_);
1300 NotificationService::current()->Notify( 1328 NotificationService::current()->Notify(
1301 NOTIFICATION_RENDERER_PROCESS_TERMINATED, 1329 NOTIFICATION_RENDERER_PROCESS_TERMINATED,
1302 Source<RenderProcessHost>(this), 1330 Source<RenderProcessHost>(this),
1303 NotificationService::NoDetails()); 1331 NotificationService::NoDetails());
1304 1332
1305 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); 1333 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
1306 deleting_soon_ = true; 1334 deleting_soon_ = true;
1307 // It's important not to wait for the DeleteTask to delete the channel 1335 // It's important not to wait for the DeleteTask to delete the channel
1308 // proxy. Kill it off now. That way, in case the profile is going away, the 1336 // proxy. Kill it off now. That way, in case the profile is going away, the
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1349 } 1377 }
1350 1378
1351 void RenderProcessHostImpl::ResumeRequestsForView(int route_id) { 1379 void RenderProcessHostImpl::ResumeRequestsForView(int route_id) {
1352 widget_helper_->ResumeRequestsForView(route_id); 1380 widget_helper_->ResumeRequestsForView(route_id);
1353 } 1381 }
1354 1382
1355 IPC::ChannelProxy* RenderProcessHostImpl::GetChannel() { 1383 IPC::ChannelProxy* RenderProcessHostImpl::GetChannel() {
1356 return channel_.get(); 1384 return channel_.get();
1357 } 1385 }
1358 1386
1359 RenderProcessHost::RenderWidgetHostsIterator
1360 RenderProcessHostImpl::GetRenderWidgetHostsIterator() {
1361 return RenderWidgetHostsIterator(&render_widget_hosts_);
1362 }
1363
1364 bool RenderProcessHostImpl::FastShutdownForPageCount(size_t count) { 1387 bool RenderProcessHostImpl::FastShutdownForPageCount(size_t count) {
1365 if (render_widget_hosts_.size() == count) 1388 if (listeners_.size() == count)
1366 return FastShutdownIfPossible(); 1389 return FastShutdownIfPossible();
1367 return false; 1390 return false;
1368 } 1391 }
1369 1392
1370 bool RenderProcessHostImpl::FastShutdownStarted() const { 1393 bool RenderProcessHostImpl::FastShutdownStarted() const {
1371 return fast_shutdown_started_; 1394 return fast_shutdown_started_;
1372 } 1395 }
1373 1396
1374 // static 1397 // static
1375 void RenderProcessHostImpl::RegisterHost(int host_id, RenderProcessHost* host) { 1398 void RenderProcessHostImpl::RegisterHost(int host_id, RenderProcessHost* host) {
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 RendererClosedDetails details(GetHandle(), status, exit_code); 1639 RendererClosedDetails details(GetHandle(), status, exit_code);
1617 NotificationService::current()->Notify( 1640 NotificationService::current()->Notify(
1618 NOTIFICATION_RENDERER_PROCESS_CLOSED, 1641 NOTIFICATION_RENDERER_PROCESS_CLOSED,
1619 Source<RenderProcessHost>(this), 1642 Source<RenderProcessHost>(this),
1620 Details<RendererClosedDetails>(&details)); 1643 Details<RendererClosedDetails>(&details));
1621 1644
1622 child_process_launcher_.reset(); 1645 child_process_launcher_.reset();
1623 channel_.reset(); 1646 channel_.reset();
1624 gpu_message_filter_ = NULL; 1647 gpu_message_filter_ = NULL;
1625 1648
1626 IDMap<RenderWidgetHost>::iterator iter(&render_widget_hosts_); 1649 scoped_ptr<RenderWidgetHost::List> hosts =
1627 while (!iter.IsAtEnd()) { 1650 RenderWidgetHost::GetRenderWidgetHosts();
1628 RenderWidgetHostImpl::From(iter.GetCurrentValue())->OnMessageReceived( 1651 for (RenderWidgetHost::List::const_iterator it = hosts->begin();
1629 ViewHostMsg_RenderViewGone(iter.GetCurrentKey(), 1652 it != hosts->end();
1630 static_cast<int>(status), 1653 ++it) {
1631 exit_code)); 1654 const RenderWidgetHost* widget = *it;
1632 iter.Advance(); 1655 if (widget->GetProcess()->GetID() != GetID())
1656 continue;
1657 RenderWidgetHostImpl::From(
1658 const_cast<RenderWidgetHost*>(widget))->OnMessageReceived(
1659 ViewHostMsg_RenderViewGone(widget->GetRoutingID(),
1660 static_cast<int>(status),
1661 exit_code));
1662
1633 } 1663 }
1634 1664
1635 ClearTransportDIBCache(); 1665 ClearTransportDIBCache();
1636 1666
1637 // this object is not deleted at this point and may be reused later. 1667 // this object is not deleted at this point and may be reused later.
1638 // TODO(darin): clean this up 1668 // TODO(darin): clean this up
1639 } 1669 }
1640 1670
1641 int RenderProcessHostImpl::GetActiveViewCount() { 1671 int RenderProcessHostImpl::GetActiveViewCount() {
1642 int num_active_views = 0; 1672 int num_active_views = 0;
1643 for (RenderWidgetHostsIterator iter = GetRenderWidgetHostsIterator(); 1673
1644 !iter.IsAtEnd(); 1674 //typedef std::vector<RenderWidgetHost*> RenderWidgetHostList;
1645 iter.Advance()) { 1675 scoped_ptr<RenderWidgetHost::List> hosts =
1646 const RenderWidgetHost* widget = iter.GetCurrentValue(); 1676 RenderWidgetHost::GetRenderWidgetHosts();
1677
1678 for (RenderWidgetHost::List::const_iterator it = hosts->begin();
1679 it != hosts->end();
1680 ++it) {
1681 const RenderWidgetHost* widget = *it;
1647 DCHECK(widget); 1682 DCHECK(widget);
1648 if (!widget) 1683 if (!widget)
1649 continue; 1684 continue;
1650 1685
1686 // Count only RenderWidgetHosts in this process.
1687 if (widget->GetProcess()->GetID() != GetID())
1688 continue;
1689
1651 // All RenderWidgetHosts are swapped in. 1690 // All RenderWidgetHosts are swapped in.
1652 if (!widget->IsRenderView()) { 1691 if (!widget->IsRenderView()) {
1653 num_active_views++; 1692 num_active_views++;
1654 continue; 1693 continue;
1655 } 1694 }
1656 1695
1657 // Don't count swapped out views. 1696 // Don't count swapped out views.
1658 RenderViewHost* rvh = 1697 RenderViewHost* rvh =
1659 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget)); 1698 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget));
1660 if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out()) 1699 if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out())
1661 num_active_views++; 1700 num_active_views++;
1662 } 1701 }
1702
1663 return num_active_views; 1703 return num_active_views;
1664 } 1704 }
1665 1705
1666 // Frame subscription API for this class is for accelerated composited path 1706 // Frame subscription API for this class is for accelerated composited path
1667 // only. These calls are redirected to GpuMessageFilter. 1707 // only. These calls are redirected to GpuMessageFilter.
1668 void RenderProcessHostImpl::BeginFrameSubscription( 1708 void RenderProcessHostImpl::BeginFrameSubscription(
1669 int route_id, 1709 int route_id,
1670 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { 1710 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) {
1671 if (!gpu_message_filter_) 1711 if (!gpu_message_filter_)
1672 return; 1712 return;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1782 TRACE_EVENT0("renderer_host", 1822 TRACE_EVENT0("renderer_host",
1783 "RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwappedNoHost"); 1823 "RenderWidgetHostImpl::OnCompositorSurfaceBuffersSwappedNoHost");
1784 AcceleratedSurfaceMsg_BufferPresented_Params ack_params; 1824 AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
1785 ack_params.sync_point = 0; 1825 ack_params.sync_point = 0;
1786 RenderWidgetHostImpl::AcknowledgeBufferPresent(params.route_id, 1826 RenderWidgetHostImpl::AcknowledgeBufferPresent(params.route_id,
1787 params.gpu_process_host_id, 1827 params.gpu_process_host_id,
1788 ack_params); 1828 ack_params);
1789 } 1829 }
1790 1830
1791 void RenderProcessHostImpl::OnGpuSwitching() { 1831 void RenderProcessHostImpl::OnGpuSwitching() {
1792 for (RenderWidgetHostsIterator iter = GetRenderWidgetHostsIterator(); 1832 scoped_ptr<RenderWidgetHost::List> hosts =
1793 !iter.IsAtEnd(); 1833 RenderWidgetHost::GetRenderWidgetHosts();
1794 iter.Advance()) { 1834
1795 const RenderWidgetHost* widget = iter.GetCurrentValue(); 1835 for (RenderWidgetHost::List::const_iterator it = hosts->begin();
1836 it != hosts->end();
1837 ++it) {
1838 const RenderWidgetHost* widget = *it;
1796 DCHECK(widget); 1839 DCHECK(widget);
1797 if (!widget || !widget->IsRenderView()) 1840 if (!widget || !widget->IsRenderView())
1798 continue; 1841 continue;
1799 1842
1843 // Skip widgest in other processes.
1844 if (widget->GetProcess()->GetID() != GetID())
1845 continue;
1846
1800 RenderViewHost* rvh = 1847 RenderViewHost* rvh =
1801 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget)); 1848 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget));
1802 1849
1803 rvh->UpdateWebkitPreferences(rvh->GetWebkitPreferences()); 1850 rvh->UpdateWebkitPreferences(rvh->GetWebkitPreferences());
1804 } 1851 }
1805 } 1852 }
1806 1853
1807 } // namespace content 1854 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698