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 {
return false;
}
bool LocationBarModelDelegate::ShouldTrimDisplayUrlAfterHostName() const {
return false;
}
bool LocationBarModelDelegate::ShouldDisplayURL() const {
return true;
}
......
......@@ -41,6 +41,10 @@ class LocationBarModelDelegate {
// query in omnibox. Based on whether user has a specified extension enabled.
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
// in the location bar.
virtual bool ShouldDisplayURL() const;
......
......@@ -51,6 +51,9 @@ base::string16 LocationBarModelImpl::GetFormattedFullURL() const {
base::string16 LocationBarModelImpl::GetURLForDisplay() const {
url_formatter::FormatUrlTypes format_types =
url_formatter::kFormatUrlOmitDefaults;
if (delegate_->ShouldTrimDisplayUrlAfterHostName()) {
format_types |= url_formatter::kFormatUrlTrimAfterHost;
}
// Early exit to prevent elision of URLs when relevant extension is enabled.
if (delegate_->ShouldPreventElision()) {
......
......@@ -136,6 +136,10 @@ jumbo_static_library("weblayer_lib") {
"browser/system_network_context_manager.h",
"browser/tab_impl.cc",
"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.h",
"browser/weblayer_content_browser_overlay_manifest.cc",
......@@ -169,6 +173,7 @@ jumbo_static_library("weblayer_lib") {
"public/profile.h",
"public/tab.h",
"public/tab_observer.h",
"public/url_bar_controller.h",
"renderer/content_renderer_client_impl.cc",
"renderer/content_renderer_client_impl.h",
"renderer/ssl_error_helper.cc",
......@@ -227,6 +232,7 @@ jumbo_static_library("weblayer_lib") {
"//components/keyed_service/content",
"//components/metrics",
"//components/network_time",
"//components/omnibox/browser",
"//components/policy/core/browser",
"//components/pref_registry:pref_registry",
"//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") {
"org/chromium/weblayer_private/TabCallbackProxy.java",
"org/chromium/weblayer_private/TabImpl.java",
"org/chromium/weblayer_private/TopControlsContainerView.java",
"org/chromium/weblayer_private/UrlBarControllerImpl.java",
"org/chromium/weblayer_private/WebLayerImpl.java",
"org/chromium/weblayer_private/metrics/MetricsServiceClient.java",
"org/chromium/weblayer_private/metrics/UmaUtils.java",
......
......@@ -113,7 +113,7 @@ public class BrowserImpl extends IBrowser.Stub {
createAttachmentState(context, windowAndroid);
mNativeBrowser = BrowserImplJni.get().createBrowser(profile.getNativeProfile(), this);
mUrlBarController = new UrlBarControllerImpl(this);
mUrlBarController = new UrlBarControllerImpl(this, mNativeBrowser);
for (Observer observer : sLifecycleObservers) {
observer.onBrowserCreated();
......@@ -352,8 +352,11 @@ public class BrowserImpl extends IBrowser.Stub {
for (Observer observer : sLifecycleObservers) {
observer.onBrowserDestroyed();
}
BrowserImplJni.get().deleteBrowser(mNativeBrowser);
// mUrlBarController keeps a reference to mNativeBrowser, and hence must be destroyed before
// mNativeBrowser.
mUrlBarController.destroy();
BrowserImplJni.get().deleteBrowser(mNativeBrowser);
}
private void destroyAttachmentState() {
......
......@@ -10,6 +10,9 @@ import android.support.annotation.NonNull;
import android.util.TypedValue;
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.IUrlBarController;
import org.chromium.weblayer_private.interfaces.ObjectWrapper;
......@@ -18,6 +21,7 @@ import org.chromium.weblayer_private.interfaces.StrictModeWorkaround;
/**
* Implementation of {@link IUrlBarController}.
*/
@JNINamespace("weblayer")
public class UrlBarControllerImpl extends IUrlBarController.Stub {
// To be kept in sync with the constants in UrlBarOptions.java
public static final String URL_TEXT_SIZE = "UrlTextSize";
......@@ -25,13 +29,27 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub {
public static final float MINIMUM_TEXT_SIZE = 5.0F;
private BrowserImpl mBrowserImpl;
private long mNativeUrlBarController;
private final LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this);
public UrlBarControllerImpl(BrowserImpl browserImpl) {
mBrowserImpl = browserImpl;
private String getUrlForDisplay() {
return UrlBarControllerImplJni.get().getUrlForDisplay(mNativeUrlBarController);
}
void destroy() {
UrlBarControllerImplJni.get().deleteUrlBarController(mNativeUrlBarController);
mNativeUrlBarController = 0;
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
......@@ -47,7 +65,8 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub {
return ObjectWrapper.wrap(urlBarView);
}
private class UrlBarView extends TextView implements BrowserImpl.VisibleSecurityStateObserver {
protected class UrlBarView
extends TextView implements BrowserImpl.VisibleSecurityStateObserver {
private float mTextSize;
public UrlBarView(@NonNull Context context, Bundle options) {
super(context);
......@@ -84,7 +103,16 @@ public class UrlBarControllerImpl extends IUrlBarController.Stub {
// TODO(crbug.com/1025607): Add a way to get a formatted URL based
// on mOptions.
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 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_alignParentStart="true"
android:layout_gravity="center_vertical"
android:layout_toStartOf="@+id/menu_button" />
......@@ -27,7 +29,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true"
android:layout_alignParentEnd="true"
android:layout_marginBottom="-2px"
android:layout_alignBottom="@id/url_view_container" />
<ProgressBar
......@@ -38,7 +41,7 @@
android:visibility="invisible"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/url_view_container"
android:layout_alignBottom="@id/menu_button"
android:layout_marginTop="0dp"
android:layout_marginBottom="-10px"
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