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

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: Addressed Nasko's comments 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.core_params.url.possibly_invalid_spec());
816 MaybeHandleDebugURL(params.core_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.core_params.url));
820 823
821 bool is_reload = RenderViewImpl::IsReload(params); 824 bool is_reload = RenderViewImpl::IsReload(params.core_params.navigation_type);
822 WebURLRequest::CachePolicy cache_policy = 825 WebURLRequest::CachePolicy cache_policy =
823 WebURLRequest::UseProtocolCachePolicy; 826 WebURLRequest::UseProtocolCachePolicy;
824 827
825 // If this is a stale back/forward (due to a recent navigation the browser 828 // If this is a stale back/forward (due to a recent navigation the browser
826 // didn't know about), ignore it. 829 // didn't know about), ignore it.
827 if (render_view_->IsBackForwardToStaleEntry(params, is_reload)) 830 if (render_view_->IsBackForwardToStaleEntry(params, is_reload))
828 return; 831 return;
829 832
830 // Swap this renderer back in if necessary. 833 // Swap this renderer back in if necessary.
831 if (render_view_->is_swapped_out_ && 834 if (render_view_->is_swapped_out_ &&
(...skipping 12 matching lines...) Expand all
844 847
845 // We refresh timezone when a view is swapped in since timezone 848 // We refresh timezone when a view is swapped in since timezone
846 // can get out of sync when the system timezone is updated while 849 // can get out of sync when the system timezone is updated while
847 // the view is swapped out. 850 // the view is swapped out.
848 RenderThreadImpl::NotifyTimezoneChange(); 851 RenderThreadImpl::NotifyTimezoneChange();
849 852
850 render_view_->SetSwappedOut(false); 853 render_view_->SetSwappedOut(false);
851 is_swapped_out_ = false; 854 is_swapped_out_ = false;
852 } 855 }
853 856
857 int pending_history_list_offset = params.pending_history_list_offset;
858 int current_history_list_offset = params.current_history_list_offset;
859 int current_history_list_length = params.current_history_list_length;
854 if (params.should_clear_history_list) { 860 if (params.should_clear_history_list) {
855 CHECK_EQ(params.pending_history_list_offset, -1); 861 CHECK_EQ(pending_history_list_offset, -1);
856 CHECK_EQ(params.current_history_list_offset, -1); 862 CHECK_EQ(current_history_list_offset, -1);
857 CHECK_EQ(params.current_history_list_length, 0); 863 CHECK_EQ(current_history_list_length, 0);
858 } 864 }
859 render_view_->history_list_offset_ = params.current_history_list_offset; 865 render_view_->history_list_offset_ = current_history_list_offset;
860 render_view_->history_list_length_ = params.current_history_list_length; 866 render_view_->history_list_length_ = current_history_list_length;
861 if (render_view_->history_list_length_ >= 0) { 867 if (render_view_->history_list_length_ >= 0) {
862 render_view_->history_page_ids_.resize( 868 render_view_->history_page_ids_.resize(
863 render_view_->history_list_length_, -1); 869 render_view_->history_list_length_, -1);
864 } 870 }
865 if (params.pending_history_list_offset >= 0 && 871 if (pending_history_list_offset >= 0 &&
866 params.pending_history_list_offset < render_view_->history_list_length_) { 872 pending_history_list_offset < render_view_->history_list_length_) {
867 render_view_->history_page_ids_[params.pending_history_list_offset] = 873 render_view_->history_page_ids_[pending_history_list_offset] =
868 params.page_id; 874 params.page_id;
869 } 875 }
870 876
871 GetContentClient()->SetActiveURL(params.url); 877 GetContentClient()->SetActiveURL(params.core_params.url);
872 878
873 WebFrame* frame = frame_; 879 WebFrame* frame = frame_;
874 if (!params.frame_to_navigate.empty()) { 880 if (!params.frame_to_navigate.empty()) {
875 // TODO(nasko): Move this lookup to the browser process. 881 // TODO(nasko): Move this lookup to the browser process.
876 frame = render_view_->webview()->findFrameByName( 882 frame = render_view_->webview()->findFrameByName(
877 WebString::fromUTF8(params.frame_to_navigate)); 883 WebString::fromUTF8(params.frame_to_navigate));
878 CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate; 884 CHECK(frame) << "Invalid frame name passed: " << params.frame_to_navigate;
879 } 885 }
880 886
881 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) { 887 if (is_reload && !render_view_->history_controller()->GetCurrentEntry()) {
882 // We cannot reload if we do not have any history state. This happens, for 888 // We cannot reload if we do not have any history state. This happens, for
883 // example, when recovering from a crash. 889 // example, when recovering from a crash.
884 is_reload = false; 890 is_reload = false;
885 cache_policy = WebURLRequest::ReloadIgnoringCacheData; 891 cache_policy = WebURLRequest::ReloadIgnoringCacheData;
886 } 892 }
887 893
888 render_view_->pending_navigation_params_.reset( 894 render_view_->pending_navigation_params_.reset(
889 new FrameMsg_Navigate_Params(params)); 895 new FrameMsg_Navigate_Params(params));
890 896
891 // If we are reloading, then WebKit will use the history state of the current 897 // 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 898 // 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 899 // have history state, then we need to navigate to it, which corresponds to a
894 // back/forward navigation event. 900 // back/forward navigation event.
895 if (is_reload) { 901 if (is_reload) {
896 bool reload_original_url = 902 bool reload_original_url =
897 (params.navigation_type == 903 (params.core_params.navigation_type ==
898 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL); 904 FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL);
899 bool ignore_cache = (params.navigation_type == 905 bool ignore_cache = (params.core_params.navigation_type ==
900 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); 906 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE);
901 907
902 if (reload_original_url) 908 if (reload_original_url)
903 frame->reloadWithOverrideURL(params.url, true); 909 frame->reloadWithOverrideURL(params.core_params.url, true);
904 else 910 else
905 frame->reload(ignore_cache); 911 frame->reload(ignore_cache);
906 } else if (params.page_state.IsValid()) { 912 } else if (params.commit_params.page_state.IsValid()) {
907 // We must know the page ID of the page we are navigating back to. 913 // We must know the page ID of the page we are navigating back to.
908 DCHECK_NE(params.page_id, -1); 914 DCHECK_NE(params.page_id, -1);
909 scoped_ptr<HistoryEntry> entry = 915 scoped_ptr<HistoryEntry> entry =
910 PageStateToHistoryEntry(params.page_state); 916 PageStateToHistoryEntry(params.commit_params.page_state);
911 if (entry) { 917 if (entry) {
912 // Ensure we didn't save the swapped out URL in UpdateState, since the 918 // Ensure we didn't save the swapped out URL in UpdateState, since the
913 // browser should never be telling us to navigate to swappedout://. 919 // browser should never be telling us to navigate to swappedout://.
914 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); 920 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL));
915 render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy); 921 render_view_->history_controller()->GoToEntry(entry.Pass(), cache_policy);
916 } 922 }
917 } else if (!params.base_url_for_data_url.is_empty()) { 923 } else if (!params.base_url_for_data_url.is_empty()) {
918 // A loadData request with a specified base URL. 924 // A loadData request with a specified base URL.
919 std::string mime_type, charset, data; 925 std::string mime_type, charset, data;
920 if (net::DataURL::Parse(params.url, &mime_type, &charset, &data)) { 926 if (net::DataURL::Parse(
927 params.core_params.url, &mime_type, &charset, &data)) {
921 frame->loadData( 928 frame->loadData(
922 WebData(data.c_str(), data.length()), 929 WebData(data.c_str(), data.length()),
923 WebString::fromUTF8(mime_type), 930 WebString::fromUTF8(mime_type),
924 WebString::fromUTF8(charset), 931 WebString::fromUTF8(charset),
925 params.base_url_for_data_url, 932 params.base_url_for_data_url,
926 params.history_url_for_data_url, 933 params.history_url_for_data_url,
927 false); 934 false);
928 } else { 935 } else {
929 CHECK(false) << 936 CHECK(false) << "Invalid URL passed: "
930 "Invalid URL passed: " << params.url.possibly_invalid_spec(); 937 << params.core_params.url.possibly_invalid_spec();
931 } 938 }
932 } else { 939 } else {
933 // Navigate to the given URL. 940 // Navigate to the given URL.
934 WebURLRequest request(params.url); 941 WebURLRequest request(params.core_params.url);
935 942
936 // A session history navigation should have been accompanied by state. 943 // A session history navigation should have been accompanied by state.
937 CHECK_EQ(params.page_id, -1); 944 CHECK_EQ(params.page_id, -1);
938 945
939 if (frame->isViewSourceModeEnabled()) 946 if (frame->isViewSourceModeEnabled())
940 request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad); 947 request.setCachePolicy(WebURLRequest::ReturnCacheDataElseLoad);
941 948
942 if (params.referrer.url.is_valid()) { 949 if (params.core_params.referrer.url.is_valid()) {
943 WebString referrer = WebSecurityPolicy::generateReferrerHeader( 950 WebString referrer = WebSecurityPolicy::generateReferrerHeader(
944 params.referrer.policy, 951 params.core_params.referrer.policy,
945 params.url, 952 params.core_params.url,
946 WebString::fromUTF8(params.referrer.url.spec())); 953 WebString::fromUTF8(params.core_params.referrer.url.spec()));
947 if (!referrer.isEmpty()) 954 if (!referrer.isEmpty())
948 request.setHTTPReferrer(referrer, params.referrer.policy); 955 request.setHTTPReferrer(referrer, params.core_params.referrer.policy);
949 } 956 }
950 957
951 if (!params.extra_headers.empty()) { 958 if (!params.request_params.extra_headers.empty()) {
952 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), 959 for (net::HttpUtil::HeadersIterator i(
953 params.extra_headers.end(), "\n"); 960 params.request_params.extra_headers.begin(),
954 i.GetNext(); ) { 961 params.request_params.extra_headers.end(),
962 "\n");
963 i.GetNext();) {
955 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 964 request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
956 WebString::fromUTF8(i.values())); 965 WebString::fromUTF8(i.values()));
957 } 966 }
958 } 967 }
959 968
960 if (params.is_post) { 969 if (params.request_params.is_post) {
961 request.setHTTPMethod(WebString::fromUTF8("POST")); 970 request.setHTTPMethod(WebString::fromUTF8("POST"));
962 971
963 // Set post data. 972 // Set post data.
964 WebHTTPBody http_body; 973 WebHTTPBody http_body;
965 http_body.initialize(); 974 http_body.initialize();
966 const char* data = NULL; 975 const char* data = NULL;
967 if (params.browser_initiated_post_data.size()) { 976 if (params.request_params.browser_initiated_post_data.size()) {
968 data = reinterpret_cast<const char*>( 977 data = reinterpret_cast<const char*>(
969 &params.browser_initiated_post_data.front()); 978 &params.request_params.browser_initiated_post_data.front());
970 } 979 }
971 http_body.appendData( 980 http_body.appendData(WebData(
972 WebData(data, params.browser_initiated_post_data.size())); 981 data, params.request_params.browser_initiated_post_data.size()));
973 request.setHTTPBody(http_body); 982 request.setHTTPBody(http_body);
974 } 983 }
975 984
976 // Record this before starting the load, we need a lower bound of this time 985 // Record this before starting the load, we need a lower bound of this time
977 // to sanitize the navigationStart override set below. 986 // to sanitize the navigationStart override set below.
978 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); 987 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now();
979 frame->loadRequest(request); 988 frame->loadRequest(request);
980 989
981 // The browser provides the navigation_start time to bootstrap the 990 // The browser provides the navigation_start time to bootstrap the
982 // Navigation Timing information for the browser-initiated navigations. In 991 // Navigation Timing information for the browser-initiated navigations. In
983 // case of cross-process navigations, this carries over the time of 992 // case of cross-process navigations, this carries over the time of
984 // finishing the onbeforeunload handler of the previous page. 993 // finishing the onbeforeunload handler of the previous page.
985 DCHECK(!params.browser_navigation_start.is_null()); 994 DCHECK(!params.commit_params.browser_navigation_start.is_null());
986 if (frame->provisionalDataSource()) { 995 if (frame->provisionalDataSource()) {
987 // |browser_navigation_start| is likely before this process existed, so we 996 // |browser_navigation_start| is likely before this process existed, so we
988 // can't use InterProcessTimeTicksConverter. We need at least to ensure 997 // 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 998 // that the browser-side navigation start we set is not later than the one
990 // on the renderer side. 999 // on the renderer side.
991 base::TimeTicks navigation_start = std::min( 1000 base::TimeTicks navigation_start =
992 params.browser_navigation_start, renderer_navigation_start); 1001 std::min(params.commit_params.browser_navigation_start,
1002 renderer_navigation_start);
993 double navigation_start_seconds = 1003 double navigation_start_seconds =
994 (navigation_start - base::TimeTicks()).InSecondsF(); 1004 (navigation_start - base::TimeTicks()).InSecondsF();
995 frame->provisionalDataSource()->setNavigationStartTime( 1005 frame->provisionalDataSource()->setNavigationStartTime(
996 navigation_start_seconds); 1006 navigation_start_seconds);
997 } 1007 }
998 } 1008 }
999 1009
1000 // In case LoadRequest failed before DidCreateDataSource was called. 1010 // In case LoadRequest failed before DidCreateDataSource was called.
1001 render_view_->pending_navigation_params_.reset(); 1011 render_view_->pending_navigation_params_.reset();
1002 } 1012 }
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 void RenderFrameImpl::OnDisownOpener() { 1336 void RenderFrameImpl::OnDisownOpener() {
1327 // TODO(creis): We should only see this for main frames for now. To support 1337 // TODO(creis): We should only see this for main frames for now. To support
1328 // disowning the opener on subframes, we will need to move WebContentsImpl's 1338 // disowning the opener on subframes, we will need to move WebContentsImpl's
1329 // opener_ to FrameTreeNode. 1339 // opener_ to FrameTreeNode.
1330 CHECK(!frame_->parent()); 1340 CHECK(!frame_->parent());
1331 1341
1332 if (frame_->opener()) 1342 if (frame_->opener())
1333 frame_->setOpener(NULL); 1343 frame_->setOpener(NULL);
1334 } 1344 }
1335 1345
1346 // PlzNavigate
1347 void RenderFrameImpl::OnCommitNavigation(
1348 const GURL& stream_url,
1349 const CoreNavigationParams& core_params,
1350 const CommitNavigationParams& commit_params) {
1351 NOTREACHED();
nasko 2014/09/26 22:16:43 nit: NOTIMPLEMENTED, indicates more correctly the
clamy 2014/09/29 20:45:30 Done.
1352 }
1353
1336 #if defined(OS_ANDROID) 1354 #if defined(OS_ANDROID)
1337 void RenderFrameImpl::OnSelectPopupMenuItems( 1355 void RenderFrameImpl::OnSelectPopupMenuItems(
1338 bool canceled, 1356 bool canceled,
1339 const std::vector<int>& selected_indices) { 1357 const std::vector<int>& selected_indices) {
1340 // It is possible to receive more than one of these calls if the user presses 1358 // It is possible to receive more than one of these calls if the user presses
1341 // a select faster than it takes for the show-select-popup IPC message to make 1359 // a select faster than it takes for the show-select-popup IPC message to make
1342 // it to the browser UI thread. Ignore the extra-messages. 1360 // it to the browser UI thread. Ignore the extra-messages.
1343 // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug. 1361 // TODO(jcivelli): http:/b/5793321 Implement a better fix, as detailed in bug.
1344 if (!external_popup_menu_) 1362 if (!external_popup_menu_)
1345 return; 1363 return;
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
2126 // page load is regarded as the same browser initiated request. 2144 // page load is regarded as the same browser initiated request.
2127 if (!navigation_state->is_content_initiated()) { 2145 if (!navigation_state->is_content_initiated()) {
2128 render_view_->pending_navigation_params_.reset( 2146 render_view_->pending_navigation_params_.reset(
2129 new FrameMsg_Navigate_Params); 2147 new FrameMsg_Navigate_Params);
2130 render_view_->pending_navigation_params_->page_id = 2148 render_view_->pending_navigation_params_->page_id =
2131 navigation_state->pending_page_id(); 2149 navigation_state->pending_page_id();
2132 render_view_->pending_navigation_params_->pending_history_list_offset = 2150 render_view_->pending_navigation_params_->pending_history_list_offset =
2133 navigation_state->pending_history_list_offset(); 2151 navigation_state->pending_history_list_offset();
2134 render_view_->pending_navigation_params_->should_clear_history_list = 2152 render_view_->pending_navigation_params_->should_clear_history_list =
2135 navigation_state->history_list_was_cleared(); 2153 navigation_state->history_list_was_cleared();
2136 render_view_->pending_navigation_params_->transition = 2154 render_view_->pending_navigation_params_->core_params.transition =
2137 navigation_state->transition_type(); 2155 navigation_state->transition_type();
2138 render_view_->pending_navigation_params_->request_time = 2156 render_view_->pending_navigation_params_->request_time =
2139 document_state->request_time(); 2157 document_state->request_time();
2140 render_view_->pending_navigation_params_->should_replace_current_entry = 2158 render_view_->pending_navigation_params_->should_replace_current_entry =
2141 replace; 2159 replace;
2142 } 2160 }
2143 2161
2144 // Load an error page. 2162 // Load an error page.
2145 LoadNavigationErrorPage(failed_request, error, replace); 2163 LoadNavigationErrorPage(failed_request, error, replace);
2146 } 2164 }
(...skipping 1755 matching lines...) Expand 10 before | Expand all | Expand 10 after
3902 3920
3903 #if defined(ENABLE_BROWSER_CDMS) 3921 #if defined(ENABLE_BROWSER_CDMS)
3904 RendererCdmManager* RenderFrameImpl::GetCdmManager() { 3922 RendererCdmManager* RenderFrameImpl::GetCdmManager() {
3905 if (!cdm_manager_) 3923 if (!cdm_manager_)
3906 cdm_manager_ = new RendererCdmManager(this); 3924 cdm_manager_ = new RendererCdmManager(this);
3907 return cdm_manager_; 3925 return cdm_manager_;
3908 } 3926 }
3909 #endif // defined(ENABLE_BROWSER_CDMS) 3927 #endif // defined(ENABLE_BROWSER_CDMS)
3910 3928
3911 } // namespace content 3929 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698