| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IOS_CHROME_BROWSER_SHARING_SHARE_FILE_DOWNLOAD_TAB_HELPER_H_ |
| #define IOS_CHROME_BROWSER_SHARING_SHARE_FILE_DOWNLOAD_TAB_HELPER_H_ |
| |
| #include <string> |
| |
| #include "ios/web/public/web_state_observer.h" |
| #import "ios/web/public/web_state_user_data.h" |
| |
| namespace net { |
| class HttpResponseHeaders; |
| } // namespace net |
| |
| namespace content_type { |
| |
| // .pptx extension. |
| extern const char kMimeTypeMicrosoftPowerPointOpenXML[]; |
| |
| // .docx extension. |
| extern const char kMimeTypeMicrosoftWordOpenXML[]; |
| |
| // .xlsx extension. |
| extern const char kMimeTypeMicrosoftExcelOpenXML[]; |
| |
| // .pdf extension. |
| extern const char kMimeTypePDF[]; |
| |
| // .doc extension. |
| extern const char kMimeTypeMicrosoftWord[]; |
| |
| // .jpeg or .jpg extension. |
| extern const char kMimeTypeJPEG[]; |
| |
| // .png extension. |
| extern const char kMimeTypePNG[]; |
| |
| // .ppt extension. |
| extern const char kMimeTypeMicrosoftPowerPoint[]; |
| |
| // .rtf extension. |
| extern const char kMimeTypeRTF[]; |
| |
| // .svg extension. |
| extern const char kMimeTypeSVG[]; |
| |
| // .xls extension. |
| extern const char kMimeTypeMicrosoftExcel[]; |
| |
| } // namespace content_type |
| |
| // Enum used to determine the MIME type of a previewed file. Entries should |
| // always keep synced with the IOS.OpenIn.MimeType UMA histogram. |
| enum class ShareFileDownloadMimeType { |
| kMimeTypeNotHandled = 0, |
| kMimeTypePDF = 1, |
| kMimeTypeMicrosoftWord = 2, |
| kMimeTypeMicrosoftWordOpenXML = 3, |
| kMimeTypeJPEG = 4, |
| kMimeTypePNG = 5, |
| kMimeTypeMicrosoftPowerPoint = 6, |
| kMimeTypeMicrosoftPowerPointOpenXML = 7, |
| kMimeTypeRTF = 8, |
| kMimeTypeSVG = 9, |
| kMimeTypeMicrosoftExcel = 10, |
| kMimeTypeMicrosoftExcelOpenXML = 11, |
| kMaxValue = kMimeTypeMicrosoftExcelOpenXML, |
| }; |
| |
| // A tab helper that observes WebState and shows open in button for PDF |
| // documents. |
| class ShareFileDownloadTabHelper |
| : public web::WebStateObserver, |
| public web::WebStateUserData<ShareFileDownloadTabHelper> { |
| public: |
| ShareFileDownloadTabHelper(const ShareFileDownloadTabHelper&) = delete; |
| ShareFileDownloadTabHelper& operator=(const ShareFileDownloadTabHelper&) = |
| delete; |
| |
| ~ShareFileDownloadTabHelper() override; |
| |
| // Returns true if the displayed content should be downloaded. |
| static bool ShouldDownload(web::WebState* web_state); |
| |
| // Returns the suggested file name of the displayed content. |
| std::u16string GetFileNameSuggestion(); |
| |
| private: |
| friend class web::WebStateUserData<ShareFileDownloadTabHelper>; |
| |
| explicit ShareFileDownloadTabHelper(web::WebState* web_state); |
| |
| // Handles exportable files and shows open in button if content mime type is |
| // PDF. |
| void HandleExportableFile(); |
| |
| // Tests that files are exportable and returns their MIME type. |
| ShareFileDownloadMimeType GetUmaResult(const std::string& mime_type) const; |
| |
| // WebStateObserver implementation. |
| void PageLoaded( |
| web::WebState* web_state, |
| web::PageLoadCompletionStatus load_completion_status) override; |
| void WebStateDestroyed(web::WebState* web_state) override; |
| void DidFinishNavigation(web::WebState* web_state, |
| web::NavigationContext* navigation_context) override; |
| |
| // The WebState this instance is observing. Will be null after |
| // WebStateDestroyed has been called. |
| web::WebState* web_state_ = nullptr; |
| |
| // Headers of the last response received for the current navigation. |
| scoped_refptr<net::HttpResponseHeaders> response_headers_; |
| |
| WEB_STATE_USER_DATA_KEY_DECL(); |
| }; |
| |
| #endif // IOS_CHROME_BROWSER_SHARING_SHARE_FILE_DOWNLOAD_TAB_HELPER_H_ |