Commit 93363739 authored by Mugdha Lakhani's avatar Mugdha Lakhani Committed by Commit Bot

[WebLayer] Add native UrlBarController.

UrlBarControllerImpl will now call into the native counterpart to get
the formatted URL to be displayed. This reuses Omnibox code from
//components

Bug: 1025607
Change-Id: I57005c4940b5deec0d92f094ee65e36f6dc6851b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2023787Reviewed-by: default avatarMark Pearson <mpearson@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Reviewed-by: default avatarCarlos IL <carlosil@chromium.org>
Reviewed-by: default avatarTommy Li <tommycli@chromium.org>
Commit-Queue: Mugdha Lakhani <nator@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737944}
parent c091d33a
...@@ -8,6 +8,10 @@ bool LocationBarModelDelegate::ShouldPreventElision() const { ...@@ -8,6 +8,10 @@ bool LocationBarModelDelegate::ShouldPreventElision() const {
return false; return false;
} }
bool LocationBarModelDelegate::ShouldTrimDisplayUrlAfterHostName() const {
return false;
}
bool LocationBarModelDelegate::ShouldDisplayURL() const { bool LocationBarModelDelegate::ShouldDisplayURL() const {
return true; return true;
} }
......
...@@ -41,6 +41,10 @@ class LocationBarModelDelegate { ...@@ -41,6 +41,10 @@ class LocationBarModelDelegate {
// query in omnibox. Based on whether user has a specified extension enabled. // query in omnibox. Based on whether user has a specified extension enabled.
virtual bool ShouldPreventElision() const; virtual bool ShouldPreventElision() const;
// Returns whether everything everything after the hostname should be trimmed
// from the display URL.
virtual bool ShouldTrimDisplayUrlAfterHostName() const;
// Returns whether the URL for the current navigation entry should be // Returns whether the URL for the current navigation entry should be
// in the location bar. // in the location bar.
virtual bool ShouldDisplayURL() const; virtual bool ShouldDisplayURL() const;
......
...@@ -51,6 +51,9 @@ base::string16 LocationBarModelImpl::GetFormattedFullURL() const { ...@@ -51,6 +51,9 @@ base::string16 LocationBarModelImpl::GetFormattedFullURL() const {
base::string16 LocationBarModelImpl::GetURLForDisplay() const { base::string16 LocationBarModelImpl::GetURLForDisplay() const {
url_formatter::FormatUrlTypes format_types = url_formatter::FormatUrlTypes format_types =
url_formatter::kFormatUrlOmitDefaults; url_formatter::kFormatUrlOmitDefaults;
if (delegate_->ShouldTrimDisplayUrlAfterHostName()) {
format_types |= url_formatter::kFormatUrlTrimAfterHost;
}
// Early exit to prevent elision of URLs when relevant extension is enabled. // Early exit to prevent elision of URLs when relevant extension is enabled.
if (delegate_->ShouldPreventElision()) { if (delegate_->ShouldPreventElision()) {
......
...@@ -136,6 +136,10 @@ jumbo_static_library("weblayer_lib") { ...@@ -136,6 +136,10 @@ jumbo_static_library("weblayer_lib") {
"browser/system_network_context_manager.h", "browser/system_network_context_manager.h",
"browser/tab_impl.cc", "browser/tab_impl.cc",
"browser/tab_impl.h", "browser/tab_impl.h",
"browser/urlbar/autocomplete_scheme_classifier_impl.cc",
"browser/urlbar/autocomplete_scheme_classifier_impl.h",
"browser/urlbar/url_bar_controller_impl.cc",
"browser/urlbar/url_bar_controller_impl.h",
"browser/weblayer_browser_interface_binders.cc", "browser/weblayer_browser_interface_binders.cc",
"browser/weblayer_browser_interface_binders.h", "browser/weblayer_browser_interface_binders.h",
"browser/weblayer_content_browser_overlay_manifest.cc", "browser/weblayer_content_browser_overlay_manifest.cc",
...@@ -169,6 +173,7 @@ jumbo_static_library("weblayer_lib") { ...@@ -169,6 +173,7 @@ jumbo_static_library("weblayer_lib") {
"public/profile.h", "public/profile.h",
"public/tab.h", "public/tab.h",
"public/tab_observer.h", "public/tab_observer.h",
"public/url_bar_controller.h",
"renderer/content_renderer_client_impl.cc", "renderer/content_renderer_client_impl.cc",
"renderer/content_renderer_client_impl.h", "renderer/content_renderer_client_impl.h",
"renderer/ssl_error_helper.cc", "renderer/ssl_error_helper.cc",
...@@ -227,6 +232,7 @@ jumbo_static_library("weblayer_lib") { ...@@ -227,6 +232,7 @@ jumbo_static_library("weblayer_lib") {
"//components/keyed_service/content", "//components/keyed_service/content",
"//components/metrics", "//components/metrics",
"//components/network_time", "//components/network_time",
"//components/omnibox/browser",
"//components/policy/core/browser", "//components/policy/core/browser",
"//components/pref_registry:pref_registry", "//components/pref_registry:pref_registry",
"//components/prefs", "//components/prefs",
......
include_rules = [
"+components/omnibox/browser",
"+third_party/metrics_proto/omnibox_input_type.pb.h",
]
\ No newline at end of file
...@@ -130,6 +130,7 @@ generate_jni("jni") { ...@@ -130,6 +130,7 @@ generate_jni("jni") {
"org/chromium/weblayer_private/TabCallbackProxy.java", "org/chromium/weblayer_private/TabCallbackProxy.java",
"org/chromium/weblayer_private/TabImpl.java", "org/chromium/weblayer_private/TabImpl.java",
"org/chromium/weblayer_private/TopControlsContainerView.java", "org/chromium/weblayer_private/TopControlsContainerView.java",
"org/chromium/weblayer_private/UrlBarControllerImpl.java",
"org/chromium/weblayer_private/WebLayerImpl.java", "org/chromium/weblayer_private/WebLayerImpl.java",
"org/chromium/weblayer_private/metrics/MetricsServiceClient.java", "org/chromium/weblayer_private/metrics/MetricsServiceClient.java",
"org/chromium/weblayer_private/metrics/UmaUtils.java", "org/chromium/weblayer_private/metrics/UmaUtils.java",
......
...@@ -113,7 +113,7 @@ public class BrowserImpl extends IBrowser.Stub { ...@@ -113,7 +113,7 @@ public class BrowserImpl extends IBrowser.Stub {
createAttachmentState(context, windowAndroid); createAttachmentState(context, windowAndroid);
mNativeBrowser = BrowserImplJni.get().createBrowser(profile.getNativeProfile(), this); mNativeBrowser = BrowserImplJni.get().createBrowser(profile.getNativeProfile(), this);
mUrlBarController = new UrlBarControllerImpl(this); mUrlBarController = new UrlBarControllerImpl(this, mNativeBrowser);
for (Observer observer : sLifecycleObservers) { for (Observer observer : sLifecycleObservers) {
observer.onBrowserCreated(); observer.onBrowserCreated();
...@@ -352,8 +352,11 @@ public class BrowserImpl extends IBrowser.Stub { ...@@ -352,8 +352,11 @@ public class BrowserImpl extends IBrowser.Stub {
for (Observer observer : sLifecycleObservers) { for (Observer observer : sLifecycleObservers) {
observer.onBrowserDestroyed(); observer.onBrowserDestroyed();
} }
BrowserImplJni.get().deleteBrowser(mNativeBrowser);
// mUrlBarController keeps a reference to mNativeBrowser, and hence must be destroyed before
// mNativeBrowser.
mUrlBarController.destroy(); mUrlBarController.destroy();
BrowserImplJni.get().deleteBrowser(mNativeBrowser);
} }
private void destroyAttachmentState() { private void destroyAttachmentState() {
......
...@@ -10,6 +10,9 @@ import android.support.annotation.NonNull; ...@@ -10,6 +10,9 @@ import android.support.annotation.NonNull;
import android.util.TypedValue; import android.util.TypedValue;
import android.widget.TextView; import android.widget.TextView;
import org.chromium.base.LifetimeAssert;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.weblayer_private.interfaces.IObjectWrapper; import org.chromium.weblayer_private.interfaces.IObjectWrapper;
import org.chromium.weblayer_private.interfaces.IUrlBarController; import org.chromium.weblayer_private.interfaces.IUrlBarController;
import org.chromium.weblayer_private.interfaces.ObjectWrapper; import org.chromium.weblayer_private.interfaces.ObjectWrapper;
...@@ -18,6 +21,7 @@ import org.chromium.weblayer_private.interfaces.StrictModeWorkaround; ...@@ -18,6 +21,7 @@ import org.chromium.weblayer_private.interfaces.StrictModeWorkaround;
/** /**
* Implementation of {@link IUrlBarController}. * Implementation of {@link IUrlBarController}.
*/ */
@JNINamespace("weblayer")
public class UrlBarControllerImpl extends IUrlBarController.Stub { public class UrlBarControllerImpl extends IUrlBarController.Stub {
// To be kept in sync with the constants in UrlBarOptions.java // To be kept in sync with the constants in UrlBarOptions.java
public static final String URL_TEXT_SIZE = "UrlTextSize"; public static final String URL_TEXT_SIZE = "UrlTextSize";
...@@ -25,13 +29,27 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub { ...@@ -25,13 +29,27 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub {
public static final float MINIMUM_TEXT_SIZE = 5.0F; public static final float MINIMUM_TEXT_SIZE = 5.0F;
private BrowserImpl mBrowserImpl; private BrowserImpl mBrowserImpl;
private long mNativeUrlBarController;
private final LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this);
public UrlBarControllerImpl(BrowserImpl browserImpl) { private String getUrlForDisplay() {
mBrowserImpl = browserImpl; return UrlBarControllerImplJni.get().getUrlForDisplay(mNativeUrlBarController);
} }
void destroy() { void destroy() {
UrlBarControllerImplJni.get().deleteUrlBarController(mNativeUrlBarController);
mNativeUrlBarController = 0;
mBrowserImpl = null; mBrowserImpl = null;
// If mLifetimeAssert is GC'ed before this is called, it will throw an exception
// with a stack trace showing the stack during LifetimeAssert.create().
LifetimeAssert.setSafeToGc(mLifetimeAssert, true);
}
public UrlBarControllerImpl(BrowserImpl browserImpl, long nativeBrowser) {
mBrowserImpl = browserImpl;
mNativeUrlBarController =
UrlBarControllerImplJni.get().createUrlBarController(nativeBrowser);
} }
@Override @Override
...@@ -47,7 +65,8 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub { ...@@ -47,7 +65,8 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub {
return ObjectWrapper.wrap(urlBarView); return ObjectWrapper.wrap(urlBarView);
} }
private class UrlBarView extends TextView implements BrowserImpl.VisibleSecurityStateObserver { protected class UrlBarView
extends TextView implements BrowserImpl.VisibleSecurityStateObserver {
private float mTextSize; private float mTextSize;
public UrlBarView(@NonNull Context context, Bundle options) { public UrlBarView(@NonNull Context context, Bundle options) {
super(context); super(context);
...@@ -84,7 +103,16 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub { ...@@ -84,7 +103,16 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub {
// TODO(crbug.com/1025607): Add a way to get a formatted URL based // TODO(crbug.com/1025607): Add a way to get a formatted URL based
// on mOptions. // on mOptions.
if (mBrowserImpl == null) return; if (mBrowserImpl == null) return;
setText(mBrowserImpl.getActiveTab().getWebContents().getVisibleUrl()); String displayUrl =
UrlBarControllerImplJni.get().getUrlForDisplay(mNativeUrlBarController);
setText(displayUrl);
} }
} }
@NativeMethods()
interface Natives {
long createUrlBarController(long browserPtr);
void deleteUrlBarController(long urlBarControllerImplPtr);
String getUrlForDisplay(long nativeUrlBarControllerImpl);
}
} }
\ No newline at end of file
// Copyright 2020 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 "weblayer/browser/urlbar/autocomplete_scheme_classifier_impl.h"
#include "base/strings/string_util.h"
#include "content/public/common/url_constants.h"
#include "third_party/metrics_proto/omnibox_input_type.pb.h"
#include "url/url_constants.h"
namespace weblayer {
metrics::OmniboxInputType
AutocompleteSchemeClassifierImpl::GetInputTypeForScheme(
const std::string& scheme) const {
DCHECK_EQ(scheme, base::ToLowerASCII(scheme));
// Check against an allowlist of schemes.
const char* kKnownURLSchemes[] = {
url::kHttpScheme, url::kHttpsScheme,
url::kWsScheme, url::kWssScheme,
url::kFileScheme, url::kAboutScheme,
url::kFtpScheme, url::kBlobScheme,
url::kFileSystemScheme, content::kViewSourceScheme,
url::kJavaScriptScheme};
for (const char* known_scheme : kKnownURLSchemes) {
if (scheme == known_scheme)
return metrics::OmniboxInputType::URL;
}
return metrics::OmniboxInputType::EMPTY;
}
} // namespace weblayer
// Copyright 2020 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 WEBLAYER_BROWSER_URLBAR_AUTOCOMPLETE_SCHEME_CLASSIFIER_IMPL_H_
#define WEBLAYER_BROWSER_URLBAR_AUTOCOMPLETE_SCHEME_CLASSIFIER_IMPL_H_
#include "components/omnibox/browser/autocomplete_scheme_classifier.h"
namespace weblayer {
class AutocompleteSchemeClassifierImpl : public AutocompleteSchemeClassifier {
public:
AutocompleteSchemeClassifierImpl() = default;
// AutocompleteInputSchemeChecker:
metrics::OmniboxInputType GetInputTypeForScheme(
const std::string& scheme) const override;
~AutocompleteSchemeClassifierImpl() override = default;
AutocompleteSchemeClassifierImpl(const AutocompleteSchemeClassifierImpl&) =
delete;
AutocompleteSchemeClassifierImpl& operator=(
const AutocompleteSchemeClassifierImpl&) = delete;
};
} // namespace weblayer
#endif // WEBLAYER_BROWSER_URLBAR_AUTOCOMPLETE_SCHEME_CLASSIFIER_IMPL_H_
// Copyright 2020 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 "weblayer/browser/urlbar/url_bar_controller_impl.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "components/omnibox/browser/location_bar_model_impl.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_constants.h"
#include "weblayer/browser/browser_impl.h"
#include "weblayer/browser/tab_impl.h"
#include "weblayer/browser/urlbar/autocomplete_scheme_classifier_impl.h"
#include "weblayer/public/browser.h"
#include "weblayer/public/navigation_controller.h"
#if defined(OS_ANDROID)
#include "base/android/jni_string.h"
#include "weblayer/browser/java/jni/UrlBarControllerImpl_jni.h"
#endif
namespace weblayer {
std::unique_ptr<UrlBarController> UrlBarController::Create(Browser* browser) {
return std::make_unique<UrlBarControllerImpl>(
static_cast<BrowserImpl*>(browser));
}
#if defined(OS_ANDROID)
static jlong JNI_UrlBarControllerImpl_CreateUrlBarController(
JNIEnv* env,
jlong native_browser) {
return reinterpret_cast<intptr_t>(
new UrlBarControllerImpl(reinterpret_cast<BrowserImpl*>(native_browser)));
}
static void JNI_UrlBarControllerImpl_DeleteUrlBarController(
JNIEnv* env,
jlong native_urlbarcontroller) {
delete reinterpret_cast<UrlBarControllerImpl*>(native_urlbarcontroller);
}
#endif
UrlBarControllerImpl::UrlBarControllerImpl(BrowserImpl* browser)
: browser_(browser),
location_bar_model_(std::make_unique<LocationBarModelImpl>(
this,
content::kMaxURLDisplayChars)) {
DCHECK(browser_);
}
UrlBarControllerImpl::~UrlBarControllerImpl() = default;
#if defined(OS_ANDROID)
base::android::ScopedJavaLocalRef<jstring>
UrlBarControllerImpl::GetUrlForDisplay(JNIEnv* env) {
return base::android::ScopedJavaLocalRef<jstring>(
base::android::ConvertUTF16ToJavaString(env, GetUrlForDisplay()));
}
#endif
base::string16 UrlBarControllerImpl::GetUrlForDisplay() {
return location_bar_model_->GetURLForDisplay();
}
bool UrlBarControllerImpl::GetURL(GURL* url) const {
auto* active_tab = static_cast<TabImpl*>(browser_->GetActiveTab());
if (!active_tab)
return false;
auto* active_web_contents = active_tab->web_contents();
if (!active_web_contents)
return false;
DCHECK(url);
*url = active_web_contents->GetVisibleURL();
return true;
}
bool UrlBarControllerImpl::ShouldTrimDisplayUrlAfterHostName() const {
return true;
}
base::string16 UrlBarControllerImpl::FormattedStringWithEquivalentMeaning(
const GURL& url,
const base::string16& formatted_url) const {
return AutocompleteInput::FormattedStringWithEquivalentMeaning(
url, formatted_url, AutocompleteSchemeClassifierImpl(), nullptr);
}
} // namespace weblayer
// Copyright 2020 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 WEBLAYER_BROWSER_URLBAR_URL_BAR_CONTROLLER_IMPL_H_
#define WEBLAYER_BROWSER_URLBAR_URL_BAR_CONTROLLER_IMPL_H_
#include "base/strings/string16.h"
#include "build/build_config.h"
#include "components/omnibox/browser/location_bar_model_delegate.h"
#include "components/omnibox/browser/location_bar_model_impl.h"
#include "weblayer/public/url_bar_controller.h"
#if defined(OS_ANDROID)
#include "base/android/scoped_java_ref.h"
#endif
namespace weblayer {
class BrowserImpl;
class UrlBarControllerImpl : public UrlBarController,
public LocationBarModelDelegate {
public:
explicit UrlBarControllerImpl(BrowserImpl* native_browser);
~UrlBarControllerImpl() override;
UrlBarControllerImpl(const UrlBarControllerImpl&) = delete;
UrlBarControllerImpl& operator=(const UrlBarControllerImpl&) = delete;
#if defined(OS_ANDROID)
base::android::ScopedJavaLocalRef<jstring> GetUrlForDisplay(JNIEnv* env);
#endif
// UrlBarController:
base::string16 GetUrlForDisplay() override;
// LocationBarModelDelegate:
bool GetURL(GURL* url) const override;
bool ShouldTrimDisplayUrlAfterHostName() const override;
base::string16 FormattedStringWithEquivalentMeaning(
const GURL& url,
const base::string16& formatted_url) const override;
private:
BrowserImpl* const browser_;
std::unique_ptr<LocationBarModelImpl> location_bar_model_;
};
} // namespace weblayer
#endif // WEBLAYER_BROWSER_URLBAR_URL_BAR_CONTROLLER_IMPL_H_
// Copyright 2020 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 WEBLAYER_PUBLIC_URL_BAR_CONTROLLER_H_
#define WEBLAYER_PUBLIC_URL_BAR_CONTROLLER_H_
#include "base/strings/string16.h"
namespace weblayer {
class Browser;
class UrlBarController {
public:
static std::unique_ptr<UrlBarController> Create(Browser* browser);
virtual ~UrlBarController() {}
virtual base::string16 GetUrlForDisplay() = 0;
};
} // namespace weblayer
#endif // WEBLAYER_PUBLIC_URL_BAR_CONTROLLER_H_
\ No newline at end of file
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="5dp" android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_toStartOf="@+id/menu_button" /> android:layout_toStartOf="@+id/menu_button" />
...@@ -27,7 +29,8 @@ ...@@ -27,7 +29,8 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_marginBottom="-2px"
android:layout_alignBottom="@id/url_view_container" /> android:layout_alignBottom="@id/url_view_container" />
<ProgressBar <ProgressBar
...@@ -38,7 +41,7 @@ ...@@ -38,7 +41,7 @@
android:visibility="invisible" android:visibility="invisible"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignBottom="@id/url_view_container" android:layout_alignBottom="@id/menu_button"
android:layout_marginTop="0dp" android:layout_marginTop="0dp"
android:layout_marginBottom="-10px" android:layout_marginBottom="-10px"
android:layout_marginLeft="0dp" android:layout_marginLeft="0dp"
......
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