Home | History | Annotate | Download | only in pdf
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/pdf/pdf_tab_helper.h"
      6 
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "chrome/browser/download/download_stats.h"
      9 #include "chrome/browser/ui/browser.h"
     10 #include "chrome/browser/ui/browser_finder.h"
     11 #include "chrome/browser/ui/browser_window.h"
     12 #include "chrome/browser/ui/omnibox/location_bar.h"
     13 #include "chrome/browser/ui/pdf/open_pdf_in_reader_prompt_delegate.h"
     14 #include "chrome/browser/ui/pdf/pdf_unsupported_feature.h"
     15 #include "chrome/browser/ui/tab_contents/core_tab_helper.h"
     16 #include "chrome/common/render_messages.h"
     17 #include "content/public/browser/navigation_details.h"
     18 
     19 DEFINE_WEB_CONTENTS_USER_DATA_KEY(PDFTabHelper);
     20 
     21 PDFTabHelper::PDFTabHelper(content::WebContents* web_contents)
     22     : content::WebContentsObserver(web_contents) {
     23 }
     24 
     25 PDFTabHelper::~PDFTabHelper() {
     26 }
     27 
     28 void PDFTabHelper::ShowOpenInReaderPrompt(
     29     scoped_ptr<OpenPDFInReaderPromptDelegate> prompt) {
     30   open_in_reader_prompt_ = prompt.Pass();
     31   UpdateLocationBar();
     32 }
     33 
     34 bool PDFTabHelper::OnMessageReceived(const IPC::Message& message) {
     35   bool handled = true;
     36   IPC_BEGIN_MESSAGE_MAP(PDFTabHelper, message)
     37     IPC_MESSAGE_HANDLER(ChromeViewHostMsg_PDFHasUnsupportedFeature,
     38                         OnHasUnsupportedFeature)
     39     IPC_MESSAGE_HANDLER(ChromeViewHostMsg_PDFSaveURLAs, OnSaveURLAs)
     40     IPC_MESSAGE_HANDLER(ChromeViewHostMsg_PDFUpdateContentRestrictions,
     41                         OnUpdateContentRestrictions)
     42     IPC_MESSAGE_HANDLER_DELAY_REPLY(ChromeViewHostMsg_PDFModalPromptForPassword,
     43                                     OnModalPromptForPassword)
     44     IPC_MESSAGE_UNHANDLED(handled = false)
     45   IPC_END_MESSAGE_MAP()
     46   return handled;
     47 }
     48 
     49 void PDFTabHelper::DidNavigateMainFrame(
     50     const content::LoadCommittedDetails& details,
     51     const content::FrameNavigateParams& params) {
     52   if (open_in_reader_prompt_.get() &&
     53       open_in_reader_prompt_->ShouldExpire(details)) {
     54     open_in_reader_prompt_.reset();
     55     UpdateLocationBar();
     56   }
     57 }
     58 
     59 void PDFTabHelper::UpdateLocationBar() {
     60   Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
     61   if (!browser)
     62     return;
     63 
     64   BrowserWindow* window = browser->window();
     65   if (!window)
     66     return;
     67 
     68   LocationBar* location_bar = window->GetLocationBar();
     69   if (!location_bar)
     70     return;
     71 
     72   location_bar->UpdateOpenPDFInReaderPrompt();
     73 }
     74 
     75 void PDFTabHelper::OnHasUnsupportedFeature() {
     76   PDFHasUnsupportedFeature(web_contents());
     77 }
     78 
     79 void PDFTabHelper::OnSaveURLAs(const GURL& url,
     80                                const content::Referrer& referrer) {
     81   RecordDownloadSource(DOWNLOAD_INITIATED_BY_PDF_SAVE);
     82   web_contents()->SaveFrame(url, referrer);
     83 }
     84 
     85 void PDFTabHelper::OnUpdateContentRestrictions(int content_restrictions) {
     86   CoreTabHelper* core_tab_helper =
     87       CoreTabHelper::FromWebContents(web_contents());
     88   // |core_tab_helper| is NULL for WebViewGuest.
     89   if (core_tab_helper)
     90     core_tab_helper->UpdateContentRestrictions(content_restrictions);
     91 }
     92 
     93 void PDFTabHelper::OnModalPromptForPasswordClosed(
     94     IPC::Message* reply_message,
     95     bool success,
     96     const base::string16& actual_value) {
     97   ChromeViewHostMsg_PDFModalPromptForPassword::WriteReplyParams(
     98       reply_message, base::UTF16ToUTF8(actual_value));
     99   Send(reply_message);
    100 }
    101 
    102 void PDFTabHelper::OnModalPromptForPassword(const std::string& prompt,
    103                                             IPC::Message* reply_message) {
    104   base::Callback<void(bool, const base::string16&)> callback =
    105       base::Bind(&PDFTabHelper::OnModalPromptForPasswordClosed,
    106                  base::Unretained(this), reply_message);
    107   ShowPDFPasswordDialog(web_contents(), base::UTF8ToUTF16(prompt), callback);
    108 }
    109