Chromium Code Reviews| Index: chrome/browser/ui/webui/print_preview_ui.cc |
| =================================================================== |
| --- chrome/browser/ui/webui/print_preview_ui.cc (revision 97706) |
| +++ chrome/browser/ui/webui/print_preview_ui.cc (working copy) |
| @@ -4,8 +4,12 @@ |
| #include "chrome/browser/ui/webui/print_preview_ui.h" |
| +#include <map> |
| + |
| +#include "base/lazy_instance.h" |
| #include "base/metrics/histogram.h" |
| #include "base/string_util.h" |
| +#include "base/synchronization/lock.h" |
| #include "base/values.h" |
| #include "chrome/browser/printing/print_preview_data_service.h" |
| #include "chrome/browser/profiles/profile.h" |
| @@ -13,12 +17,27 @@ |
| #include "chrome/browser/ui/webui/print_preview_handler.h" |
| #include "chrome/common/print_messages.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| +#include "printing/print_job_constants.h" |
| +namespace { |
| + |
| +// Mapping from PrintPreviewUI address to most recent print preview request id. |
| +typedef std::map<std::string, int> PrintPreviewRequestIdMap; |
| + |
| +struct PrintPreviewRequestIdMapWithLock { |
|
vandebo (ex-Chrome)
2011/08/23 04:30:03
nit: Is there a reason this can't be a class with
Lei Zhang
2011/08/23 04:58:17
Done.
|
| + PrintPreviewRequestIdMap map; |
| + base::Lock lock; |
| +}; |
| + |
| +// Written to on the UI thread, read from any thread. |
| +base::LazyInstance<PrintPreviewRequestIdMapWithLock> |
| + g_print_preview_request_id_map(base::LINKER_INITIALIZED); |
| + |
| +} // namespace |
| + |
| PrintPreviewUI::PrintPreviewUI(TabContents* contents) |
| : ChromeWebUI(contents), |
| - initial_preview_start_time_(base::TimeTicks::Now()), |
| - request_count_(0U), |
| - document_cookie_(0) { |
| + initial_preview_start_time_(base::TimeTicks::Now()) { |
| // WebUI owns |handler_|. |
| handler_ = new PrintPreviewHandler(); |
| AddMessageHandler(handler_->Attach(this)); |
| @@ -28,15 +47,18 @@ |
| profile->GetChromeURLDataManager()->AddDataSource( |
| new PrintPreviewDataSource()); |
| - // Store the PrintPreviewUIAddress as a string. |
| - // "0x" + deadc0de + '\0' = 2 + 2 * sizeof(this) + 1; |
| - char preview_ui_addr[2 + (2 * sizeof(this)) + 1]; |
| - base::snprintf(preview_ui_addr, sizeof(preview_ui_addr), "%p", this); |
| - preview_ui_addr_str_ = preview_ui_addr; |
| + preview_ui_addr_str_ = GetPrintPreviewUIAddress(); |
| + |
| + base::AutoLock lock(g_print_preview_request_id_map.Get().lock); |
| + g_print_preview_request_id_map.Get().map[preview_ui_addr_str_] = -1; |
| } |
| PrintPreviewUI::~PrintPreviewUI() { |
| print_preview_data_service()->RemoveEntry(preview_ui_addr_str_); |
| + |
| + base::AutoLock lock(g_print_preview_request_id_map.Get().lock); |
| + PrintPreviewRequestIdMap* map = &g_print_preview_request_id_map.Get().map; |
| + map->erase(preview_ui_addr_str_); |
| } |
| void PrintPreviewUI::GetPrintPreviewDataForIndex( |
| @@ -61,6 +83,29 @@ |
| initiator_tab_title_ = job_title; |
| } |
| +// static |
| +void PrintPreviewUI::GetCurrentPrintPreviewStatus( |
| + const std::string& preview_ui_addr, |
| + int request_id, |
| + bool* cancel) { |
| + base::AutoLock lock(g_print_preview_request_id_map.Get().lock); |
| + PrintPreviewRequestIdMap::const_iterator it = |
| + g_print_preview_request_id_map.Get().map.find(preview_ui_addr); |
| + if (it == g_print_preview_request_id_map.Get().map.end()) { |
| + *cancel = true; |
| + return; |
| + } |
| + *cancel = (request_id != it->second); |
| +} |
| + |
| +std::string PrintPreviewUI::GetPrintPreviewUIAddress() const { |
| + // Store the PrintPreviewUIAddress as a string. |
| + // "0x" + deadc0de + '\0' = 2 + 2 * sizeof(this) + 1; |
| + char preview_ui_addr[2 + (2 * sizeof(this)) + 1]; |
| + base::snprintf(preview_ui_addr, sizeof(preview_ui_addr), "%p", this); |
| + return preview_ui_addr; |
| +} |
| + |
| void PrintPreviewUI::OnInitiatorTabCrashed() { |
| StringValue initiator_tab_url(initiator_url_); |
| CallJavascriptFunction("onInitiatorTabCrashed", initiator_tab_url); |
| @@ -71,14 +116,14 @@ |
| CallJavascriptFunction("onInitiatorTabClosed", initiator_tab_url); |
| } |
| -void PrintPreviewUI::OnPrintPreviewRequest() { |
| - request_count_++; |
| +void PrintPreviewUI::OnPrintPreviewRequest(int request_id) { |
| + base::AutoLock lock(g_print_preview_request_id_map.Get().lock); |
| + g_print_preview_request_id_map.Get().map[preview_ui_addr_str_] = request_id; |
| } |
| void PrintPreviewUI::OnDidGetPreviewPageCount( |
| const PrintHostMsg_DidGetPreviewPageCount_Params& params) { |
| DCHECK_GT(params.page_count, 0); |
| - document_cookie_ = params.document_cookie; |
| base::FundamentalValue count(params.page_count); |
| base::FundamentalValue modifiable(params.is_modifiable); |
| base::FundamentalValue request_id(params.preview_request_id); |
| @@ -97,8 +142,6 @@ |
| } |
| void PrintPreviewUI::OnReusePreviewData(int preview_request_id) { |
| - DecrementRequestCount(); |
| - |
| base::StringValue ui_identifier(preview_ui_addr_str_); |
| base::FundamentalValue ui_preview_request_id(preview_request_id); |
| CallJavascriptFunction("reloadPreviewPages", ui_identifier, |
| @@ -109,7 +152,6 @@ |
| int preview_request_id) { |
| VLOG(1) << "Print preview request finished with " |
| << expected_pages_count << " pages"; |
| - DecrementRequestCount(); |
| if (!initial_preview_start_time_.is_null()) { |
| UMA_HISTOGRAM_TIMES("PrintPreview.InitalDisplayTime", |
| @@ -133,27 +175,9 @@ |
| } |
| void PrintPreviewUI::OnPrintPreviewFailed() { |
| - DecrementRequestCount(); |
| CallJavascriptFunction("printPreviewFailed"); |
| } |
| -void PrintPreviewUI::OnPrintPreviewCancelled() { |
| - DecrementRequestCount(); |
| -} |
| - |
| -bool PrintPreviewUI::HasPendingRequests() { |
| - return request_count_ > 1; |
| -} |
| - |
| PrintPreviewDataService* PrintPreviewUI::print_preview_data_service() { |
| return PrintPreviewDataService::GetInstance(); |
| } |
| - |
| -void PrintPreviewUI::DecrementRequestCount() { |
| - if (request_count_ > 0) |
| - request_count_--; |
| -} |
| - |
| -int PrintPreviewUI::document_cookie() { |
| - return document_cookie_; |
| -} |