Commit 1d778dbc authored by megjablon's avatar megjablon Committed by Commit bot

Add PreviewsInfoBarTabHelper

PreviewsInfoBarTabHelper tracks whether a previews infobar
has been shown for a tab. If a previews infobar has already
been shown for a tab, it will not be shown again.

BUG=615566

Review-Url: https://codereview.chromium.org/2256383002
Cr-Commit-Position: refs/heads/master@{#418588}
parent 9305bb6b
...@@ -876,6 +876,8 @@ split_static_library("browser") { ...@@ -876,6 +876,8 @@ split_static_library("browser") {
"prerender/prerender_util.h", "prerender/prerender_util.h",
"previews/previews_infobar_delegate.cc", "previews/previews_infobar_delegate.cc",
"previews/previews_infobar_delegate.h", "previews/previews_infobar_delegate.h",
"previews/previews_infobar_tab_helper.cc",
"previews/previews_infobar_tab_helper.h",
"previews/previews_service.cc", "previews/previews_service.cc",
"previews/previews_service.h", "previews/previews_service.h",
"previews/previews_service_factory.cc", "previews/previews_service_factory.cc",
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h" #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h" #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
#include "chrome/browser/previews/previews_infobar_tab_helper.h"
#include "chrome/grit/generated_resources.h" #include "chrome/grit/generated_resources.h"
#include "components/infobars/core/infobar.h" #include "components/infobars/core/infobar.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
...@@ -19,7 +20,10 @@ PreviewsInfoBarDelegate::~PreviewsInfoBarDelegate() {} ...@@ -19,7 +20,10 @@ PreviewsInfoBarDelegate::~PreviewsInfoBarDelegate() {}
// static // static
void PreviewsInfoBarDelegate::Create(content::WebContents* web_contents, void PreviewsInfoBarDelegate::Create(content::WebContents* web_contents,
PreviewsInfoBarType infobar_type) { PreviewsInfoBarType infobar_type) {
// TODO(megjablon): Check that the infobar was not already shown. PreviewsInfoBarTabHelper* infobar_tab_helper =
PreviewsInfoBarTabHelper::FromWebContents(web_contents);
if (infobar_tab_helper->displayed_preview_infobar())
return;
InfoBarService* infobar_service = InfoBarService* infobar_service =
InfoBarService::FromWebContents(web_contents); InfoBarService::FromWebContents(web_contents);
...@@ -35,6 +39,8 @@ void PreviewsInfoBarDelegate::Create(content::WebContents* web_contents, ...@@ -35,6 +39,8 @@ void PreviewsInfoBarDelegate::Create(content::WebContents* web_contents,
web_contents->GetBrowserContext()); web_contents->GetBrowserContext());
data_reduction_proxy_settings->IncrementLoFiUIShown(); data_reduction_proxy_settings->IncrementLoFiUIShown();
} }
infobar_tab_helper->set_displayed_preview_infobar(true);
} }
PreviewsInfoBarDelegate::PreviewsInfoBarDelegate( PreviewsInfoBarDelegate::PreviewsInfoBarDelegate(
......
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/previews/previews_infobar_tab_helper.h"
#include "chrome/browser/previews/previews_infobar_delegate.h"
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "net/http/http_response_headers.h"
#include "url/gurl.h"
DEFINE_WEB_CONTENTS_USER_DATA_KEY(PreviewsInfoBarTabHelper);
PreviewsInfoBarTabHelper::~PreviewsInfoBarTabHelper() {}
PreviewsInfoBarTabHelper::PreviewsInfoBarTabHelper(
content::WebContents* web_contents)
: content::WebContentsObserver(web_contents),
displayed_preview_infobar_(false) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
}
void PreviewsInfoBarTabHelper::DidStartProvisionalLoadForFrame(
content::RenderFrameHost* render_frame_host,
const GURL& validated_url,
bool is_error_page,
bool is_iframe_srcdoc) {
if (!render_frame_host->GetParent())
set_displayed_preview_infobar(false);
}
void PreviewsInfoBarTabHelper::DidFinishNavigation(
content::NavigationHandle* navigation_handle) {
if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted())
return;
const net::HttpResponseHeaders* headers =
navigation_handle->GetResponseHeaders();
if (headers &&
headers->HasHeaderValue(
data_reduction_proxy::chrome_proxy_header(),
data_reduction_proxy::chrome_proxy_lo_fi_preview_directive())) {
PreviewsInfoBarDelegate::Create(navigation_handle->GetWebContents(),
PreviewsInfoBarDelegate::LITE_PAGE);
}
}
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_PREVIEWS_PREVIEWS_INFOBAR_TAB_HELPER_H_
#define CHROME_BROWSER_PREVIEWS_PREVIEWS_INFOBAR_TAB_HELPER_H_
#include "base/macros.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
class GURL;
namespace content {
class RenderFrameHost;
}
// Tracks whether a previews infobar has been shown for a page. Handles showing
// the infobar when the main frame response indicates a Lite Page.
class PreviewsInfoBarTabHelper
: public content::WebContentsObserver,
public content::WebContentsUserData<PreviewsInfoBarTabHelper> {
public:
~PreviewsInfoBarTabHelper() override;
// Indicates whether the InfoBar for a preview has been shown for the page.
bool displayed_preview_infobar() const {
return displayed_preview_infobar_;
}
// Sets whether the InfoBar for a preview has been shown for the page.
// |displayed_preview_infobar_| is reset to false on
// DidStartProvisionalLoadForFrame for the main frame.
void set_displayed_preview_infobar(bool displayed) {
displayed_preview_infobar_ = displayed;
}
private:
friend class content::WebContentsUserData<PreviewsInfoBarTabHelper>;
explicit PreviewsInfoBarTabHelper(content::WebContents* web_contents);
// Overridden from content::WebContentsObserver:
void DidStartProvisionalLoadForFrame(
content::RenderFrameHost* render_frame_host,
const GURL& validated_url,
bool is_error_page,
bool is_iframe_srcdoc) override;
void DidFinishNavigation(
content::NavigationHandle* navigation_handle) override;
// True if the InfoBar for a preview has been shown for the page.
bool displayed_preview_infobar_;
DISALLOW_COPY_AND_ASSIGN(PreviewsInfoBarTabHelper);
};
#endif // CHROME_BROWSER_PREVIEWS_PREVIEWS_INFOBAR_TAB_HELPER_H_
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h" #include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
#include "chrome/browser/predictors/resource_prefetch_predictor_tab_helper.h" #include "chrome/browser/predictors/resource_prefetch_predictor_tab_helper.h"
#include "chrome/browser/prerender/prerender_tab_helper.h" #include "chrome/browser/prerender/prerender_tab_helper.h"
#include "chrome/browser/previews/previews_infobar_tab_helper.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/sessions/session_tab_helper.h"
#include "chrome/browser/ssl/chrome_security_state_model_client.h" #include "chrome/browser/ssl/chrome_security_state_model_client.h"
...@@ -184,6 +185,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { ...@@ -184,6 +185,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
PopupBlockerTabHelper::CreateForWebContents(web_contents); PopupBlockerTabHelper::CreateForWebContents(web_contents);
PrefsTabHelper::CreateForWebContents(web_contents); PrefsTabHelper::CreateForWebContents(web_contents);
prerender::PrerenderTabHelper::CreateForWebContents(web_contents); prerender::PrerenderTabHelper::CreateForWebContents(web_contents);
PreviewsInfoBarTabHelper::CreateForWebContents(web_contents);
SearchTabHelper::CreateForWebContents(web_contents); SearchTabHelper::CreateForWebContents(web_contents);
ChromeSecurityStateModelClient::CreateForWebContents(web_contents); ChromeSecurityStateModelClient::CreateForWebContents(web_contents);
if (SiteEngagementService::IsEnabled()) if (SiteEngagementService::IsEnabled())
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment