Commit 172220cf authored by Robert Ogden's avatar Robert Ogden Committed by Commit Bot

Add Java bridge for Previews

Wires the Java bridge into the ToolbarModel to trigger the Omnibox
Previews badge.

Also includes a small pre-s13n hack to enable the Previews UI to be
displayed when a HTTPS Lite Page Preview is shown.

Bug: 871839
Change-Id: Ia279cd6793c4517d02534a3d16029809c16b34f1
Reviewed-on: https://chromium-review.googlesource.com/1180372
Commit-Queue: Theresa <twellington@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarRyan Sturm <ryansturm@chromium.org>
Reviewed-by: default avatarCharlie Harrison <csharrison@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585643}
parent 10529ea2
// Copyright 2018 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.
package org.chromium.chrome.browser.previews;
import org.chromium.content_public.browser.WebContents;
/**
* Java bridge class to C++ Previews code.
*/
public final class PreviewsAndroidBridge {
private static PreviewsAndroidBridge sBridge;
public static PreviewsAndroidBridge getInstance() {
if (sBridge == null) {
sBridge = new PreviewsAndroidBridge();
}
return sBridge;
}
private final long mNativePreviewsAndroidBridge;
private PreviewsAndroidBridge() {
mNativePreviewsAndroidBridge = nativeInit();
}
public boolean shouldShowPreviewUI(WebContents webContents) {
return nativeShouldShowPreviewUI(mNativePreviewsAndroidBridge, webContents);
}
private native long nativeInit();
private native boolean nativeShouldShowPreviewUI(
long nativePreviewsAndroidBridge, WebContents webContents);
}
......@@ -28,6 +28,7 @@ import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.omnibox.AutocompleteController;
import org.chromium.chrome.browser.omnibox.OmniboxUrlEmphasizer;
import org.chromium.chrome.browser.omnibox.UrlBarData;
import org.chromium.chrome.browser.previews.PreviewsAndroidBridge;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.search_engines.TemplateUrlService;
import org.chromium.chrome.browser.tab.Tab;
......@@ -325,8 +326,9 @@ public class ToolbarModel implements ToolbarDataProvider {
@Override
public boolean isPreview() {
// TODO(crbug.com/871839): Link this up with the native previews state.
return false;
return hasTab() && mTab.getWebContents() != null && !mTab.isNativePage()
&& !mTab.isShowingInterstitialPage()
&& PreviewsAndroidBridge.getInstance().shouldShowPreviewUI(mTab.getWebContents());
}
@Override
......
......@@ -1067,6 +1067,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/payments/SslValidityChecker.java",
"java/src/org/chromium/chrome/browser/payments/UriUtils.java",
"java/src/org/chromium/chrome/browser/payments/ui/ContactDetailsSection.java",
"java/src/org/chromium/chrome/browser/previews/PreviewsAndroidBridge.java",
"java/src/org/chromium/chrome/browser/widget/prefeditor/Completable.java",
"java/src/org/chromium/chrome/browser/widget/prefeditor/DropdownFieldAdapter.java",
"java/src/org/chromium/chrome/browser/widget/prefeditor/EditableOption.java",
......
......@@ -2439,6 +2439,8 @@ jumbo_split_static_library("browser") {
"policy/cloud/user_policy_signin_service_mobile.h",
"prerender/external_prerender_handler_android.cc",
"prerender/external_prerender_handler_android.h",
"previews/android/previews_android_bridge.cc",
"previews/android/previews_android_bridge.h",
"profiles/profile_android.cc",
"profiles/profile_android.h",
"search/contextual_search_policy_handler_android.cc",
......@@ -4633,6 +4635,7 @@ if (is_android) {
"../android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java",
"../android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java",
"../android/java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java",
"../android/java/src/org/chromium/chrome/browser/previews/PreviewsAndroidBridge.java",
"../android/java/src/org/chromium/chrome/browser/profiles/Profile.java",
"../android/java/src/org/chromium/chrome/browser/profiles/ProfileDownloader.java",
"../android/java/src/org/chromium/chrome/browser/profiles/ProfileManagerUtils.java",
......
......@@ -32,6 +32,7 @@
#include "chrome/browser/prerender/prerender_manager_factory.h"
#include "chrome/browser/prerender/prerender_resource_throttle.h"
#include "chrome/browser/prerender/prerender_util.h"
#include "chrome/browser/previews/previews_lite_page_navigation_throttle.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_io_data.h"
#include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
......@@ -797,6 +798,13 @@ ChromeResourceDispatcherHostDelegate::DetermineCommittedPreviews(
content::PreviewsState previews_state =
data_reduction_proxy::ContentLoFiDecider::
DetermineCommittedServerPreviewsState(*request, initial_state);
// TODO(crbug.com/842233): This should be removed in the previews s13n work.
if (PreviewsLitePageNavigationThrottle::GetOriginalURL(
request->url(), nullptr /* original_url */)) {
previews_state = previews_state & content::LITE_PAGE_REDIRECT_ON;
}
return previews::DetermineCommittedClientPreviewsState(
*request, previews_state, previews_decider);
}
// 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/android/previews_android_bridge.h"
#include <memory>
#include "base/android/jni_android.h"
#include "chrome/browser/previews/previews_ui_tab_helper.h"
#include "content/public/browser/web_contents.h"
#include "jni/PreviewsAndroidBridge_jni.h"
static jlong JNI_PreviewsAndroidBridge_Init(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj) {
return reinterpret_cast<intptr_t>(new PreviewsAndroidBridge(env, obj));
}
PreviewsAndroidBridge::PreviewsAndroidBridge(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj)
: weak_factory_(this) {}
PreviewsAndroidBridge::~PreviewsAndroidBridge() {}
jboolean PreviewsAndroidBridge::ShouldShowPreviewUI(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents) {
content::WebContents* web_contents =
content::WebContents::FromJavaWebContents(j_web_contents);
if (!web_contents)
return false;
PreviewsUITabHelper* tab_helper =
PreviewsUITabHelper::FromWebContents(web_contents);
if (!tab_helper)
return false;
return tab_helper->should_display_android_omnibox_badge();
}
// Copyright 2018 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_ANDROID_PREVIEWS_ANDROID_BRIDGE_H_
#define CHROME_BROWSER_PREVIEWS_ANDROID_PREVIEWS_ANDROID_BRIDGE_H_
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h"
#include "base/compiler_specific.h"
#include "base/memory/weak_ptr.h"
class PreviewsAndroidBridge {
public:
PreviewsAndroidBridge(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
virtual ~PreviewsAndroidBridge();
jboolean ShouldShowPreviewUI(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jobject>& j_web_contents);
private:
base::WeakPtrFactory<PreviewsAndroidBridge> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(PreviewsAndroidBridge);
};
#endif // CHROME_BROWSER_PREVIEWS_ANDROID_PREVIEWS_ANDROID_BRIDGE_H_
......@@ -127,7 +127,8 @@ bool PreviewsLitePageNavigationThrottle::GetOriginalURL(
if (!net::GetValueForKeyInQuery(url, "u", &original_url_query_param))
return false;
*original_url = original_url_query_param;
if (original_url)
*original_url = original_url_query_param;
return true;
}
......
......@@ -27,7 +27,8 @@ class PreviewsLitePageNavigationThrottle : public content::NavigationThrottle {
~PreviewsLitePageNavigationThrottle() override;
// Attempts to extract the original URL from the given Previews URL. Returns
// false if |url| is not a valid Preview URL.
// false if |url| is not a valid Preview URL. It is ok to pass nullptr for
// |original_url| if you only want the boolean return value.
static bool GetOriginalURL(GURL url, std::string* original_url);
private:
......
......@@ -6,6 +6,8 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/feature_list.h"
#include "build/build_config.h"
#include "chrome/browser/loader/chrome_navigation_data.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
......@@ -21,6 +23,7 @@
#include "components/previews/content/previews_content_util.h"
#include "components/previews/content/previews_ui_service.h"
#include "components/previews/core/previews_experiments.h"
#include "components/previews/core/previews_features.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigation_handle.h"
......@@ -68,15 +71,21 @@ void PreviewsUITabHelper::ShowUIElement(
previews::PreviewsUIService* previews_ui_service =
previews_service ? previews_service->previews_ui_service() : nullptr;
#if defined(OS_ANDROID)
if (base::FeatureList::IsEnabled(
previews::features::kAndroidOmniboxPreviewsBadge)) {
should_display_android_omnibox_badge_ = true;
return;
}
#endif
PreviewsInfoBarDelegate::Create(
web_contents(), previews_type, previews_freshness, is_data_saver_user,
is_reload, std::move(on_dismiss_callback), previews_ui_service);
}
PreviewsUITabHelper::PreviewsUITabHelper(content::WebContents* web_contents)
: content::WebContentsObserver(web_contents),
displayed_preview_ui_(false),
displayed_preview_timestamp_(false) {
: content::WebContentsObserver(web_contents) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
}
......@@ -88,6 +97,7 @@ void PreviewsUITabHelper::DidFinishNavigation(
return;
previews_user_data_.reset();
should_display_android_omnibox_badge_ = false;
// Store Previews information for this navigation.
ChromeNavigationData* nav_data = static_cast<ChromeNavigationData*>(
navigation_handle->GetNavigationData());
......
......@@ -41,6 +41,12 @@ class PreviewsUITabHelper
displayed_preview_ui_ = displayed;
}
// Indicates whether the Android Omnibox badge should be shown as the Previews
// UI.
bool should_display_android_omnibox_badge() const {
return should_display_android_omnibox_badge_;
}
// Sets whether the timestamp on the UI for a preview has been shown for
// the page. |displayed_preview_timestamp_| is reset to false on
// DidStartProvisionalLoadForFrame for the main frame.
......@@ -65,10 +71,13 @@ class PreviewsUITabHelper
content::NavigationHandle* navigation_handle) override;
// True if the UI for a preview has been shown for the page.
bool displayed_preview_ui_;
bool displayed_preview_ui_ = false;
// True if the UI with a timestamp was shown for the page.
bool displayed_preview_timestamp_;
bool displayed_preview_timestamp_ = false;
// True if the Android Omnibox badge should be shown as the Previews UI.
bool should_display_android_omnibox_badge_ = false;
// The Previews information related to the navigation that was most recently
// finished.
......
......@@ -10,7 +10,9 @@
#include "base/memory/ptr_util.h"
#include "base/run_loop.h"
#include "base/strings/stringprintf.h"
#include "base/test/scoped_feature_list.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "chrome/browser/infobars/mock_infobar_service.h"
#include "chrome/browser/loader/chrome_navigation_data.h"
#include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings.h"
......@@ -28,6 +30,7 @@
#include "components/offline_pages/core/offline_page_item.h"
#include "components/offline_pages/core/request_header/offline_page_header.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/previews/core/previews_features.h"
#include "components/previews/core/previews_user_data.h"
#include "components/proxy_config/proxy_config_pref_names.h"
#include "content/public/browser/navigation_handle.h"
......@@ -169,6 +172,28 @@ TEST_F(PreviewsUITabHelperUnitTest, DidFinishNavigationCreatesLitePageInfoBar) {
EXPECT_FALSE(ui_tab_helper->displayed_preview_ui());
}
#if defined(OS_ANDROID)
TEST_F(PreviewsUITabHelperUnitTest, DidFinishNavigationDisplaysOmniboxBadge) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(
previews::features::kAndroidOmniboxPreviewsBadge);
PreviewsUITabHelper* ui_tab_helper =
PreviewsUITabHelper::FromWebContents(web_contents());
EXPECT_FALSE(ui_tab_helper->displayed_preview_ui());
EXPECT_FALSE(ui_tab_helper->should_display_android_omnibox_badge());
EXPECT_EQ(0U, infobar_service()->infobar_count());
SetCommittedPreviewsType(previews::PreviewsType::LITE_PAGE);
SimulateWillProcessResponse();
CallDidFinishNavigation();
EXPECT_TRUE(ui_tab_helper->should_display_android_omnibox_badge());
EXPECT_FALSE(ui_tab_helper->displayed_preview_ui());
EXPECT_EQ(0U, infobar_service()->infobar_count());
}
#endif
TEST_F(PreviewsUITabHelperUnitTest,
DidFinishNavigationCreatesNoScriptPreviewsInfoBar) {
PreviewsUITabHelper* ui_tab_helper =
......
......@@ -81,5 +81,10 @@ const base::Feature kResourceLoadingHints{"ResourceLoadingHints",
const base::Feature kLitePageServerPreviews{"LitePageServerPreviews",
base::FEATURE_DISABLED_BY_DEFAULT};
// Shows a Previews icon and string in the Android Omnibox instead of an Infobar
// when enabled. Only works and is honored on Android..
const base::Feature kAndroidOmniboxPreviewsBadge{
"AndroidOmniboxPreviewsBadge", base::FEATURE_DISABLED_BY_DEFAULT};
} // namespace features
} // namespace previews
......@@ -20,6 +20,7 @@ extern const base::Feature kOptimizationHintsExperiments;
constexpr char kOptimizationHintsExperimentNameParam[] = "experiment_name";
extern const base::Feature kResourceLoadingHints;
extern const base::Feature kLitePageServerPreviews;
extern const base::Feature kAndroidOmniboxPreviewsBadge;
} // namespace features
} // namespace previews
......
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