Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / browser.cc
index cc6df27..5edd456 100644 (file)
@@ -54,6 +54,7 @@
 #include "chrome/browser/extensions/api/tabs/tabs_windows_api.h"
 #include "chrome/browser/extensions/browser_extension_window_controller.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/favicon/favicon_tab_helper.h"
 #include "chrome/browser/file_select_helper.h"
 #include "chrome/common/profiling.h"
 #include "chrome/common/search_types.h"
 #include "chrome/common/url_constants.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/locale_settings.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "components/google/core/browser/google_url_tracker.h"
 #include "components/search/search.h"
 #include "components/startup_metric_utils/startup_metric_utils.h"
+#include "components/web_modal/popup_manager.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
-#include "content/public/browser/devtools_manager.h"
+#include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/download_item.h"
 #include "content/public/browser/download_manager.h"
 #include "content/public/browser/interstitial_page.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest_handlers/background_info.h"
-#include "grit/chromium_strings.h"
-#include "grit/generated_resources.h"
-#include "grit/locale_settings.h"
-#include "grit/theme_resources.h"
 #include "net/base/filename_util.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "net/cookies/cookie_monster.h"
 #endif  // OS_WIN
 
 #if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/drive/file_system_util.h"
+#include "chrome/browser/chromeos/fileapi/external_file_url_util.h"
 #endif
 
 #if defined(USE_ASH)
@@ -309,8 +310,6 @@ class Browser::InterstitialObserver : public content::WebContentsObserver {
         browser_(browser) {
   }
 
-  using content::WebContentsObserver::web_contents;
-
   virtual void DidAttachInterstitialPage() OVERRIDE {
     browser_->UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE);
   }
@@ -352,9 +351,9 @@ Browser::Browser(const CreateParams& params)
       command_controller_(new chrome::BrowserCommandController(this)),
       window_has_shown_(false),
       chrome_updater_factory_(this),
-      weak_factory_(this),
       translate_driver_observer_(
-          new BrowserContentTranslateDriverObserver(this)) {
+          new BrowserContentTranslateDriverObserver(this)),
+      weak_factory_(this) {
   // If this causes a crash then a window is being opened using a profile type
   // that is disallowed by policy. The crash prevents the disabled window type
   // from opening at all, but the path that triggered it should be fixed.
@@ -368,8 +367,6 @@ Browser::Browser(const CreateParams& params)
   else
     unload_controller_.reset(new chrome::UnloadController(this));
 
-  if (!app_name_.empty())
-    chrome::RegisterAppPrefs(app_name_, profile_);
   tab_strip_model_->AddObserver(this);
 
   toolbar_model_.reset(new ToolbarModelImpl(toolbar_model_delegate_.get()));
@@ -402,7 +399,7 @@ Browser::Browser(const CreateParams& params)
       prefs::kDevToolsDisabled,
       base::Bind(&Browser::OnDevToolsDisabledChanged, base::Unretained(this)));
   profile_pref_registrar_.Add(
-      prefs::kShowBookmarkBar,
+      bookmarks::prefs::kShowBookmarkBar,
       base::Bind(&Browser::UpdateBookmarkBarState, base::Unretained(this),
                  BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE));
 
@@ -448,6 +445,12 @@ Browser::Browser(const CreateParams& params)
   }
 
   fullscreen_controller_.reset(new FullscreenController(this));
