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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 483773002: PlzNavigate: implement CommitNavigation on the browser side (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed compilation error Created 6 years, 2 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 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/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 IPC_MESSAGE_HANDLER(FrameMsg_SetupTransitionView, OnSetupTransitionView) 790 IPC_MESSAGE_HANDLER(FrameMsg_SetupTransitionView, OnSetupTransitionView)
791 IPC_MESSAGE_HANDLER(FrameMsg_BeginExitTransition, OnBeginExitTransition) 791 IPC_MESSAGE_HANDLER(FrameMsg_BeginExitTransition, OnBeginExitTransition)
792 IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload) 792 IPC_MESSAGE_HANDLER(FrameMsg_Reload, OnReload)
793 IPC_MESSAGE_HANDLER(FrameMsg_TextSurroundingSelectionRequest, 793 IPC_MESSAGE_HANDLER(FrameMsg_TextSurroundingSelectionRequest,
794 OnTextSurroundingSelectionRequest) 794 OnTextSurroundingSelectionRequest)
795 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, 795 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL,
796 OnAddStyleSheetByURL) 796 OnAddStyleSheetByURL)
797 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, 797 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode,
798 OnSetAccessibilityMode) 798 OnSetAccessibilityMode)
799 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) 799 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener)
800 IPC_MESSAGE_HANDLER(FrameMsg_CommitNavigation, OnCommitNavigation)
800 #if defined(OS_ANDROID) 801 #if defined(OS_ANDROID)
801 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) 802 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems)
802 #elif defined(OS_MACOSX) 803 #elif defined(OS_MACOSX)
803 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) 804 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem)
804 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) 805 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard)
805 #endif 806 #endif
806 IPC_END_MESSAGE_MAP() 807 IPC_END_MESSAGE_MAP()
807 808
808 return handled; 809 return handled;
809 } 810 }
810 811
811 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) { 812 void RenderFrameImpl::OnNavigate(const FrameMsg_Navigate_Params& params) {
812 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate", 813 TRACE_EVENT2("navigation", "RenderFrameImpl::OnNavigate",
813 "id", routing_id_, "url", params.url.possibly_invalid_spec()); 814 "id", routing_id_,
814 MaybeHandleDebugURL(params.url); 815 "url", params.common_params.url.possibly_invalid_spec());
816 MaybeHandleDebugURL(params.common_params.url);
815 if (!render_view_->webview()) 817 if (!render_view_->webview())
816 return; 818 return;
817 819
818 FOR_EACH_OBSERVER( 820 FOR_EACH_OBSERVER(RenderViewObserver,
819 RenderViewObserver, render_view_->observers_, Navigate(params.url)); 821 render_view_->observers_,
822 Navigate(params.common_params.url));
820 823
821 bool is_reload = RenderViewImpl::IsReload(params); 824 bool is_reload =
825 RenderViewImpl::IsReload(params.common_params.navigation_type);
822 WebURLRequest::CachePolicy cache_policy = 826 WebURLRequest::CachePolicy cache_policy =
823 WebURLRequest::UseProtocolCachePolicy; 827 WebURLRequest::UseProtocolCachePolicy;
824 828
825 // If this is a stale back/forward (due to a recent navigation the browser 829 // If this is a stale back/forward (due to a recent navigation the browser
826 // didn't know about), ignore it. 830 // didn't know about), ignore it.
827 if (render_view_->IsBackForwardToStaleEntry(params, is_reload)) 831 if (render_view_->IsBackForwardToStaleEntry(params, is_reload))
828 return; 832 return;
829 833
830 // Swap this renderer back in if necessary. 834 // Swap this renderer back in if necessary.
831 if (render_view_->is_swapped_out_ && 835 if (render_view_->is_swapped_out_ &&
(...skipping 12 matching lines...) Expand all
844 848
845 // We refresh timezone when a view is swapped in since timezone 849 // We refresh timezone when a view is swapped in since timezone
846 // can get out of sync when the system timezone is updated while 850 // can get out of sync when the system timezone is updated while
847 // the view is swapped out. 851 // the view is swapped out.
848 RenderThreadImpl::NotifyTimezoneChange(); 852 RenderThreadImpl::NotifyTimezoneChange();
849 853
850 render_view_->SetSwappedOut(false); 854 render_view_->SetSwappedOut(false);
851 is_swapped_out_ = false; 855 is_swapped_out_ = false;
852 } 856 }
853 857
858 int pending_history_list_offset = params.pending_history_list_offset;
859 int current_history_list_offset = params.current_history_list_offset;
860 int current_history_list_length = params.current_history_list_length;
854 if (params.should_clear_history_list) { 861 if (params.should_clear_history_list) {
855 CHECK_EQ(params.pending_history_list_offset, -1); 862 CHECK_EQ(pending_history_list_offset, -1);
856 CHECK_EQ(params.current_history_list_offset, -1); 863 CHECK_EQ(current_history_list_offset, -1);
857 CHECK_EQ(params.current_history_list_length, 0); 864 CHECK_EQ(current_history_list_length, 0);
858 } 865 }
859 render_view_->history_list_offset_ = params.current_history_list_offset; 866 render_view_->history_list_offset_ = current_history_list_offset;
860 render_view_->history_list_length_ = params.current_history_list_length; 867 render_view_->history_list_length_ = current_history_list_length;
861 if (render_view_->history_list_length_ >= 0) { 868 if (render_view_->history_list_length_ >= 0) {
862 render_view_->history_page_ids_.resize( 869 render_view_->history_page_ids_.resize(
863 render_view_->history_list_length_, -1); 870 render_view_->history_list_length_, -1);
864 } 871 }
865 if (params.pending_history_list_offset >= 0 && 872 if (pending_history_list_offset >= 0 &&
866 params.pending_history_list_offset < render_view_->history_list_length_) { 873 pending_history_list_offset < render_view_->history_list_length_) {
867 render_view_->history_page_ids_[params.pending_history_list_offset] = 874 render_view_->history_page_ids_[pending_history_list_offset] =
868 params.page_id; 875 params.page_id;
869 } 876 }
870 877
871 GetContentClient()->SetActiveURL(params.url); 878 GetContentClient()->SetActiveURL(params.common_params.url);
872 879
873 WebFrame* frame = frame_; 880 WebFrame* frame = frame_;
874 if (!params.frame_to_navigate.empty()) { 881 if (!params.frame_to_navigate.empty()) {
875 // TODO(nasko): Move this lookup to the browser process. 882 // TODO(nasko): Move this lookup to the browser process.
876 frame = render_view_->webview()->findFrameByName( 883 frame = render_view_->webview()->findFrameByName(
877 WebString::fromUTF8(params.frame_to_navigate)); 884 WebString::fromUTF8(params.frame_to_navigate));
878 CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate; 885 CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate;
879 } 886 }
880 887
881 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) { 888 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) {
882 // We cannot reload if we do not have any history state. This happens, for 889 // We cannot reload if we do not have any history state. This happens, for
883 // example, when recovering from a crash. 890 // example, when recovering from a crash.
884 is_reload = false; 891 is_reload = false;
885 cache_policy = WebURLRequest::ReloadIgnoringCacheData; 892 cache_policy = WebURLRequest::ReloadIgnoringCacheData;
886 } 893 }
887 894
888 render_view_->pending_navigation_params_.reset( 895 render_view_->pending_navigation_params_.reset(
889 new FrameMsg_Navigate_Params(params)); 896 new FrameMsg_Navigate_Params(params));
890 897
891 // If we are reloading, then WebKit will use the history state of the current 898 // If we are reloading, then WebKit will use the history state of the current
892 // page, so we should just ignore any given history state. Otherwise, if we 899 // page, so we should just ignore any given history state. Otherwise, if we
893 // have history state, then we need to navigate to it, which corresponds to a 900 // have history state, then we need to navigate to it, which corresponds to a
894 // back/forward navigation event. 901 // back/forward navigation event.
895 if (is_reload) { 902 if (is_reload) {
896 bool reload_original_url = 903 bool reload_original_url =
897 (params.navigation_type == 904 (params.common_params.navigation_type ==
898 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); 905 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL);
899 bool ignore_cache = (params.navigation_type == 906 bool ignore_cache = (params.common_params.navigation_type ==
900 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); 907 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE);
901 908
902 if (reload_original_url) 909 if (reload_original_url)
903 frame->reloadWithOverrideURL(params.url, true); 910 frame->reloadWithOverrideURL(params.common_params.url, true);
904 else 911 else
905 frame->reload(ignore_cache); 912 frame->reload(ignore_cache);
906 } else if (params.page_state.IsValid()) { 913 } else if (params.commit_params.page_state.IsValid()) {
907 // We must know the page ID of the page we are navigating back to. 914 // We must know the page ID of the page we are navigating back to.
908 DCHECK_NE(params.page_id, -1); 915 DCHECK_NE(params.page_id, -1);
909 scoped_ptr<HistoryEntry> entry = 916 scoped_ptr<HistoryEntry> entry =
910 PageStateToHistoryEntry(params.page_state); 917 PageStateToHistoryEntry(params.commit_params.page_state);
911 if (entry) { 918 if (entry) {
912 // Ensure we didn't save the swapped out URL in UpdateState, since the 919 // Ensure we didn't save the swapped out URL in UpdateState, since the
913 // browser should never be telling us to navigate to swappedout://. 920 // browser should never be telling us to navigate to swappedout://.
914 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); 921 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL));
915 render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy); 922 render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy);
916 } 923 }
917 } else if (!params.base_url_for_data_url.is_empty()) { 924 } else if (!params.base_url_for_data_url.is_empty()) {
918 // A loadData request with a specified base URL. 925 // A loadData request with a specified base URL.
919 std::string mime_type, charset, data; 926 std::string mime_type, charset, data;
920 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { 927 if (net::DataURL::Parse(
928 params.common_params.url, &mime_type, &charset, &data)) {
921 frame->loadData( 929 frame->loadData(
922 WebData(data.c_str(), data.length()), 930 WebData(data.c_str(), data.length()),
923 WebString::fromUTF8(mime_type), 931 WebString::fromUTF8(mime_type),
924 WebString::fromUTF8(charset), 932 WebString::fromUTF8(charset),
925 params.base_url_for_data_url, 933 params.base_url_for_data_url,
926 params.history_url_for_data_url, 934 params.history_url_for_data_url,
927 false); 935 false);
928 } else { 936 } else {
929 CHECK(false) << 937 CHECK(false) << "Invalid URL passed: "
930 "Invalid URL passed: " << params.url.possibly_invalid_spec(); 938 << params.common_params.url.possibly_invalid_spec();
931 } 939 }
932 } else { 940 } else {
933 // Navigate to the given URL. 941 // Navigate to the given URL.
934 WebURLRequest request(params.url); 942 WebURLRequest request(params.common_params.url);
935 943
936 // A session history navigation should have been accompanied by state. 944 // A session history navigation should have been accompanied by state.
937 CHECK_EQ(params.page_id, -1); 945 CHECK_EQ(params.page_id, -1);
938 946
939 if (frame->isViewSourceModeEnabled()) 947 if (frame->isViewSourceModeEnabled())
940 request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad); 948 request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad);
941 949
942 if (params.referrer.url.is_valid()) { 950 if (params.common_params.referrer.url.is_valid()) {
943 WebString referrer = WebSecurityPolicy::generateReferrerHeader( 951 WebString referrer = WebSecurityPolicy::generateReferrerHeader(
944 params.referrer.policy, 952 params.common_params.referrer.policy,
945 params.url, 953 params.common_params.url,
946 WebString::fromUTF8(params.referrer.url.spec())); 954 WebString::fromUTF8(params.common_params.referrer.url.spec()));
947 if (!referrer.isEmpty()) 955 if (!referrer.isEmpty())
948 request.setHTTPReferrer(referrer, params.referrer.policy); 956 request.setHTTPReferrer(referrer, params.common_params.referrer.policy);
949 } 957 }
950 958
951 if (!params.extra_headers.empty()) { 959 if (!params.request_params.extra_headers.empty()) {
952 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), 960 for (net::HttpUtil::HeadersIterator i(
953 params.extra_headers.end(), "\n"); 961 params.request_params.extra_headers.begin(),
954 i.GetNext(); ) { 962 params.request_params.extra_headers.end(),
963 "\n");
964 i.GetNext();) {
955 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 965 request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
956 WebString::fromUTF8(i.values())); 966 WebString::fromUTF8(i.values()));
957 } 967 }
958 } 968 }
959 969
960 if (params.is_post) { 970 if (params.request_params.is_post) {
961 request.setHTTPMethod(WebString::fromUTF8("POST")); 971 request.setHTTPMethod(WebString::fromUTF8("POST"));
962 972
963 // Set post data. 973 // Set post data.
964 WebHTTPBody http_body; 974 WebHTTPBody http_body;
965 http_body.initialize(); 975 http_body.initialize();
966 const char* data = NULL; 976 const char* data = NULL;
967 if (params.browser_initiated_post_data.size()) { 977 if (params.request_params.browser_initiated_post_data.size()) {
968 data = reinterpret_cast<const char*>( 978 data = reinterpret_cast<const char*>(
969 &params.browser_initiated_post_data.front()); 979 &params.request_params.browser_initiated_post_data.front());
970 } 980 }
971 http_body.appendData( 981 http_body.appendData(WebData(
972 WebData(data, params.browser_initiated_post_data.size())); 982 data, params.request_params.browser_initiated_post_data.size()));
973 request.setHTTPBody(http_body); 983 request.setHTTPBody(http_body);
974 } 984 }
975 985
976 // Record this before starting the load, we need a lower bound of this time 986 // Record this before starting the load, we need a lower bound of this time
977 // to sanitize the navigationStart override set below. 987 // to sanitize the navigationStart override set below.
978 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); 988 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now();
979 frame->loadRequest(request); 989 frame->loadRequest(request);
980 990
981 // The browser provides the navigation_start time to bootstrap the 991 // The browser provides the navigation_start time to bootstrap the
982 // Navigation Timing information for the browser-initiated navigations. In 992 // Navigation Timing information for the browser-initiated navigations. In
983 // case of cross-process navigations, this carries over the time of 993 // case of cross-process navigations, this carries over the time of
984 // finishing the onbeforeunload handler of the previous page. 994 // finishing the onbeforeunload handler of the previous page.
985 DCHECK(!params.browser_navigation_start.is_null()); 995 DCHECK(!params.commit_params.browser_navigation_start.is_null());
986 if (frame->provisionalDataSource()) { 996 if (frame->provisionalDataSource()) {
987 // |browser_navigation_start| is likely before this process existed, so we 997 // |browser_navigation_start| is likely before this process existed, so we
988 // can't use InterProcessTimeTicksConverter. We need at least to ensure 998 // can't use InterProcessTimeTicksConverter. We need at least to ensure
989 // that the browser-side navigation start we set is not later than the one 999 // that the browser-side navigation start we set is not later than the one
990 // on the renderer side. 1000 // on the renderer side.
991 base::TimeTicks navigation_start = std::min( 1001 base::TimeTicks navigation_start =
992 params.browser_navigation_start, renderer_navigation_start); 1002 std::min(params.commit_params.browser_navigation_start,
1003 renderer_navigation_start);
993 double navigation_start_seconds = 1004 double navigation_start_seconds =
994 (navigation_start - base::TimeTicks()).InSecondsF(); 1005 (navigation_start - base::TimeTicks()).InSecondsF();
995 frame->provisionalDataSource()->setNavigationStartTime( 1006 frame->provisionalDataSource()->setNavigationStartTime(
996 navigation_start_seconds); 1007 navigation_start_seconds);
997 } 1008 }
998 } 1009 }
999 1010
1000 // In case LoadRequest failed before DidCreateDataSource was called. 1011 // In case LoadRequest failed before DidCreateDataSource was called.
1001 render_view_->pending_navigation_params_.reset(); 1012 render_view_->pending_navigation_params_.reset();
1002 } 1013 }
(...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2126 // page load is regarded as the same browser initiated request. 2137 // page load is regarded as the same browser initiated request.
2127 if (!navigation_state->is_content_initiated()) { 2138 if (!navigation_state->is_content_initiated()) {
2128 render_view_->pending_navigation_params_.reset( 2139 render_view_->pending_navigation_params_.reset(
2129 new FrameMsg_Navigate_Params); 2140 new FrameMsg_Navigate_Params);
2130 render_view_->pending_navigation_params_->page_id = 2141 render_view_->pending_navigation_params_->page_id =
2131 navigation_state->pending_page_id(); 2142 navigation_state->pending_page_id();
2132 render_view_->pending_navigation_params_->pending_history_list_offset = 2143 render_view_->pending_navigation_params_->pending_history_list_offset =
2133 navigation_state->pending_history_list_offset(); 2144 navigation_state->pending_history_list_offset();
2134 render_view_->pending_navigation_params_->should_clear_history_list = 2145 render_view_->pending_navigation_params_->should_clear_history_list =
2135 navigation_state->history_list_was_cleared(); 2146 navigation_state->history_list_was_cleared();
2136 render_view_->pending_navigation_params_->transition = 2147 render_view_->pending_navigation_params_->common_params.transition =
2137 navigation_state->transition_type(); 2148 navigation_state->transition_type();
2138 render_view_->pending_navigation_params_->request_time = 2149 render_view_->pending_navigation_params_->request_time =
2139 document_state->request_time(); 2150 document_state->request_time();
2140 render_view_->pending_navigation_params_->should_replace_current_entry = 2151 render_view_->pending_navigation_params_->should_replace_current_entry =
2141 replace; 2152 replace;
2142 } 2153 }
2143 2154
2144 // Load an error page. 2155 // Load an error page.
2145 LoadNavigationErrorPage(failed_request, error, replace); 2156 LoadNavigationErrorPage(failed_request, error, replace);
2146 } 2157 }
(...skipping 1311 matching lines...) Expand 10 before | Expand all | Expand 10 after
3458 const blink::WebAXObject& obj, blink::WebAXEvent event) { 3469 const blink::WebAXObject& obj, blink::WebAXEvent event) {
3459 if (renderer_accessibility_) 3470 if (renderer_accessibility_)
3460 renderer_accessibility_->HandleWebAccessibilityEvent(obj, event); 3471 renderer_accessibility_->HandleWebAccessibilityEvent(obj, event);
3461 } 3472 }
3462 3473
3463 void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) { 3474 void RenderFrameImpl::FocusedNodeChanged(const WebNode& node) {
3464 if (renderer_accessibility_) 3475 if (renderer_accessibility_)
3465 renderer_accessibility_->FocusedNodeChanged(node); 3476 renderer_accessibility_->FocusedNodeChanged(node);
3466 } 3477 }
3467 3478
3479 // PlzNavigate
3480 void RenderFrameImpl::OnCommitNavigation(
3481 const GURL& stream_url,
3482 const CommonNavigationParams& common_params,
3483 const CommitNavigationParams& commit_params) {
3484 NOTIMPLEMENTED();
3485 }
3486
3468 WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation( 3487 WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation(
3469 RenderFrame* render_frame, 3488 RenderFrame* render_frame,
3470 const NavigationPolicyInfo& info) { 3489 const NavigationPolicyInfo& info) {
3471 #ifdef OS_ANDROID 3490 #ifdef OS_ANDROID
3472 // The handlenavigation API is deprecated and will be removed once 3491 // The handlenavigation API is deprecated and will be removed once
3473 // crbug.com/325351 is resolved. 3492 // crbug.com/325351 is resolved.
3474 if (info.urlRequest.url() != GURL(kSwappedOutURL) && 3493 if (info.urlRequest.url() != GURL(kSwappedOutURL) &&
3475 GetContentClient()->renderer()->HandleNavigation( 3494 GetContentClient()->renderer()->HandleNavigation(
3476 render_frame, 3495 render_frame,
3477 static_cast<DocumentState*>(info.extraData), 3496 static_cast<DocumentState*>(info.extraData),
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
3902 3921
3903 #if defined(ENABLE_BROWSER_CDMS) 3922 #if defined(ENABLE_BROWSER_CDMS)
3904 RendererCdmManager* RenderFrameImpl::GetCdmManager() { 3923 RendererCdmManager* RenderFrameImpl::GetCdmManager() {
3905 if (!cdm_manager_) 3924 if (!cdm_manager_)
3906 cdm_manager_ = new RendererCdmManager(this); 3925 cdm_manager_ = new RendererCdmManager(this);
3907 return cdm_manager_; 3926 return cdm_manager_;
3908 } 3927 }
3909 #endif // defined(ENABLE_BROWSER_CDMS) 3928 #endif // defined(ENABLE_BROWSER_CDMS)
3910 3929
3911 } // namespace content 3930 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698