OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "content/browser/frame_host/render_frame_host_impl.h" | 5 #include "content/browser/frame_host/render_frame_host_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/containers/hash_tables.h" | 8 #include "base/containers/hash_tables.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
11 #include "base/process/kill.h" | 11 #include "base/process/kill.h" |
12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
| 13 #include "build/build_config.h" |
13 #include "content/browser/accessibility/accessibility_mode_helper.h" | 14 #include "content/browser/accessibility/accessibility_mode_helper.h" |
14 #include "content/browser/accessibility/ax_tree_id_registry.h" | 15 #include "content/browser/accessibility/ax_tree_id_registry.h" |
15 #include "content/browser/accessibility/browser_accessibility_manager.h" | 16 #include "content/browser/accessibility/browser_accessibility_manager.h" |
16 #include "content/browser/accessibility/browser_accessibility_state_impl.h" | 17 #include "content/browser/accessibility/browser_accessibility_state_impl.h" |
17 #include "content/browser/child_process_security_policy_impl.h" | 18 #include "content/browser/child_process_security_policy_impl.h" |
18 #include "content/browser/child_process_security_policy_impl.h" | 19 #include "content/browser/child_process_security_policy_impl.h" |
19 #include "content/browser/devtools/render_frame_devtools_agent_host.h" | 20 #include "content/browser/devtools/render_frame_devtools_agent_host.h" |
20 #include "content/browser/download/mhtml_generation_manager.h" | 21 #include "content/browser/download/mhtml_generation_manager.h" |
21 #include "content/browser/frame_host/cross_process_frame_connector.h" | 22 #include "content/browser/frame_host/cross_process_frame_connector.h" |
22 #include "content/browser/frame_host/cross_site_transferring_request.h" | 23 #include "content/browser/frame_host/cross_site_transferring_request.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 int g_next_accessibility_reset_token = 1; | 99 int g_next_accessibility_reset_token = 1; |
99 | 100 |
100 // The next value to use for the javascript callback id. | 101 // The next value to use for the javascript callback id. |
101 int g_next_javascript_callback_id = 1; | 102 int g_next_javascript_callback_id = 1; |
102 | 103 |
103 // Whether to allow injecting javascript into any kind of frame (for Android | 104 // Whether to allow injecting javascript into any kind of frame (for Android |
104 // WebView). | 105 // WebView). |
105 bool g_allow_injecting_javascript = false; | 106 bool g_allow_injecting_javascript = false; |
106 | 107 |
107 // The (process id, routing id) pair that identifies one RenderFrame. | 108 // The (process id, routing id) pair that identifies one RenderFrame. |
108 typedef std::pair<int32, int32> RenderFrameHostID; | 109 typedef std::pair<int32_t, int32_t> RenderFrameHostID; |
109 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> | 110 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> |
110 RoutingIDFrameMap; | 111 RoutingIDFrameMap; |
111 base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = | 112 base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map = |
112 LAZY_INSTANCE_INITIALIZER; | 113 LAZY_INSTANCE_INITIALIZER; |
113 | 114 |
114 // Translate a WebKit text direction into a base::i18n one. | 115 // Translate a WebKit text direction into a base::i18n one. |
115 base::i18n::TextDirection WebTextDirectionToChromeTextDirection( | 116 base::i18n::TextDirection WebTextDirectionToChromeTextDirection( |
116 blink::WebTextDirection dir) { | 117 blink::WebTextDirection dir) { |
117 switch (dir) { | 118 switch (dir) { |
118 case blink::WebTextDirectionLeftToRight: | 119 case blink::WebTextDirectionLeftToRight: |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); | 170 AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); |
170 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); | 171 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); |
171 } | 172 } |
172 | 173 |
173 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, | 174 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
174 RenderViewHostImpl* render_view_host, | 175 RenderViewHostImpl* render_view_host, |
175 RenderFrameHostDelegate* delegate, | 176 RenderFrameHostDelegate* delegate, |
176 RenderWidgetHostDelegate* rwh_delegate, | 177 RenderWidgetHostDelegate* rwh_delegate, |
177 FrameTree* frame_tree, | 178 FrameTree* frame_tree, |
178 FrameTreeNode* frame_tree_node, | 179 FrameTreeNode* frame_tree_node, |
179 int32 routing_id, | 180 int32_t routing_id, |
180 int32 widget_routing_id, | 181 int32_t widget_routing_id, |
181 int flags) | 182 int flags) |
182 : render_view_host_(render_view_host), | 183 : render_view_host_(render_view_host), |
183 delegate_(delegate), | 184 delegate_(delegate), |
184 site_instance_(static_cast<SiteInstanceImpl*>(site_instance)), | 185 site_instance_(static_cast<SiteInstanceImpl*>(site_instance)), |
185 process_(site_instance->GetProcess()), | 186 process_(site_instance->GetProcess()), |
186 cross_process_frame_connector_(NULL), | 187 cross_process_frame_connector_(NULL), |
187 render_frame_proxy_host_(NULL), | 188 render_frame_proxy_host_(NULL), |
188 frame_tree_(frame_tree), | 189 frame_tree_(frame_tree), |
189 frame_tree_node_(frame_tree_node), | 190 frame_tree_node_(frame_tree_node), |
190 render_widget_host_(nullptr), | 191 render_widget_host_(nullptr), |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 render_widget_host_->InitForFrame(); | 762 render_widget_host_->InitForFrame(); |
762 } | 763 } |
763 | 764 |
764 void RenderFrameHostImpl::Init() { | 765 void RenderFrameHostImpl::Init() { |
765 // TODO(csharrison): Call GetProcess()->ResumeRequestsForFrame(routing_id_) | 766 // TODO(csharrison): Call GetProcess()->ResumeRequestsForFrame(routing_id_) |
766 // once ResourceDispatcherHostImpl is keyed on render frame routing ids | 767 // once ResourceDispatcherHostImpl is keyed on render frame routing ids |
767 // instead of render view routing ids. | 768 // instead of render view routing ids. |
768 } | 769 } |
769 | 770 |
770 void RenderFrameHostImpl::OnAddMessageToConsole( | 771 void RenderFrameHostImpl::OnAddMessageToConsole( |
771 int32 level, | 772 int32_t level, |
772 const base::string16& message, | 773 const base::string16& message, |
773 int32 line_no, | 774 int32_t line_no, |
774 const base::string16& source_id) { | 775 const base::string16& source_id) { |
775 if (delegate_->AddMessageToConsole(level, message, line_no, source_id)) | 776 if (delegate_->AddMessageToConsole(level, message, line_no, source_id)) |
776 return; | 777 return; |
777 | 778 |
778 // Pass through log level only on WebUI pages to limit console spew. | 779 // Pass through log level only on WebUI pages to limit console spew. |
779 const bool is_web_ui = | 780 const bool is_web_ui = |
780 HasWebUIScheme(delegate_->GetMainFrameLastCommittedURL()); | 781 HasWebUIScheme(delegate_->GetMainFrameLastCommittedURL()); |
781 const int32 resolved_level = is_web_ui ? level : ::logging::LOG_INFO; | 782 const int32_t resolved_level = is_web_ui ? level : ::logging::LOG_INFO; |
782 | 783 |
783 // LogMessages can be persisted so this shouldn't be logged in incognito mode. | 784 // LogMessages can be persisted so this shouldn't be logged in incognito mode. |
784 // This rule is not applied to WebUI pages, because source code of WebUI is a | 785 // This rule is not applied to WebUI pages, because source code of WebUI is a |
785 // part of Chrome source code, and we want to treat messages from WebUI the | 786 // part of Chrome source code, and we want to treat messages from WebUI the |
786 // same way as we treat log messages from native code. | 787 // same way as we treat log messages from native code. |
787 if (::logging::GetMinLogLevel() <= resolved_level && | 788 if (::logging::GetMinLogLevel() <= resolved_level && |
788 (is_web_ui || | 789 (is_web_ui || |
789 !GetSiteInstance()->GetBrowserContext()->IsOffTheRecord())) { | 790 !GetSiteInstance()->GetBrowserContext()->IsOffTheRecord())) { |
790 logging::LogMessage("CONSOLE", line_no, resolved_level).stream() | 791 logging::LogMessage("CONSOLE", line_no, resolved_level).stream() |
791 << "\"" << message << "\", source: " << source_id << " (" << line_no | 792 << "\"" << message << "\", source: " << source_id << " (" << line_no |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1327 std::map<int, JavaScriptResultCallback>::iterator it = | 1328 std::map<int, JavaScriptResultCallback>::iterator it = |
1328 javascript_callbacks_.find(id); | 1329 javascript_callbacks_.find(id); |
1329 if (it != javascript_callbacks_.end()) { | 1330 if (it != javascript_callbacks_.end()) { |
1330 it->second.Run(result_value); | 1331 it->second.Run(result_value); |
1331 javascript_callbacks_.erase(it); | 1332 javascript_callbacks_.erase(it); |
1332 } else { | 1333 } else { |
1333 NOTREACHED() << "Received script response for unknown request"; | 1334 NOTREACHED() << "Received script response for unknown request"; |
1334 } | 1335 } |
1335 } | 1336 } |
1336 | 1337 |
1337 void RenderFrameHostImpl::OnVisualStateResponse(uint64 id) { | 1338 void RenderFrameHostImpl::OnVisualStateResponse(uint64_t id) { |
1338 auto it = visual_state_callbacks_.find(id); | 1339 auto it = visual_state_callbacks_.find(id); |
1339 if (it != visual_state_callbacks_.end()) { | 1340 if (it != visual_state_callbacks_.end()) { |
1340 it->second.Run(true); | 1341 it->second.Run(true); |
1341 visual_state_callbacks_.erase(it); | 1342 visual_state_callbacks_.erase(it); |
1342 } else { | 1343 } else { |
1343 NOTREACHED() << "Received script response for unknown request"; | 1344 NOTREACHED() << "Received script response for unknown request"; |
1344 } | 1345 } |
1345 } | 1346 } |
1346 | 1347 |
1347 void RenderFrameHostImpl::OnRunJavaScriptMessage( | 1348 void RenderFrameHostImpl::OnRunJavaScriptMessage( |
(...skipping 27 matching lines...) Expand all Loading... |
1375 size_t start_offset, | 1376 size_t start_offset, |
1376 size_t end_offset) { | 1377 size_t end_offset) { |
1377 render_view_host_->OnTextSurroundingSelectionResponse( | 1378 render_view_host_->OnTextSurroundingSelectionResponse( |
1378 content, start_offset, end_offset); | 1379 content, start_offset, end_offset); |
1379 } | 1380 } |
1380 | 1381 |
1381 void RenderFrameHostImpl::OnDidAccessInitialDocument() { | 1382 void RenderFrameHostImpl::OnDidAccessInitialDocument() { |
1382 delegate_->DidAccessInitialDocument(); | 1383 delegate_->DidAccessInitialDocument(); |
1383 } | 1384 } |
1384 | 1385 |
1385 void RenderFrameHostImpl::OnDidChangeOpener(int32 opener_routing_id) { | 1386 void RenderFrameHostImpl::OnDidChangeOpener(int32_t opener_routing_id) { |
1386 frame_tree_node_->render_manager()->DidChangeOpener(opener_routing_id, | 1387 frame_tree_node_->render_manager()->DidChangeOpener(opener_routing_id, |
1387 GetSiteInstance()); | 1388 GetSiteInstance()); |
1388 } | 1389 } |
1389 | 1390 |
1390 void RenderFrameHostImpl::OnDidChangeName(const std::string& name) { | 1391 void RenderFrameHostImpl::OnDidChangeName(const std::string& name) { |
1391 std::string old_name = frame_tree_node()->frame_name(); | 1392 std::string old_name = frame_tree_node()->frame_name(); |
1392 frame_tree_node()->SetFrameName(name); | 1393 frame_tree_node()->SetFrameName(name); |
1393 if (old_name.empty() && !name.empty()) | 1394 if (old_name.empty() && !name.empty()) |
1394 frame_tree_node_->render_manager()->CreateProxiesForNewNamedFrame(); | 1395 frame_tree_node_->render_manager()->CreateProxiesForNewNamedFrame(); |
1395 delegate_->DidChangeName(this, name); | 1396 delegate_->DidChangeName(this, name); |
1396 } | 1397 } |
1397 | 1398 |
1398 void RenderFrameHostImpl::OnEnforceStrictMixedContentChecking() { | 1399 void RenderFrameHostImpl::OnEnforceStrictMixedContentChecking() { |
1399 frame_tree_node()->SetEnforceStrictMixedContentChecking(true); | 1400 frame_tree_node()->SetEnforceStrictMixedContentChecking(true); |
1400 } | 1401 } |
1401 | 1402 |
1402 void RenderFrameHostImpl::OnDidAssignPageId(int32 page_id) { | 1403 void RenderFrameHostImpl::OnDidAssignPageId(int32_t page_id) { |
1403 // Update the RVH's current page ID so that future IPCs from the renderer | 1404 // Update the RVH's current page ID so that future IPCs from the renderer |
1404 // correspond to the new page. | 1405 // correspond to the new page. |
1405 render_view_host_->page_id_ = page_id; | 1406 render_view_host_->page_id_ = page_id; |
1406 } | 1407 } |
1407 | 1408 |
1408 FrameTreeNode* RenderFrameHostImpl::FindAndVerifyChild( | 1409 FrameTreeNode* RenderFrameHostImpl::FindAndVerifyChild( |
1409 int32 child_frame_routing_id, | 1410 int32_t child_frame_routing_id, |
1410 bad_message::BadMessageReason reason) { | 1411 bad_message::BadMessageReason reason) { |
1411 FrameTreeNode* child = frame_tree_node()->frame_tree()->FindByRoutingID( | 1412 FrameTreeNode* child = frame_tree_node()->frame_tree()->FindByRoutingID( |
1412 GetProcess()->GetID(), child_frame_routing_id); | 1413 GetProcess()->GetID(), child_frame_routing_id); |
1413 // A race can result in |child| to be nullptr. Avoid killing the renderer in | 1414 // A race can result in |child| to be nullptr. Avoid killing the renderer in |
1414 // that case. | 1415 // that case. |
1415 if (child && child->parent() != frame_tree_node()) { | 1416 if (child && child->parent() != frame_tree_node()) { |
1416 bad_message::ReceivedBadMessage(GetProcess(), reason); | 1417 bad_message::ReceivedBadMessage(GetProcess(), reason); |
1417 return nullptr; | 1418 return nullptr; |
1418 } | 1419 } |
1419 return child; | 1420 return child; |
1420 } | 1421 } |
1421 | 1422 |
1422 void RenderFrameHostImpl::OnDidChangeSandboxFlags( | 1423 void RenderFrameHostImpl::OnDidChangeSandboxFlags( |
1423 int32 frame_routing_id, | 1424 int32_t frame_routing_id, |
1424 blink::WebSandboxFlags flags) { | 1425 blink::WebSandboxFlags flags) { |
1425 // Ensure that a frame can only update sandbox flags for its immediate | 1426 // Ensure that a frame can only update sandbox flags for its immediate |
1426 // children. If this is not the case, the renderer is considered malicious | 1427 // children. If this is not the case, the renderer is considered malicious |
1427 // and is killed. | 1428 // and is killed. |
1428 FrameTreeNode* child = FindAndVerifyChild( | 1429 FrameTreeNode* child = FindAndVerifyChild( |
1429 frame_routing_id, bad_message::RFH_SANDBOX_FLAGS); | 1430 frame_routing_id, bad_message::RFH_SANDBOX_FLAGS); |
1430 if (!child) | 1431 if (!child) |
1431 return; | 1432 return; |
1432 | 1433 |
1433 child->set_sandbox_flags(flags); | 1434 child->set_sandbox_flags(flags); |
1434 | 1435 |
1435 // Notify the RenderFrame if it lives in a different process from its | 1436 // Notify the RenderFrame if it lives in a different process from its |
1436 // parent. The frame's proxies in other processes also need to learn about | 1437 // parent. The frame's proxies in other processes also need to learn about |
1437 // the updated sandbox flags, but these notifications are sent later in | 1438 // the updated sandbox flags, but these notifications are sent later in |
1438 // RenderFrameHostManager::CommitPendingSandboxFlags(), when the frame | 1439 // RenderFrameHostManager::CommitPendingSandboxFlags(), when the frame |
1439 // navigates and the new sandbox flags take effect. | 1440 // navigates and the new sandbox flags take effect. |
1440 RenderFrameHost* child_rfh = child->current_frame_host(); | 1441 RenderFrameHost* child_rfh = child->current_frame_host(); |
1441 if (child_rfh->GetSiteInstance() != GetSiteInstance()) { | 1442 if (child_rfh->GetSiteInstance() != GetSiteInstance()) { |
1442 child_rfh->Send( | 1443 child_rfh->Send( |
1443 new FrameMsg_DidUpdateSandboxFlags(child_rfh->GetRoutingID(), flags)); | 1444 new FrameMsg_DidUpdateSandboxFlags(child_rfh->GetRoutingID(), flags)); |
1444 } | 1445 } |
1445 } | 1446 } |
1446 | 1447 |
1447 void RenderFrameHostImpl::OnDidChangeFrameOwnerProperties( | 1448 void RenderFrameHostImpl::OnDidChangeFrameOwnerProperties( |
1448 int32 frame_routing_id, | 1449 int32_t frame_routing_id, |
1449 const blink::WebFrameOwnerProperties& frame_owner_properties) { | 1450 const blink::WebFrameOwnerProperties& frame_owner_properties) { |
1450 FrameTreeNode* child = FindAndVerifyChild( | 1451 FrameTreeNode* child = FindAndVerifyChild( |
1451 frame_routing_id, bad_message::RFH_OWNER_PROPERTY); | 1452 frame_routing_id, bad_message::RFH_OWNER_PROPERTY); |
1452 if (!child) | 1453 if (!child) |
1453 return; | 1454 return; |
1454 | 1455 |
1455 child->set_frame_owner_properties(frame_owner_properties); | 1456 child->set_frame_owner_properties(frame_owner_properties); |
1456 | 1457 |
1457 // Notify the RenderFrame if it lives in a different process from its parent. | 1458 // Notify the RenderFrame if it lives in a different process from its parent. |
1458 // These properties only affect the RenderFrame and live in its parent | 1459 // These properties only affect the RenderFrame and live in its parent |
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2277 if (accessibility_mode & AccessibilityModeFlagPlatform) { | 2278 if (accessibility_mode & AccessibilityModeFlagPlatform) { |
2278 BrowserAccessibilityManager* manager = | 2279 BrowserAccessibilityManager* manager = |
2279 GetOrCreateBrowserAccessibilityManager(); | 2280 GetOrCreateBrowserAccessibilityManager(); |
2280 if (manager) | 2281 if (manager) |
2281 manager->ActivateFindInPageResult(request_id); | 2282 manager->ActivateFindInPageResult(request_id); |
2282 } | 2283 } |
2283 } | 2284 } |
2284 | 2285 |
2285 void RenderFrameHostImpl::InsertVisualStateCallback( | 2286 void RenderFrameHostImpl::InsertVisualStateCallback( |
2286 const VisualStateCallback& callback) { | 2287 const VisualStateCallback& callback) { |
2287 static uint64 next_id = 1; | 2288 static uint64_t next_id = 1; |
2288 uint64 key = next_id++; | 2289 uint64_t key = next_id++; |
2289 Send(new FrameMsg_VisualStateRequest(routing_id_, key)); | 2290 Send(new FrameMsg_VisualStateRequest(routing_id_, key)); |
2290 visual_state_callbacks_.insert(std::make_pair(key, callback)); | 2291 visual_state_callbacks_.insert(std::make_pair(key, callback)); |
2291 } | 2292 } |
2292 | 2293 |
2293 bool RenderFrameHostImpl::IsRenderFrameLive() { | 2294 bool RenderFrameHostImpl::IsRenderFrameLive() { |
2294 bool is_live = GetProcess()->HasConnection() && render_frame_created_; | 2295 bool is_live = GetProcess()->HasConnection() && render_frame_created_; |
2295 | 2296 |
2296 // Sanity check: the RenderView should always be live if the RenderFrame is. | 2297 // Sanity check: the RenderView should always be live if the RenderFrame is. |
2297 DCHECK(!is_live || render_view_host_->IsRenderViewLive()); | 2298 DCHECK(!is_live || render_view_host_->IsRenderViewLive()); |
2298 | 2299 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2484 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( | 2485 void RenderFrameHostImpl::AXContentNodeDataToAXNodeData( |
2485 const AXContentNodeData& src, | 2486 const AXContentNodeData& src, |
2486 ui::AXNodeData* dst) { | 2487 ui::AXNodeData* dst) { |
2487 // Copy the common fields. | 2488 // Copy the common fields. |
2488 *dst = src; | 2489 *dst = src; |
2489 | 2490 |
2490 // Map content-specific attributes based on routing IDs or browser plugin | 2491 // Map content-specific attributes based on routing IDs or browser plugin |
2491 // instance IDs to generic attributes with global AXTreeIDs. | 2492 // instance IDs to generic attributes with global AXTreeIDs. |
2492 for (auto iter : src.content_int_attributes) { | 2493 for (auto iter : src.content_int_attributes) { |
2493 AXContentIntAttribute attr = iter.first; | 2494 AXContentIntAttribute attr = iter.first; |
2494 int32 value = iter.second; | 2495 int32_t value = iter.second; |
2495 switch (attr) { | 2496 switch (attr) { |
2496 case AX_CONTENT_ATTR_CHILD_ROUTING_ID: | 2497 case AX_CONTENT_ATTR_CHILD_ROUTING_ID: |
2497 dst->int_attributes.push_back(std::make_pair( | 2498 dst->int_attributes.push_back(std::make_pair( |
2498 ui::AX_ATTR_CHILD_TREE_ID, RoutingIDToAXTreeID(value))); | 2499 ui::AX_ATTR_CHILD_TREE_ID, RoutingIDToAXTreeID(value))); |
2499 break; | 2500 break; |
2500 case AX_CONTENT_ATTR_CHILD_BROWSER_PLUGIN_INSTANCE_ID: | 2501 case AX_CONTENT_ATTR_CHILD_BROWSER_PLUGIN_INSTANCE_ID: |
2501 dst->int_attributes.push_back(std::make_pair( | 2502 dst->int_attributes.push_back(std::make_pair( |
2502 ui::AX_ATTR_CHILD_TREE_ID, | 2503 ui::AX_ATTR_CHILD_TREE_ID, |
2503 BrowserPluginInstanceIDToAXTreeID(value))); | 2504 BrowserPluginInstanceIDToAXTreeID(value))); |
2504 break; | 2505 break; |
(...skipping 11 matching lines...) Expand all Loading... |
2516 *dst = src; | 2517 *dst = src; |
2517 | 2518 |
2518 if (src.routing_id != -1) | 2519 if (src.routing_id != -1) |
2519 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); | 2520 dst->tree_id = RoutingIDToAXTreeID(src.routing_id); |
2520 | 2521 |
2521 if (src.parent_routing_id != -1) | 2522 if (src.parent_routing_id != -1) |
2522 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); | 2523 dst->parent_tree_id = RoutingIDToAXTreeID(src.parent_routing_id); |
2523 } | 2524 } |
2524 | 2525 |
2525 } // namespace content | 2526 } // namespace content |
OLD | NEW |