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") {
"prerender/prerender_util.h",
"previews/previews_infobar_delegate.cc",
"previews/previews_infobar_delegate.h",
"previews/previews_infobar_tab_helper.cc",
"previews/previews_infobar_tab_helper.h",
"previews/previews_service.cc",
"previews/previews_service.h",
"previews/previews_service_factory.cc",
......
......@@ -8,6 +8,7 @@
#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_factory.h"
#include "chrome/browser/previews/previews_infobar_tab_helper.h"
#include "chrome/grit/generated_resources.h"
#include "components/infobars/core/infobar.h"
#include "content/public/browser/render_frame_host.h"
......@@ -19,7 +20,10 @@ PreviewsInfoBarDelegate::~PreviewsInfoBarDelegate() {}
// static
void PreviewsInfoBarDelegate::Create(content::WebContents* web_contents,
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::FromWebContents(web_contents);
......@@ -35,6 +39,8 @@ void PreviewsInfoBarDelegate::Create(content::WebContents* web_contents,
web_contents->GetBrowserContext());
data_reduction_proxy_settings->IncrementLoFiUIShown();
}
infobar_tab_helper->set_displayed_preview_infobar(true);
}
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 @@
#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
#include "chrome/browser/predictors/resource_prefetch_predictor_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/sessions/session_tab_helper.h"
#include "chrome/browser/ssl/chrome_security_state_model_client.h"
......@@ -184,6 +185,7 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) {
PopupBlockerTabHelper::CreateForWebContents(web_contents);
PrefsTabHelper::CreateForWebContents(web_contents);
prerender::PrerenderTabHelper::CreateForWebContents(web_contents);
PreviewsInfoBarTabHelper::CreateForWebContents(web_contents);
SearchTabHelper::CreateForWebContents(web_contents);
ChromeSecurityStateModelClient::CreateForWebContents(web_contents);
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