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

Side by Side Diff: chrome/renderer/print_web_view_helper.cc

Issue 7544018: Print preview page selection should not require a rerendering of draft pages. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 4 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/renderer/print_web_view_helper.h" 5 #include "chrome/renderer/print_web_view_helper.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 if (WebFrame* web_frame = web_view_->mainFrame()) 170 if (WebFrame* web_frame = web_view_->mainFrame())
171 web_frame->setScrollOffset(prev_scroll_offset_); 171 web_frame->setScrollOffset(prev_scroll_offset_);
172 } 172 }
173 } 173 }
174 174
175 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) 175 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view)
176 : RenderViewObserver(render_view), 176 : RenderViewObserver(render_view),
177 RenderViewObserverTracker<PrintWebViewHelper>(render_view), 177 RenderViewObserverTracker<PrintWebViewHelper>(render_view),
178 print_web_view_(NULL), 178 print_web_view_(NULL),
179 is_preview_(switches::IsPrintPreviewEnabled()), 179 is_preview_(switches::IsPrintPreviewEnabled()),
180 is_complete_metafile_already_sent_(false),
180 user_cancelled_scripted_print_count_(0), 181 user_cancelled_scripted_print_count_(0),
181 notify_browser_of_print_failure_(true) { 182 notify_browser_of_print_failure_(true) {
182 } 183 }
183 184
184 PrintWebViewHelper::~PrintWebViewHelper() {} 185 PrintWebViewHelper::~PrintWebViewHelper() {}
185 186
186 // Prints |frame| which called window.print(). 187 // Prints |frame| which called window.print().
187 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { 188 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) {
188 DCHECK(frame); 189 DCHECK(frame);
189 190
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 print_preview_context_.total_page_count(); 333 print_preview_context_.total_page_count();
333 preview_params.modifiable = print_preview_context_.IsModifiable(); 334 preview_params.modifiable = print_preview_context_.IsModifiable();
334 preview_params.preview_request_id = 335 preview_params.preview_request_id =
335 print_pages_params_->params.preview_request_id; 336 print_pages_params_->params.preview_request_id;
336 337
337 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); 338 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
338 return; 339 return;
339 } 340 }
340 // Always clear |old_print_pages_params_| before rendering the pages. 341 // Always clear |old_print_pages_params_| before rendering the pages.
341 old_print_pages_params_.reset(); 342 old_print_pages_params_.reset();
343 is_complete_metafile_already_sent_ = false;
342 344
343 // PDF printer device supports alpha blending. 345 // PDF printer device supports alpha blending.
344 print_pages_params_->params.supports_alpha_blend = true; 346 print_pages_params_->params.supports_alpha_blend = true;
347
348 bool generate_draft_pages;
349 if (!settings.GetBoolean(printing::kSettingGenerateDraftData,
350 &generate_draft_pages)) {
351 // TODO(kmadhusu): Remove this key.
352 NOTREACHED();
353 }
354 print_preview_context_.set_generate_draft_pages(generate_draft_pages);
355
345 if (!CreatePreviewDocument()) 356 if (!CreatePreviewDocument())
346 DidFinishPrinting(FAIL_PREVIEW); 357 DidFinishPrinting(FAIL_PREVIEW);
347 } 358 }
348 359
349 bool PrintWebViewHelper::CreatePreviewDocument() { 360 bool PrintWebViewHelper::CreatePreviewDocument() {
350 PrintMsg_Print_Params print_params = print_pages_params_->params; 361 PrintMsg_Print_Params print_params = print_pages_params_->params;
351 const std::vector<int>& pages = print_pages_params_->pages; 362 const std::vector<int>& pages = print_pages_params_->pages;
352 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages)) 363 if (!print_preview_context_.CreatePreviewDocument(&print_params, pages))
353 return false; 364 return false;
354 int page_count = print_preview_context_.total_page_count(); 365 int page_count = print_preview_context_.total_page_count();
355 bool is_modifiable = print_preview_context_.IsModifiable(); 366 bool is_modifiable = print_preview_context_.IsModifiable();
356 int document_cookie = print_pages_params_->params.document_cookie; 367 int document_cookie = print_pages_params_->params.document_cookie;
357 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie, 368 Send(new PrintHostMsg_DidGetPreviewPageCount(
358 page_count, is_modifiable)); 369 routing_id(),
370 document_cookie,
371 page_count,
372 is_modifiable,
373 print_preview_context_.get_generate_draft_pages()));
359 PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); 374 PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL);
360 return true; 375 return true;
361 } 376 }
362 377
363 void PrintWebViewHelper::OnContinuePreview(int requested_preview_page_index) { 378 void PrintWebViewHelper::OnContinuePreview() {
364 // Spurious message. We already finished/cancelled/aborted the print preview. 379 // Spurious message. We already finished/cancelled/aborted the print preview.
365 if (!print_preview_context_.IsBusy()) 380 if (!print_preview_context_.IsBusy())
366 return; 381 return;
367 int page_number; 382 int page_number = print_preview_context_.GetNextPageNumber();
368 #if defined(USE_SKIA)
369 if (requested_preview_page_index >= printing::FIRST_PAGE_INDEX) {
370 page_number = requested_preview_page_index;
371 } else
372 #endif
373 {
374 page_number = print_preview_context_.GetNextPageNumber();
375 }
376
377 if (page_number >= printing::FIRST_PAGE_INDEX) { 383 if (page_number >= printing::FIRST_PAGE_INDEX) {
378 // Continue generating the print preview. 384 // Continue generating the print preview.
379 RenderPreviewPage(page_number); 385 RenderPreviewPage(page_number);
380 return; 386 if (!print_preview_context_.IsCompleteMetafileReady())
387 return;
381 } 388 }
382 389
383 // Finished generating preview. Finalize the document. 390 // Finished generating preview. Finalize the document.
384 if (FinalizePreviewDocument()) { 391 if (FinalizePreviewDocument()) {
385 print_preview_context_.Finished(); 392 if (page_number == printing::INVALID_PAGE_INDEX) {
386 DidFinishPrinting(OK); 393 print_preview_context_.Finished();
394 DidFinishPrinting(OK);
395 }
387 } else { 396 } else {
388 DidFinishPrinting(FAIL_PREVIEW); 397 DidFinishPrinting(FAIL_PREVIEW);
389 } 398 }
390 } 399 }
391 400
392 void PrintWebViewHelper::OnAbortPreview() { 401 void PrintWebViewHelper::OnAbortPreview() {
393 DidFinishPrinting(ABORT_PREVIEW); 402 DidFinishPrinting(ABORT_PREVIEW);
394 return; 403 return;
395 } 404 }
396 405
397 bool PrintWebViewHelper::FinalizePreviewDocument() { 406 bool PrintWebViewHelper::FinalizePreviewDocument() {
398 print_preview_context_.FinalizePreviewDocument(); 407 print_preview_context_.FinalizePreviewDocument(
408 is_complete_metafile_already_sent_);
409 if (is_complete_metafile_already_sent_)
410 return true;
399 411
400 // Get the size of the resulting metafile. 412 // Get the size of the resulting metafile.
401 printing::Metafile* metafile = print_preview_context_.metafile(); 413 printing::Metafile* metafile = print_preview_context_.metafile();
402 uint32 buf_size = metafile->GetDataSize(); 414 uint32 buf_size = metafile->GetDataSize();
403 DCHECK_GT(buf_size, 0u); 415 DCHECK_GT(buf_size, 0u);
404 416
405 PrintHostMsg_DidPreviewDocument_Params preview_params; 417 PrintHostMsg_DidPreviewDocument_Params preview_params;
406 preview_params.reuse_existing_data = false; 418 preview_params.reuse_existing_data = false;
407 preview_params.data_size = buf_size; 419 preview_params.data_size = buf_size;
408 preview_params.document_cookie = print_pages_params_->params.document_cookie; 420 preview_params.document_cookie = print_pages_params_->params.document_cookie;
409 preview_params.expected_pages_count = 421 preview_params.expected_pages_count =
410 print_preview_context_.total_page_count(); 422 print_preview_context_.total_page_count();
411 preview_params.modifiable = print_preview_context_.IsModifiable(); 423 preview_params.modifiable = print_preview_context_.IsModifiable();
412 preview_params.preview_request_id = 424 preview_params.preview_request_id =
413 print_pages_params_->params.preview_request_id; 425 print_pages_params_->params.preview_request_id;
414 426
415 // Ask the browser to create the shared memory for us. 427 // Ask the browser to create the shared memory for us.
416 if (!CopyMetafileDataToSharedMem(metafile, 428 if (!CopyMetafileDataToSharedMem(metafile,
417 &(preview_params.metafile_data_handle))) { 429 &(preview_params.metafile_data_handle))) {
418 return false; 430 return false;
419 } 431 }
432 is_complete_metafile_already_sent_ = true;
433
420 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); 434 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params));
421 return true; 435 return true;
422 } 436 }
423 437
424 void PrintWebViewHelper::OnPrintingDone(bool success) { 438 void PrintWebViewHelper::OnPrintingDone(bool success) {
425 notify_browser_of_print_failure_ = false; 439 notify_browser_of_print_failure_ = false;
426 DidFinishPrinting(success ? OK : FAIL_PRINT); 440 DidFinishPrinting(success ? OK : FAIL_PRINT);
427 } 441 }
428 442
429 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { 443 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() {
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 } 946 }
933 } 947 }
934 preview_page_params.data_size = buf_size; 948 preview_page_params.data_size = buf_size;
935 preview_page_params.page_number = page_number; 949 preview_page_params.page_number = page_number;
936 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 950 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
937 } 951 }
938 952
939 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 953 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
940 : frame_(NULL), 954 : frame_(NULL),
941 total_page_count_(0), 955 total_page_count_(0),
942 actual_page_count_(0), 956 generate_draft_pages_(true),
943 current_page_number_(0), 957 complete_metafile_page_count_(0),
958 current_page_index_(-1),
944 state_(UNINITIALIZED) { 959 state_(UNINITIALIZED) {
945 } 960 }
946 961
947 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { 962 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() {
948 } 963 }
949 964
950 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( 965 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
951 WebKit::WebFrame* web_frame) { 966 WebKit::WebFrame* web_frame) {
952 DCHECK(web_frame); 967 DCHECK(web_frame);
953 if (IsReadyToRender()) 968 if (IsReadyToRender())
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 // Need to make sure old object gets destroyed first. 1002 // Need to make sure old object gets destroyed first.
988 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(), 1003 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(*print_params, frame(),
989 node())); 1004 node()));
990 UpdatePrintableSizeInPrintParameters(frame_, node_.get(), 1005 UpdatePrintableSizeInPrintParameters(frame_, node_.get(),
991 prep_frame_view_.get(), print_params); 1006 prep_frame_view_.get(), print_params);
992 1007
993 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); 1008 total_page_count_ = prep_frame_view_->GetExpectedPageCount();
994 if (total_page_count_ == 0) 1009 if (total_page_count_ == 0)
995 return false; 1010 return false;
996 1011
997 current_page_number_ = 0; 1012 current_page_index_ = -1;
998 if (pages.empty()) { 1013 complete_metafile_page_count_ = pages.empty() ? total_page_count_ :
999 actual_page_count_ = total_page_count_; 1014 pages.size();
1000 rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, 1015 render_page_index_list_ = pages;
1001 std::make_pair(false, -1)); 1016 if (generate_draft_pages_) {
1002 } else { 1017 for (int i = 0; i < total_page_count_; i++) {
1003 actual_page_count_ = pages.size(); 1018 if (std::find(pages.begin(), pages.end(), i) == pages.end())
1004 rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, 1019 render_page_index_list_.push_back(i);
1005 std::make_pair(true, -1));
1006 for (int i = 0; i < actual_page_count_; ++i) {
1007 int page_number = pages[i];
1008 if (page_number < printing::FIRST_PAGE_INDEX ||
1009 page_number >= total_page_count_) {
1010 return false;
1011 }
1012 rendered_pages_[page_number].first = false;
1013 rendered_pages_[page_number].second = i;
1014 } 1020 }
1015 } 1021 }
1022 // printf("---------------------\n");
1023 // printf("complete_metafile_page_count_: %d \n",
1024 // complete_metafile_page_count_);
1025 // printf("total_page_count_: %d \n", total_page_count_);
1026 // printf("pages.size: %ld \n", pages.size());
1027 // printf("render_page_index_list_: %ld \n", render_page_index_list_.size());
1028 // printf("generate_draft_pages: %d \n", generate_draft_pages_);
1029 // printf("---------------------\n");
1016 1030
1017 document_render_time_ = base::TimeDelta(); 1031 document_render_time_ = base::TimeDelta();
1018 begin_time_ = base::TimeTicks::Now(); 1032 begin_time_ = base::TimeTicks::Now();
1019 1033
1020 return true; 1034 return true;
1021 } 1035 }
1022 1036
1023 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( 1037 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage(
1024 const base::TimeDelta& page_time) { 1038 const base::TimeDelta& page_time) {
1025 DCHECK_EQ(RENDERING, state_); 1039 DCHECK_EQ(RENDERING, state_);
1026 document_render_time_ += page_time; 1040 document_render_time_ += page_time;
1027 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); 1041 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time);
1028 } 1042 }
1029 1043
1030 void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { 1044 void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument(
1045 bool is_complete_metafile_already_sent) {
1031 DCHECK_EQ(RENDERING, state_); 1046 DCHECK_EQ(RENDERING, state_);
1032 state_ = DONE; 1047 if ((size_t)(current_page_index_ + 1) == render_page_index_list_.size()) {
1048 state_ = DONE;
1049 prep_frame_view_->FinishPrinting();
1050 if (is_complete_metafile_already_sent)
1051 return;
1052 }
1033 1053
1034 base::TimeTicks begin_time = base::TimeTicks::Now(); 1054 base::TimeTicks begin_time = base::TimeTicks::Now();
1035
1036 prep_frame_view_->FinishPrinting();
1037 metafile_->FinishDocument(); 1055 metafile_->FinishDocument();
1038 1056
1039 if (actual_page_count_ <= 0) { 1057 if (complete_metafile_page_count_ <= 0) {
1040 NOTREACHED(); 1058 NOTREACHED();
1041 return; 1059 return;
1042 } 1060 }
1043 1061
1044 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", 1062 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime",
1045 document_render_time_); 1063 document_render_time_);
1046 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) + 1064 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) +
1047 document_render_time_; 1065 document_render_time_;
1048 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", 1066 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime",
1049 total_time); 1067 total_time);
1050 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", 1068 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage",
1051 total_time / actual_page_count_); 1069 total_time / complete_metafile_page_count_);
1052 } 1070 }
1053 1071
1054 void PrintWebViewHelper::PrintPreviewContext::Finished() { 1072 void PrintWebViewHelper::PrintPreviewContext::Finished() {
1055 DCHECK_EQ(DONE, state_); 1073 DCHECK_EQ(DONE, state_);
1056 ClearContext(); 1074 ClearContext();
1057 } 1075 }
1058 1076
1059 void PrintWebViewHelper::PrintPreviewContext::Abort() { 1077 void PrintWebViewHelper::PrintPreviewContext::Abort() {
1060 state_ = UNINITIALIZED; 1078 state_ = UNINITIALIZED;
1061 ClearContext(); 1079 ClearContext();
1062 frame_ = NULL; 1080 frame_ = NULL;
1063 node_.reset(); 1081 node_.reset();
1064 } 1082 }
1065 1083
1066 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { 1084 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
1067 DCHECK_EQ(RENDERING, state_); 1085 DCHECK_EQ(RENDERING, state_);
1068 for (int i = 0; i < total_page_count_; i++) { 1086 if ((size_t)(current_page_index_ + 1) >= render_page_index_list_.size())
1069 if (!rendered_pages_[current_page_number_].first)
1070 break;
1071 current_page_number_ = (current_page_number_ + 1) % total_page_count_;
1072 }
1073 if (rendered_pages_[current_page_number_].first)
1074 return printing::INVALID_PAGE_INDEX; 1087 return printing::INVALID_PAGE_INDEX;
1075 rendered_pages_[current_page_number_].first = true; 1088 current_page_index_++;
1076 return current_page_number_; 1089 return render_page_index_list_[current_page_index_];
1077 } 1090 }
1078 1091
1079 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { 1092 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
1080 return state_ != UNINITIALIZED; 1093 return state_ != UNINITIALIZED;
1081 } 1094 }
1082 1095
1083 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const { 1096 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const {
1084 return state_ == INITIALIZED || state_ == RENDERING; 1097 return state_ == INITIALIZED || state_ == RENDERING;
1085 } 1098 }
1086 1099
1087 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { 1100 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
1088 // TODO(vandebo) I think this should only return false if the content is a 1101 // TODO(vandebo) I think this should only return false if the content is a
1089 // PDF, just because we are printing a particular node does not mean it's 1102 // PDF, just because we are printing a particular node does not mean it's
1090 // a PDF (right?), we should check the mime type of the node. 1103 // a PDF (right?), we should check the mime type of the node.
1091 if (node()) 1104 if (node())
1092 return false; 1105 return false;
1093 std::string mime(frame()->dataSource()->response().mimeType().utf8()); 1106 std::string mime(frame()->dataSource()->response().mimeType().utf8());
1094 return mime != "application/pdf"; 1107 return mime != "application/pdf";
1095 } 1108 }
1096 1109
1110 bool PrintWebViewHelper::PrintPreviewContext::IsCompleteMetafileReady() const {
1111 return current_page_index_ == complete_metafile_page_count_ - 1;
1112 }
1113
1114 // TODO(kmadhusu): Remove GetPageSlotForPage() function.
1097 int PrintWebViewHelper::PrintPreviewContext::GetPageSlotForPage( 1115 int PrintWebViewHelper::PrintPreviewContext::GetPageSlotForPage(
1098 int page_number) const { 1116 int page_number) const {
1099 int page_slot = rendered_pages_[page_number].second; 1117 std::vector<int>::const_iterator it =
1100 return page_slot == -1 ? page_number : page_slot; 1118 std::find(render_page_index_list_.begin(), render_page_index_list_.end(),
1119 page_number);
1120 int page_slot = it != render_page_index_list_.end() ?
1121 static_cast<int>(it - render_page_index_list_.begin()) : -1;
1122 return page_slot >= complete_metafile_page_count_ ? 0 : page_slot;
1101 } 1123 }
1102 1124
1103 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { 1125 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
1104 return frame_; 1126 return frame_;
1105 } 1127 }
1106 1128
1107 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const { 1129 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const {
1108 return node_.get(); 1130 return node_.get();
1109 } 1131 }
1110 1132
(...skipping 11 matching lines...) Expand all
1122 } 1144 }
1123 1145
1124 const gfx::Size& 1146 const gfx::Size&
1125 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 1147 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1126 return prep_frame_view_->GetPrintCanvasSize(); 1148 return prep_frame_view_->GetPrintCanvasSize();
1127 } 1149 }
1128 1150
1129 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1151 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1130 prep_frame_view_.reset(); 1152 prep_frame_view_.reset();
1131 metafile_.reset(); 1153 metafile_.reset();
1132 rendered_pages_.clear(); 1154 render_page_index_list_.clear();
1133 } 1155 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698