+
+  // Must be initialized after window_.
+  // Also: surprise! a modal dialog host is not necessary to host modal dialogs
+  // without a modal dialog host, so that value may be null.
+  popup_manager_.reset(new web_modal::PopupManager(
+      GetWebContentsModalDialogHost()));
 }
 
 Browser::~Browser() {
@@ -569,6 +572,10 @@ base::string16 Browser::GetWindowTitleForCurrentTab() const {
   // |contents| can be NULL because GetWindowTitleForCurrentTab is called by the
   // window during the window's creation (before tabs have been added).
   if (contents) {
+    // Streamlined hosted apps use the host instead of the title.
+    if (is_app() && extensions::util::IsStreamlinedHostedAppsEnabled())
+      return base::UTF8ToUTF16(contents->GetURL().host());
+
     title = contents->GetTitle();
     FormatTitleForDisplay(&title);
   }
@@ -854,7 +861,7 @@ void Browser::UpdateDownloadShelfVisibility(bool visible) {
 ///////////////////////////////////////////////////////////////////////////////
 
 void Browser::UpdateUIForNavigationInTab(WebContents* contents,
-                                         content::PageTransition transition,
+                                         ui::PageTransition transition,
                                          bool user_initiated) {
   tab_strip_model_->TabNavigating(contents, transition);
 
@@ -896,6 +903,10 @@ void Browser::TabInsertedAt(WebContents* contents,
                             int index,
                             bool foreground) {
   SetAsDelegate(contents, true);
+
+  if (popup_manager_)
+    popup_manager_->RegisterWith(contents);
+
   SessionTabHelper* session_tab_helper =
       SessionTabHelper::FromWebContents(contents);
   session_tab_helper->SetWindowID(session_id());
@@ -937,6 +948,9 @@ void Browser::TabClosingAt(TabStripModel* tab_strip_model,
       content::Source<NavigationController>(&contents->GetController()),
       content::NotificationService::NoDetails());
 
+  if (popup_manager_)
+    popup_manager_->UnregisterWith(contents);
+
   // Sever the WebContents' connection back to us.
   SetAsDelegate(contents, false);
 }
@@ -952,6 +966,10 @@ void Browser::TabDetachedAt(WebContents* contents, int index) {
       session_service->SetSelectedTabInWindow(session_id(),
                                               old_active_index - 1);
   }
+
+  if (popup_manager_)
+    popup_manager_->UnregisterWith(contents);
+
   TabDetachedAtImpl(contents, index, DETACH_TYPE_DETACH);
 }
 
@@ -1410,8 +1428,7 @@ bool Browser::IsPopupOrPanel(const WebContents* source) const {
   return is_type_popup();
 }
 
-void Browser::UpdateTargetURL(WebContents* source, int32 page_id,
-                              const GURL& url) {
+void Browser::UpdateTargetURL(WebContents* source, const GURL& url) {
   if (!GetStatusBubble())
     return;
 
@@ -1741,6 +1758,12 @@ void Browser::RequestMediaAccessPermission(
   ::RequestMediaAccessPermission(web_contents, profile_, request, callback);
 }
 
+bool Browser::CheckMediaAccessPermission(content::WebContents* web_contents,
+                                         const GURL& security_origin,
+                                         content::MediaStreamType type) {
+  return ::CheckMediaAccessPermission(web_contents, security_origin, type);
+}
+
 bool Browser::RequestPpapiBrokerPermission(
     WebContents* web_contents,
     const GURL& url,
@@ -1812,7 +1835,7 @@ void Browser::NavigateOnThumbnailClick(const GURL& url,
   // TODO(kmadhusu): Page transitions to privileged destinations should be
   // marked as "LINK" instead of "AUTO_BOOKMARK"?
   chrome::NavigateParams params(this, url,
-                                content::PAGE_TRANSITION_AUTO_BOOKMARK);
+                                ui::PAGE_TRANSITION_AUTO_BOOKMARK);
   params.referrer = content::Referrer();
   params.source_contents = source_contents;
   params.disposition = disposition;
@@ -1900,14 +1923,17 @@ void Browser::FileSelectedWithExtraInfo(const ui::SelectedFileInfo& file_info,
   GURL url = net::FilePathToFileURL(file_info.local_path);
 
 #if defined(OS_CHROMEOS)
-  drive::util::MaybeSetDriveURL(profile_, file_info.file_path, &url);
+  const GURL external_url =
+      chromeos::CreateExternalFileURLFromPath(profile_, file_info.file_path);
+  if (!external_url.is_empty())
+    url = external_url;
 #endif
 
   if (url.is_empty())
     return;
 
   OpenURL(OpenURLParams(
-      url, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false));
+      url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -2010,7 +2036,7 @@ void Browser::Observe(int type,
 
 void Browser::OnDevToolsDisabledChanged() {
   if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled))
-    content::DevToolsManager::GetInstance()->CloseAllClientHosts();
+    content::DevToolsAgentHost::DetachAllClients();
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -2104,11 +2130,6 @@ void Browser::ProcessPendingUIUpdates() {
     if (contents == tab_strip_model_->GetActiveWebContents()) {
       // Updates that only matter when the tab is selected go here.
 
-      if (flags & content::INVALIDATE_TYPE_PAGE_ACTIONS) {
-        LocationBar* location_bar = window()->GetLocationBar();
-        if (location_bar)
-          location_bar->UpdatePageActions();
-      }
       // Updating the URL happens synchronously in ScheduleUIUpdate.
       if (flags & content::INVALIDATE_TYPE_LOAD && GetStatusBubble()) {
         GetStatusBubble()->SetStatus(CoreTabHelper::FromWebContents(
@@ -2228,14 +2249,15 @@ void Browser::SetAsDelegate(WebContents* web_contents, bool set_delegate) {
   CoreTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
   SearchEngineTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
   SearchTabHelper::FromWebContents(web_contents)->set_delegate(delegate);
-  if (delegate)
+  translate::ContentTranslateDriver& content_translate_driver =
+      ChromeTranslateClient::FromWebContents(web_contents)->translate_driver();
+  if (delegate) {
     ZoomController::FromWebContents(web_contents)->AddObserver(this);
-  else
+    content_translate_driver.AddObserver(translate_driver_observer_.get());
+  } else {
     ZoomController::FromWebContents(web_contents)->RemoveObserver(this);
-  ChromeTranslateClient* chrome_translate_client =
-      ChromeTranslateClient::FromWebContents(web_contents);
-  chrome_translate_client->translate_driver().set_observer(
-      delegate ? delegate->translate_driver_observer_.get() : NULL);
+    content_translate_driver.RemoveObserver(translate_driver_observer_.get());
+  }
 }
 
 void Browser::CloseFrame() {
@@ -2286,10 +2308,11 @@ bool Browser::ShouldShowLocationBar() const {
     return true;
 
   if (is_app()) {
-    if (CommandLine::ForCurrentProcess()->HasSwitch(
-            switches::kEnableStreamlinedHostedApps)) {
-      // If kEnableStreamlinedHostedApps is true, show the location bar for
-      // bookmark apps.
+    if (extensions::util::IsStreamlinedHostedAppsEnabled() &&
+        host_desktop_type() != chrome::HOST_DESKTOP_TYPE_ASH) {
+      // If streamlined hosted apps are enabled, show the location bar for
+      // bookmark apps, except on ash which has the toolbar merged into the
+      // frame.
       ExtensionService* service =
           extensions::ExtensionSystem::Get(profile_)->extension_service();
       const extensions::Extension* extension =
@@ -2339,7 +2362,7 @@ void Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason reason) {
   if (profile_->IsGuestSession()) {
     state = BookmarkBar::HIDDEN;
   } else if (browser_defaults::bookmarks_enabled &&
-      profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar) &&
+      profile_->GetPrefs()->GetBoolean(bookmarks::prefs::kShowBookmarkBar) &&
       !ShouldHideUIForFullscreen()) {
     state = BookmarkBar::SHOW;
   } else {
@@ -2457,7 +2480,7 @@ bool Browser::MaybeCreateBackgroundContents(
     contents->web_contents()->GetController().LoadURL(
         target_url,
         content::Referrer(),
-        content::PAGE_TRANSITION_LINK,
+        ui::PAGE_TRANSITION_LINK,
         std::string());  // No extra headers.
   }