Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(289)

Unified Diff: chrome/browser/usb/web_usb_detector.cc

Issue 2824923002: Suppress WebUSB notifications when appropriate (Closed)
Patch Set: Assert clicking removes notification Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/usb/web_usb_detector.cc
diff --git a/chrome/browser/usb/web_usb_detector.cc b/chrome/browser/usb/web_usb_detector.cc
index 9074f3c938e60541e04f44842c92bb3197e219a3..3bda60e445baf769e3694ba65b0e483235cdba82 100644
--- a/chrome/browser/usb/web_usb_detector.cc
+++ b/chrome/browser/usb/web_usb_detector.cc
@@ -13,9 +13,15 @@
#include "chrome/browser/net/referrer.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_tab_strip_tracker.h"
+#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/grit/generated_resources.h"
#include "chrome/grit/theme_resources.h"
+#include "content/public/browser/web_contents.h"
#include "content/public/common/origin_util.h"
#include "device/base/device_client.h"
#include "device/base/features.h"
@@ -58,6 +64,8 @@ enum WebUsbNotificationClosed {
WEBUSB_NOTIFICATION_CLOSED_BY_USER,
// The user clicked on the notification.
WEBUSB_NOTIFICATION_CLOSED_CLICKED,
+ // The user independently navigated to the landing page.
+ WEBUSB_NOTIFICATION_CLOSED_MANUAL_NAVIGATION,
Reilly Grant (use Gerrit) 2017/04/27 20:25:43 Update tools/metrics/histograms/histograms.xml to
cco3 2017/04/27 21:31:16 Done. Ah, forgot to do this.
// Maximum value for the enum.
WEBUSB_NOTIFICATION_CLOSED_MAX
};
@@ -74,6 +82,23 @@ Browser* GetBrowser() {
return browser_displayer.browser();
}
+GURL GetActiveTabURL() {
+ Browser* browser = chrome::FindLastActiveWithProfile(
+ ProfileManager::GetLastUsedProfileAllowedByPolicy());
+ if (!browser) {
+ return GURL();
+ }
Reilly Grant (use Gerrit) 2017/04/27 20:25:43 nit: No braces around single-line ifs.
cco3 2017/04/27 21:31:16 Done.
+
+ TabStripModel* tab_strip_model = browser->tab_strip_model();
+ content::WebContents* web_contents =
+ tab_strip_model->GetWebContentsAt(tab_strip_model->active_index());
+ if (!web_contents) {
+ return GURL();
+ }
Reilly Grant (use Gerrit) 2017/04/27 20:25:43 nit: No braces around single-line ifs.
cco3 2017/04/27 21:31:16 Done.
+
+ return web_contents->GetURL();
+}
+
void OpenURL(const GURL& url) {
GetBrowser()->OpenURL(content::OpenURLParams(
url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
@@ -81,26 +106,65 @@ void OpenURL(const GURL& url) {
}
// Delegate for webusb notification
-class WebUsbNotificationDelegate : public message_center::NotificationDelegate {
+class WebUsbNotificationDelegate : public TabStripModelObserver,
+ public message_center::NotificationDelegate {
public:
WebUsbNotificationDelegate(const GURL& landing_page,
const std::string& notification_id)
- : landing_page_(landing_page), notification_id_(notification_id) {}
+ : landing_page_(landing_page),
+ notification_id_(notification_id),
+ disposition_(WEBUSB_NOTIFICATION_CLOSED),
+ browser_tab_strip_tracker_(this, nullptr, nullptr) {
+ browser_tab_strip_tracker_.Init();
+ }
+
+ void ActiveTabChanged(content::WebContents* old_contents,
+ content::WebContents* new_contents,
+ int index,
+ int reason) override {
+ if (new_contents->GetURL() == landing_page_) {
+ // If the disposition is not already set, go ahead and set it.
+ if (disposition_ == WEBUSB_NOTIFICATION_CLOSED) {
+ disposition_ = WEBUSB_NOTIFICATION_CLOSED_MANUAL_NAVIGATION;
+ }
Reilly Grant (use Gerrit) 2017/04/27 20:25:43 nit: No braces around single-line ifs.
+ message_center::MessageCenter::Get()->RemoveNotification(
+ notification_id_, false /* by_user */);
+ }
+ }
void Click() override {
- clicked_ = true;
+ disposition_ = WEBUSB_NOTIFICATION_CLOSED_CLICKED;
+
+ // If the URL is already open, activate that tab.
+ content::WebContents* tab_to_activate = nullptr;
+ Browser* browser = nullptr;
+ for (TabContentsIterator it; !it.done(); it.Next()) {
+ if (it->GetVisibleURL() == landing_page_ &&
+ (!tab_to_activate ||
+ it->GetLastActiveTime() > tab_to_activate->GetLastActiveTime())) {
+ tab_to_activate = *it;
+ browser = it.browser();
+ }
+ }
+ if (tab_to_activate) {
+ TabStripModel* tab_strip_model = browser->tab_strip_model();
+ tab_strip_model->ActivateTabAt(
+ tab_strip_model->GetIndexOfWebContents(tab_to_activate), false);
+ browser->window()->Activate();
+ return;
+ }
+
+ // If the URL is not already open, open it in a new tab.
OpenURL(landing_page_);
- message_center::MessageCenter::Get()->RemoveNotification(
- notification_id_, false /* by_user */);
}
void Close(bool by_user) override {
- if (clicked_)
- RecordNotificationClosure(WEBUSB_NOTIFICATION_CLOSED_CLICKED);
- else if (by_user)
- RecordNotificationClosure(WEBUSB_NOTIFICATION_CLOSED_BY_USER);
- else
- RecordNotificationClosure(WEBUSB_NOTIFICATION_CLOSED);
+ if (by_user) {
+ disposition_ = WEBUSB_NOTIFICATION_CLOSED_BY_USER;
+ }
Reilly Grant (use Gerrit) 2017/04/27 20:25:43 nit: No braces around single-line ifs.
cco3 2017/04/27 21:31:16 Done.
+ RecordNotificationClosure(disposition_);
+
+ browser_tab_strip_tracker_.StopObservingAndSendOnBrowserRemoved();
}
private:
@@ -108,7 +172,8 @@ class WebUsbNotificationDelegate : public message_center::NotificationDelegate {
GURL landing_page_;
std::string notification_id_;
- bool clicked_ = false;
+ WebUsbNotificationClosed disposition_;
+ BrowserTabStripTracker browser_tab_strip_tracker_;
DISALLOW_COPY_AND_ASSIGN(WebUsbNotificationDelegate);
};
@@ -148,6 +213,10 @@ void WebUsbDetector::OnDeviceAdded(scoped_refptr<device::UsbDevice> device) {
return;
}
+ if (landing_page == GetActiveTabURL()) {
+ return;
+ }
Reilly Grant (use Gerrit) 2017/04/27 20:25:43 nit: No braces around single-line ifs.
cco3 2017/04/27 21:31:16 Done.
+
std::string notification_id = device->guid();
ResourceBundle& rb = ResourceBundle::GetSharedInstance();
« no previous file with comments | « no previous file | chrome/browser/usb/web_usb_detector_unittest.cc » ('j') | chrome/browser/usb/web_usb_detector_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698