Commit ba33cdb0 authored by Jinsuk Kim's avatar Jinsuk Kim Committed by Commit Bot

Android: Give Tab interface its own build target

chrome/browser/tab:java is a new build target that modularizes
Tab interface for the rest of the chrome for Android code. The target
consists of following classes with plans to include more from tab/
package:

 - EmptyTabObserver.java
 - Tab.java
 - TabAttributeKeys.java
 - TabAttributes.java
 - TabCreationState.java
 - TabHidingType.java
 - TabLaunchType.java
 - TabLifecycle.java
 - TabObserver.java
 - TabSelectionType.java

Bug: 995903
Change-Id: Id188c99b9e92195ce834ef7f5dc6d330d918c477
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2102998
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#758796}
parent 304e175c
......@@ -301,6 +301,7 @@ android_library("chrome_java") {
"//chrome/browser/profiles/android:java",
"//chrome/browser/settings:java",
"//chrome/browser/share/android:java_resources",
"//chrome/browser/tab:java",
"//chrome/browser/thumbnail:java",
"//chrome/browser/ui/android/appmenu:factory_java",
"//chrome/browser/ui/android/appmenu:java",
......@@ -475,7 +476,6 @@ android_library("chrome_java") {
"//chrome/browser/notifications/scheduler/public:jni_enums",
"//chrome/browser/supervised_user/supervised_user_error_page:enums_srcjar",
"//chrome/browser/ui:cookie_controls_enforcement_javagen",
"//chrome/browser/ui:tab_model_enums_java",
"//chrome/browser/updates/announcement_notification:jni_enums",
"//components/autofill_assistant/browser:autofill_assistant_enums_java",
"//components/browsing_data/core:browsing_data_utils_java",
......@@ -795,6 +795,7 @@ android_library("chrome_test_util_java") {
"//base:base_java",
"//base:base_java_test_support",
"//chrome/android:chrome_java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/android/appmenu:java",
"//chrome/test/android:chrome_java_test_support",
"//content/public/android:content_java",
......@@ -850,6 +851,7 @@ android_library("chrome_test_java") {
"//chrome/browser/profiles/android:java",
"//chrome/browser/settings:java",
"//chrome/browser/settings:javatests",
"//chrome/browser/tab:java",
"//chrome/browser/thumbnail:java",
"//chrome/browser/thumbnail:javatests",
"//chrome/browser/ui/android/appmenu:java",
......@@ -1040,6 +1042,7 @@ if (enable_vr || enable_arcore) {
"//chrome/android:app_hooks_java",
"//chrome/android:chrome_java",
"//chrome/android/features/vr:java",
"//chrome/browser/tab:java",
"//chrome/browser/util:java",
"//chrome/test/android:chrome_java_test_support",
"//components/embedder_support/android:util_java",
......@@ -1672,6 +1675,7 @@ android_library("browser_java_test_support") {
"//base:base_java",
"//base:base_java_test_support",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//components/offline_items_collection/core:core_java",
"//components/sync/protocol:protocol_java",
"//content/public/android:content_java",
......@@ -3007,6 +3011,7 @@ android_library("native_java_unittests_java") {
"//chrome/android:chrome_java",
"//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/util:java",
"//chrome/test/android:chrome_java_test_support",
"//components/embedder_support/android:context_menu_java",
......
......@@ -1577,32 +1577,24 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/AccessibilityVisibilityHandler.java",
"java/src/org/chromium/chrome/browser/tab/AuthenticatorNavigationInterceptor.java",
"java/src/org/chromium/chrome/browser/tab/AuthenticatorNavigationInterceptorTabHelper.java",
"java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java",
"java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java",
"java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java",
"java/src/org/chromium/chrome/browser/tab/SadTab.java",
"java/src/org/chromium/chrome/browser/tab/SadTabView.java",
"java/src/org/chromium/chrome/browser/tab/Tab.java",
"java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributeKeys.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributes.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java",
"java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java",
"java/src/org/chromium/chrome/browser/tab/TabBuilder.java",
"java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java",
"java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java",
"java/src/org/chromium/chrome/browser/tab/TabCreationState.java",
"java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java",
"java/src/org/chromium/chrome/browser/tab/TabFavicon.java",
"java/src/org/chromium/chrome/browser/tab/TabHelpers.java",
"java/src/org/chromium/chrome/browser/tab/TabHidingType.java",
"java/src/org/chromium/chrome/browser/tab/TabIdManager.java",
"java/src/org/chromium/chrome/browser/tab/TabImpl.java",
"java/src/org/chromium/chrome/browser/tab/TabImportanceManager.java",
"java/src/org/chromium/chrome/browser/tab/TabLifecycle.java",
"java/src/org/chromium/chrome/browser/tab/TabObserver.java",
"java/src/org/chromium/chrome/browser/tab/TabParentIntent.java",
"java/src/org/chromium/chrome/browser/tab/TabState.java",
"java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java",
......
......@@ -35,6 +35,7 @@ android_library("java") {
"//chrome/android:chrome_java",
"//chrome/browser/image_fetcher:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/messages/android:java",
"//chrome/browser/util:java",
"//components/browser_ui/modaldialog/android:java",
......
......@@ -61,6 +61,7 @@ android_library("test_java") {
"//chrome/android:chrome_test_java",
"//chrome/android:chrome_test_util_java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/messages/android:java",
"//chrome/test/android:chrome_java_test_support",
"//components/autofill/android:autofill_java",
......
......@@ -17,6 +17,7 @@ android_library("internal_java") {
"//chrome/android/features/keyboard_accessory/public:public_java",
"//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/android/favicon:java",
"//chrome/browser/util:java",
"//components/autofill/android:autofill_java",
......
......@@ -65,6 +65,7 @@ android_library("java") {
"//chrome/android/third_party/compositor_animator:compositor_animator_java",
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/messages/android:java",
"//components/browser_ui/widget/android:java",
"//third_party/android_deps:android_support_v7_appcompat_java",
......
......@@ -181,6 +181,7 @@ android_library("java") {
"//chrome/browser/android/lifecycle:java",
"//chrome/browser/flags:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/android/favicon:java",
"//chrome/browser/ui/android/strings:ui_strings_grd",
"//chrome/browser/ui/messages/android:java",
......
......@@ -76,6 +76,7 @@ android_library("java") {
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//chrome/browser/profiles/android:java",
"//chrome/browser/tab:java",
"//chrome/browser/util:java",
"//components/browser_ui/modaldialog/android:java",
"//components/embedder_support/android:content_view_java",
......
......@@ -47,6 +47,7 @@ import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabAssociatedApp;
import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
import org.chromium.chrome.browser.tab.TabCreationState;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.tabmodel.ChromeTabCreator;
......@@ -536,7 +537,7 @@ public class VrShell extends GvrLayout
// Reparent all existing tabs.
for (TabModel model : mActivity.getTabModelSelector().getModels()) {
for (int i = 0; i < model.getCount(); ++i) {
model.getTabAt(i).updateAttachment(window, null);
((TabImpl) model.getTabAt(i)).updateAttachment(window, null);
}
}
}
......
......@@ -6,6 +6,8 @@ package org.chromium.chrome.browser.tab;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import org.chromium.base.ContextUtils;
import org.chromium.content_public.browser.ImeAdapter;
import org.chromium.content_public.browser.ImeEventObserver;
......@@ -37,8 +39,9 @@ public final class TabAssociatedApp extends TabWebContentsUserData implements Im
super(tab);
tab.addObserver(new EmptyTabObserver() {
@Override
public void onInitialized(Tab tab, TabState tabState) {
if (tabState != null) setAppId(tabState.openerAppId);
public void onInitialized(
Tab tab, String appId, @Nullable Boolean hasThemeColor, int themeColor) {
setAppId(appId);
}
@Override
......
......@@ -80,7 +80,8 @@ public class TabBrowserControlsConstraintsHelper implements UserData {
mConstraintsChangedCallback = (constraints) -> updateEnabledState();
mTab.addObserver(new EmptyTabObserver() {
@Override
public void onInitialized(Tab tab, TabState tabState) {
public void onInitialized(
Tab tab, String appId, @Nullable Boolean hasThemeColor, int themeColor) {
updateVisibilityDelegate();
}
......
......@@ -301,7 +301,14 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
return mWindowAndroid;
}
@Override
/**
* Update the attachment state to Window(Activity).
* @param window A new {@link WindowAndroid} to attach the tab to. If {@code null},
* the tab is being detached. See {@link ReparentingTask#detach()} for details.
* @param tabDelegateFactory The new delegate factory this tab should be using. Can be
* {@code null} even when {@code window} is not, meaning we simply want to swap out
* {@link WindowAndroid} for this tab and keep using the current delegate factory.
*/
public void updateAttachment(
@Nullable WindowAndroid window, @Nullable TabDelegateFactory tabDelegateFactory) {
// Non-null delegate factory while being detached is not valid.
......@@ -845,7 +852,12 @@ public class TabImpl implements Tab, TabObscuringHandler.Observer {
if (mTimestampMillis == INVALID_TIMESTAMP) {
mTimestampMillis = System.currentTimeMillis();
}
for (TabObserver observer : mObservers) observer.onInitialized(this, tabState);
String appId = tabState != null ? tabState.openerAppId : null;
Boolean hasThemeColor = tabState != null ? tabState.hasThemeColor() : null;
int themeColor = tabState != null ? tabState.getThemeColor() : 0;
for (TabObserver observer : mObservers) {
observer.onInitialized(this, appId, hasThemeColor, themeColor);
}
TraceEvent.end("Tab.initialize");
}
}
......
......@@ -213,13 +213,14 @@ public class TabThemeColorHelper extends EmptyTabObserver implements UserData {
// TabObserver
@Override
public void onInitialized(Tab tab, TabState tabState) {
if (tabState == null) return;
public void onInitialized(
Tab tab, String appId, @Nullable Boolean hasThemeColor, int themeColor) {
if (hasThemeColor == null) return;
// Update from TabState.
mIsUsingColorFromTabContents = tabState.hasThemeColor();
mIsUsingColorFromTabContents = hasThemeColor;
mIsDefaultColorUsed = !mIsUsingColorFromTabContents;
mColor = mIsDefaultColorUsed ? getDefaultColor() : tabState.getThemeColor();
mColor = mIsDefaultColorUsed ? getDefaultColor() : themeColor;
updateIfNeeded(false);
}
......
......@@ -144,7 +144,7 @@ public class ReparentingTask implements UserData {
// TabModelSelector of this Tab, if present, gets notified to remove the tab from
// the TabModel it belonged to.
mTab.updateAttachment(null, null);
((TabImpl) mTab).updateAttachment(null, null);
}
/**
......@@ -174,7 +174,7 @@ public class ReparentingTask implements UserData {
// Assert that the tab is currently in detached state.
assert mTab.getWebContents() == null
|| mTab.getWebContents().getTopLevelNativeWindow() == null;
mTab.updateAttachment(window, tabDelegateFactory);
((TabImpl) mTab).updateAttachment(window, tabDelegateFactory);
ReparentingTaskJni.get().attachTab(mTab.getWebContents());
}
......
......@@ -29,6 +29,7 @@ import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.share.ShareDelegateImpl;
import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabImpl;
import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.util.ChromeFileProvider;
import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
......@@ -183,7 +184,7 @@ public class ShareIntentTest {
};
});
TestThreadUtils.runOnUiThreadBlocking(
() -> mockActivity.getActivityTab().updateAttachment(window, null));
() -> ((TabImpl) mockActivity.getActivityTab()).updateAttachment(window, null));
TestThreadUtils.runOnUiThreadBlocking(
()
......
......@@ -75,7 +75,7 @@ public class TabBrowserControlsConstraintsHelperTest {
initHelper();
Mockito.verify(mDelegateFactory, Mockito.never())
.createBrowserControlsVisibilityDelegate(mTab);
mRegisteredTabObserver.onInitialized(mTab, null);
mRegisteredTabObserver.onInitialized(mTab, null, null, 0);
Mockito.verify(mDelegateFactory, Mockito.times(1))
.createBrowserControlsVisibilityDelegate(mTab);
verifyUpdateState(BrowserControlsState.BOTH);
......@@ -126,7 +126,7 @@ public class TabBrowserControlsConstraintsHelperTest {
initHelper();
Mockito.verify(mDelegateFactory, Mockito.never())
.createBrowserControlsVisibilityDelegate(mTab);
mRegisteredTabObserver.onInitialized(mTab, null);
mRegisteredTabObserver.onInitialized(mTab, null, null, 0);
Mockito.verify(mDelegateFactory).createBrowserControlsVisibilityDelegate(mTab);
Mockito.verifyNoMoreInteractions(mDelegateFactory);
verifyUpdateState(BrowserControlsState.BOTH);
......
......@@ -38,6 +38,7 @@ if (is_android) {
":ukm_java_test_support",
"//base:base_java_test_support",
"//chrome/android:chrome_java",
"//chrome/browser/tab:java",
"//chrome/test/android:chrome_java_test_support",
"//components/metrics:metrics_java",
"//content/public/test/android:content_java_test_support",
......
......@@ -25,6 +25,7 @@ if (is_android) {
"//base:base_java_test_support",
"//chrome/android:chrome_java",
"//chrome/android:chrome_test_java",
"//chrome/browser/tab:java",
"//chrome/test/android:chrome_java_test_support",
"//components/safe_browsing/android:safe_browsing_java",
"//content/public/test/android:content_java_test_support",
......
......@@ -8,5 +8,26 @@ import("//chrome/android/features/android_library_factory_tmpl.gni")
import("//chrome/browser/buildflags.gni")
android_library("java") {
sources = [ "java/src/org/chromium/chrome/browser/tab/Dummy.java" ]
sources = [
"java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java",
"java/src/org/chromium/chrome/browser/tab/Tab.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributeKeys.java",
"java/src/org/chromium/chrome/browser/tab/TabAttributes.java",
"java/src/org/chromium/chrome/browser/tab/TabCreationState.java",
"java/src/org/chromium/chrome/browser/tab/TabHidingType.java",
"java/src/org/chromium/chrome/browser/tab/TabLifecycle.java",
"java/src/org/chromium/chrome/browser/tab/TabObserver.java",
]
# TabSelectionType, TabLaunchType
srcjar_deps = [ "//chrome/browser/ui:tab_model_enums_java" ]
deps = [
"//base:base_java",
"//chrome/browser/ui/android/native_page:java",
"//components/embedder_support/android:content_view_java",
"//components/find_in_page/android:java",
"//content/public/android:content_java",
"//ui/android:ui_full_java",
]
}
noparent = True
include_rules = [
"-chrome",
"+base/android/java/src/org/chromium/base",
"+chrome/browser/ui/android/native_page",
"+components/find_in_page/android/java",
"+content/public/android/java/src/org/chromium/content_public",
"+ui/android/java/src/org/chromium/ui/base",
]
specific_include_rules = {
'Tab\.java': [
"-components",
"+components/embedder_support/android/java/src/org/chromium/components/embedder_support/view",
"+url/android/java/src/org/chromium/url",
],
}
// 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.
package org.chromium.chrome.browser.tab;
/**
* Dummy class to get the build working for the new target chrome/browser/tab:java.
* TODO(jinsukkim): Remove the class once the real target classes are in place.
*/
public class Dummy {}
......@@ -25,7 +25,7 @@ import org.chromium.ui.base.WindowAndroid;
*/
public class EmptyTabObserver implements TabObserver {
@Override
public void onInitialized(Tab tab, TabState tabState) {}
public void onInitialized(Tab tab, String appId, Boolean hasThemeColor, int themeColor) {}
@Override
public void onShown(Tab tab, @TabSelectionType int type) {}
......@@ -34,19 +34,19 @@ public class EmptyTabObserver implements TabObserver {
public void onHidden(Tab tab, @TabHidingType int reason) {}
@Override
public void onClosingStateChanged(Tab tab, boolean closing) { }
public void onClosingStateChanged(Tab tab, boolean closing) {}
@Override
public void onDestroyed(Tab tab) { }
public void onDestroyed(Tab tab) {}
@Override
public void onContentChanged(Tab tab) { }
public void onContentChanged(Tab tab) {}
@Override
public void onLoadUrl(Tab tab, LoadUrlParams params, int loadType) { }
public void onLoadUrl(Tab tab, LoadUrlParams params, int loadType) {}
@Override
public void onPageLoadStarted(Tab tab, String url) { }
public void onPageLoadStarted(Tab tab, String url) {}
@Override
public void onPageLoadFinished(Tab tab, String url) {}
......@@ -61,40 +61,40 @@ public class EmptyTabObserver implements TabObserver {
public void onRestoreFailed(Tab tab) {}
@Override
public void onFaviconUpdated(Tab tab, Bitmap icon) { }
public void onFaviconUpdated(Tab tab, Bitmap icon) {}
@Override
public void onTitleUpdated(Tab tab) { }
public void onTitleUpdated(Tab tab) {}
@Override
public void onUrlUpdated(Tab tab) { }
public void onUrlUpdated(Tab tab) {}
@Override
public void onSSLStateUpdated(Tab tab) { }
public void onSSLStateUpdated(Tab tab) {}
@Override
public void onCrash(Tab tab) {}
@Override
public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) { }
public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) {}
@Override
public void onContextMenuShown(Tab tab, ContextMenu menu) { }
public void onContextMenuShown(Tab tab, ContextMenu menu) {}
@Override
public void onCloseContents(Tab tab) {}
@Override
public void onLoadStarted(Tab tab, boolean toDifferentDocument) { }
public void onLoadStarted(Tab tab, boolean toDifferentDocument) {}
@Override
public void onLoadStopped(Tab tab, boolean toDifferentDocument) { }
public void onLoadStopped(Tab tab, boolean toDifferentDocument) {}
@Override
public void onLoadProgressChanged(Tab tab, float progress) {}
@Override
public void onUpdateUrl(Tab tab, String url) { }
public void onUpdateUrl(Tab tab, String url) {}
@Override
public void onDidFailLoad(Tab tab, boolean isMainFrame, int errorCode, String failingUrl) {}
......@@ -112,16 +112,16 @@ public class EmptyTabObserver implements TabObserver {
public void didFirstVisuallyNonEmptyPaint(Tab tab) {}
@Override
public void onDidChangeThemeColor(Tab tab, int color) { }
public void onDidChangeThemeColor(Tab tab, int color) {}
@Override
public void onDidAttachInterstitialPage(Tab tab) { }
public void onDidAttachInterstitialPage(Tab tab) {}
@Override
public void onDidDetachInterstitialPage(Tab tab) { }
public void onDidDetachInterstitialPage(Tab tab) {}
@Override
public void onBackgroundColorChanged(Tab tab, int color) { }
public void onBackgroundColorChanged(Tab tab, int color) {}
@Override
public void webContentsCreated(Tab tab, WebContents sourceWebContents,
......
......@@ -64,17 +64,6 @@ public interface Tab extends TabLifecycle {
*/
WindowAndroid getWindowAndroid();
/**
* Update the attachment state to Window(Activity).
* @param window A new {@link WindowAndroid} to attach the tab to. If {@code null},
* the tab is being detached. See {@link ReparentingTask#detach()} for details.
* @param tabDelegateFactory The new delegate factory this tab should be using. Can be
* {@code null} even when {@code window} is not, meaning we simply want to swap out
* {@link WindowAndroid} for this tab and keep using the current delegate factory.
*/
void updateAttachment(
@Nullable WindowAndroid window, @Nullable TabDelegateFactory tabDelegateFactory);
/**
* @return Content view used for rendered web contents. Can be null
* if web contents is null.
......
......@@ -9,7 +9,6 @@ import android.view.ContextMenu;
import androidx.annotation.Nullable;
import org.chromium.chrome.browser.TabLoadStatus;
import org.chromium.components.find_in_page.FindMatchRectsDetails;
import org.chromium.components.find_in_page.FindNotificationDetails;
import org.chromium.content_public.browser.LoadUrlParams;
......@@ -25,9 +24,12 @@ public interface TabObserver {
* Called when a {@link Tab} finished initialization. The {@link TabState} contains,
* if not {@code null}, various states that a Tab should restore itself from.
* @param tab The notifying {@link Tab}.
* @param tabState {@link TabState} to restore tab's state from if not {@code null}.
* @param appId ID of the external app that opened this tab.
* @param hasThemeColor {@code true} if the tab has a theme color set. {@code null}
* if theme color info is not available from TabState.
* @param themeColor Theme color.
*/
void onInitialized(Tab tab, TabState tabState);
void onInitialized(Tab tab, String appId, @Nullable Boolean hasThemeColor, int themeColor);
/**
* Called when a {@link Tab} is shown.
......
......@@ -208,6 +208,7 @@ android_library("chrome_java_test_support") {
"//chrome/android/third_party/compositor_animator:compositor_animator_java",
"//chrome/browser/flags:java",
"//chrome/browser/preferences:java",
"//chrome/browser/tab:java",
"//chrome/browser/ui/android/appmenu:java",
"//chrome/browser/ui/android/appmenu:test_support_java",
"//chrome/browser/ui/android/favicon:java",
......
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