Index: chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc |
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc |
index 90083b08df11b2b4ae05783853c467d74283b99b..eda5bd0ab985f7994a63d4785eeefca15c53ff41 100644 |
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc |
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc |
@@ -7,6 +7,7 @@ |
#include "base/auto_reset.h" |
#include "base/command_line.h" |
#include "base/prefs/pref_service.h" |
+#include "base/task_runner_util.h" |
#include "chrome/browser/autocomplete/autocomplete_classifier.h" |
#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" |
#include "chrome/browser/autocomplete/autocomplete_match.h" |
@@ -29,9 +30,14 @@ |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/pref_names.h" |
#include "chrome/common/url_constants.h" |
+#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/plugin_service.h" |
#include "content/public/browser/user_metrics.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/common/webplugininfo.h" |
+#include "ipc/ipc_message.h" |
+#include "net/base/net_util.h" |
#include "ui/base/layout.h" |
#include "ui/base/models/list_selection_model.h" |
#include "ui/gfx/image/image.h" |
@@ -79,6 +85,20 @@ TabStripLayoutType DetermineTabStripLayout( |
} |
} |
+// Get the MIME type of the file pointed to by the url, based on the file's |
+// extension. Must be called on a thread that allows IO. |
+std::string FindURLMimeType(const GURL& url) { |
+ DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
+ base::FilePath full_path; |
+ net::FileURLToFilePath(url, &full_path); |
+ |
+ // Get the MIME type based on the filename. |
+ std::string mime_type; |
+ net::GetMimeTypeFromFile(full_path, &mime_type); |
+ |
+ return mime_type; |
+} |
+ |
} // namespace |
class BrowserTabStripController::TabContextMenuContents |
@@ -177,7 +197,8 @@ BrowserTabStripController::BrowserTabStripController(Browser* browser, |
: model_(model), |
tabstrip_(NULL), |
browser_(browser), |
- hover_tab_selector_(model) { |
+ hover_tab_selector_(model), |
+ weak_ptr_factory_(this) { |
model_->AddObserver(this); |
local_pref_registrar_.Init(g_browser_process->local_state()); |
@@ -401,6 +422,16 @@ void BrowserTabStripController::OnStoppedDraggingTabs() { |
immersive_reveal_lock_.reset(); |
} |
+void BrowserTabStripController::CheckFileSupported(const GURL& url) { |
+ base::PostTaskAndReplyWithResult( |
+ content::BrowserThread::GetBlockingPool(), |
michaelpg
2013/12/03 01:58:36
This is causing compile errors in the tree.
dcheng
2013/12/03 02:15:20
Wild guess: you need to include the header for Seq
michaelpg
2013/12/03 02:49:35
Doh, that's exactly it. I wonder why it didn't com
|
+ FROM_HERE, |
+ base::Bind(&FindURLMimeType, url), |
+ base::Bind(&BrowserTabStripController::OnFindURLMimeTypeCompleted, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ url)); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// BrowserTabStripController, TabStripModelObserver implementation: |
@@ -546,3 +577,23 @@ void BrowserTabStripController::UpdateLayoutType() { |
browser_->host_desktop_type(), &adjust_layout); |
tabstrip_->SetLayoutType(layout_type, adjust_layout); |
} |
+ |
+void BrowserTabStripController::OnFindURLMimeTypeCompleted( |
+ const GURL& url, |
+ const std::string& mime_type) { |
+ // Check whether the mime type, if given, is known to be supported or whether |
+ // there is a plugin that supports the mime type (e.g. PDF). |
+ // TODO(bauerb): This possibly uses stale information, but it's guaranteed not |
+ // to do disk access. |
+ content::WebPluginInfo plugin; |
+ tabstrip_->FileSupported( |
+ url, |
+ mime_type.empty() || |
+ net::IsSupportedMimeType(mime_type) || |
+ content::PluginService::GetInstance()->GetPluginInfo( |
+ -1, // process ID |
+ MSG_ROUTING_NONE, // routing ID |
+ model_->profile()->GetResourceContext(), |
+ url, GURL(), mime_type, false, |
+ NULL, &plugin, NULL)); |
+} |