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

Android: Shows favicon on Ephemeral Tab

Replaces a default chrome icon with favicon for the pages being opened
on Ephemeral Tab.

Didn't chose to use FaviconHelper.java to avoid unnecessary conversion
from SkBitmap -> JavaBitmap -> SkBitmap.

Bug: 929727
Change-Id: Ide1698470b052b2914dd490a0d40ce175989c651
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1601015Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Reviewed-by: default avatarDonn Denman <donnd@chromium.org>
Commit-Queue: Jinsuk Kim <jinsukkim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#658348}
parent 4a5eb6e0
...@@ -11,6 +11,7 @@ import android.view.MotionEvent; ...@@ -11,6 +11,7 @@ import android.view.MotionEvent;
import org.chromium.base.SysUtils; import org.chromium.base.SysUtils;
import org.chromium.base.TimeUtils; import org.chromium.base.TimeUtils;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.compositor.LayerTitleCache; import org.chromium.chrome.browser.compositor.LayerTitleCache;
import org.chromium.chrome.browser.compositor.bottombar.OverlayContentDelegate; import org.chromium.chrome.browser.compositor.bottombar.OverlayContentDelegate;
...@@ -83,7 +84,9 @@ public class EphemeralTabPanel extends OverlayPanel { ...@@ -83,7 +84,9 @@ public class EphemeralTabPanel extends OverlayPanel {
Context context, LayoutUpdateHost updateHost, OverlayPanelManager panelManager) { Context context, LayoutUpdateHost updateHost, OverlayPanelManager panelManager) {
super(context, updateHost, panelManager); super(context, updateHost, panelManager);
mSceneLayer = mSceneLayer =
new EphemeralTabSceneLayer(mContext.getResources().getDisplayMetrics().density); new EphemeralTabSceneLayer(mContext.getResources().getDisplayMetrics().density,
mContext.getResources().getDimensionPixelSize(
R.dimen.compositor_tab_title_favicon_size));
mEventFilter = new OverlayPanelEventFilter(mContext, this) { mEventFilter = new OverlayPanelEventFilter(mContext, this) {
@Override @Override
public boolean onInterceptTouchEventInternal(MotionEvent e, boolean isKeyboardShowing) { public boolean onInterceptTouchEventInternal(MotionEvent e, boolean isKeyboardShowing) {
...@@ -232,6 +235,13 @@ public class EphemeralTabPanel extends OverlayPanel { ...@@ -232,6 +235,13 @@ public class EphemeralTabPanel extends OverlayPanel {
return !mActivity.isCustomTab(); return !mActivity.isCustomTab();
} }
/**
* @return URL of the page to open in the panel.
*/
public String getUrl() {
return mUrl;
}
// Panel base methods // Panel base methods
@Override @Override
......
...@@ -61,7 +61,8 @@ public class ContextualSearchSceneLayer extends SceneOverlayLayer { ...@@ -61,7 +61,8 @@ public class ContextualSearchSceneLayer extends SceneOverlayLayer {
int searchContextViewId = searchBarControl.getSearchContextViewId(); int searchContextViewId = searchBarControl.getSearchContextViewId();
int searchTermViewId = searchBarControl.getSearchTermViewId(); int searchTermViewId = searchBarControl.getSearchTermViewId();
int searchCaptionViewId = searchBarControl.getCaptionViewId(); int searchCaptionViewId = searchBarControl.getCaptionViewId();
int openNewTabIconId = panel.canPromoteToNewTab() ? R.drawable.open_in_new_tab : -1; int openNewTabIconId =
panel.canPromoteToNewTab() ? R.drawable.open_in_new_tab : INVALID_RESOURCE_ID;
int searchPromoViewId = promoControl.getViewId(); int searchPromoViewId = promoControl.getViewId();
boolean searchPromoVisible = promoControl.isVisible(); boolean searchPromoVisible = promoControl.isVisible();
......
...@@ -4,11 +4,14 @@ ...@@ -4,11 +4,14 @@
package org.chromium.chrome.browser.compositor.scene_layer; package org.chromium.chrome.browser.compositor.scene_layer;
import android.text.TextUtils;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabBarControl; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabBarControl;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabPanel; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabPanel;
import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabTitleControl; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabTitleControl;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.resources.ResourceManager; import org.chromium.ui.resources.ResourceManager;
...@@ -26,11 +29,17 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer { ...@@ -26,11 +29,17 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer {
/** The conversion multiple from dp to px. */ /** The conversion multiple from dp to px. */
private final float mDpToPx; private final float mDpToPx;
private final int mFaviconSizePx;
private String mCachedUrl;
/** /**
* @param dpToPx The conversion multiple from dp to px for the device. * @param dpToPx The conversion multiple from dp to px for the device.
* @param faviconSizeDp Preferred size of the favicon to fetch.
*/ */
public EphemeralTabSceneLayer(float dpToPx) { public EphemeralTabSceneLayer(float dpToPx, int faviconSizeDp) {
mDpToPx = dpToPx; mDpToPx = dpToPx;
mFaviconSizePx = (int) (faviconSizeDp * dpToPx);
} }
/** /**
...@@ -46,12 +55,10 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer { ...@@ -46,12 +55,10 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer {
if (resourceManager == null || !panel.isShowing()) return; if (resourceManager == null || !panel.isShowing()) return;
if (!mIsInitialized) { if (!mIsInitialized) {
nativeCreateEphemeralTabLayer(mNativePtr, resourceManager); nativeCreateEphemeralTabLayer(mNativePtr, resourceManager);
// TODO(jinsukkim): Find the right icon/background resource for the tab bar.
nativeSetResourceIds(mNativePtr, title.getViewId(), nativeSetResourceIds(mNativePtr, title.getViewId(),
R.drawable.contextual_search_bar_background, R.drawable.modern_toolbar_shadow, R.drawable.contextual_search_bar_background, R.drawable.modern_toolbar_shadow,
R.drawable.infobar_chrome, R.drawable.drag_handlebar, R.drawable.infobar_chrome, R.drawable.drag_handlebar,
panel.canPromoteToNewTab() ? R.drawable.open_in_new_tab : -1, panel.canPromoteToNewTab() ? R.drawable.open_in_new_tab : INVALID_RESOURCE_ID,
R.drawable.btn_close); R.drawable.btn_close);
mIsInitialized = true; mIsInitialized = true;
} }
...@@ -74,6 +81,12 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer { ...@@ -74,6 +81,12 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer {
panel.getBarShadowVisible(), panel.getBarShadowOpacity(), panel.getIconColor(), panel.getBarShadowVisible(), panel.getBarShadowOpacity(), panel.getIconColor(),
panel.getDragHandlebarColor(), isProgressBarVisible, progressBarHeight * mDpToPx, panel.getDragHandlebarColor(), isProgressBarVisible, progressBarHeight * mDpToPx,
progressBarOpacity, progressBarCompletion); progressBarOpacity, progressBarCompletion);
String url = panel.getUrl();
if (!TextUtils.equals(mCachedUrl, url)) {
nativeGetFavicon(mNativePtr, Profile.getLastUsedProfile(), url, mFaviconSizePx);
mCachedUrl = url;
}
} }
@Override @Override
...@@ -87,6 +100,7 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer { ...@@ -87,6 +100,7 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer {
public void hideTree() { public void hideTree() {
if (!mIsInitialized) return; if (!mIsInitialized) return;
nativeHideTree(mNativePtr); nativeHideTree(mNativePtr);
mCachedUrl = null;
} }
@Override @Override
...@@ -117,6 +131,8 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer { ...@@ -117,6 +131,8 @@ public class EphemeralTabSceneLayer extends SceneOverlayLayer {
int barTextResourceId, int barBackgroundResourceId, int barShadowResourceId, int barTextResourceId, int barBackgroundResourceId, int barShadowResourceId,
int panelIconResourceId, int dragHandlebarResourceId, int openTabIconResourceId, int panelIconResourceId, int dragHandlebarResourceId, int openTabIconResourceId,
int closeIconResourceId); int closeIconResourceId);
private native void nativeGetFavicon(
long nativeEphemeralTabSceneLayer, Profile profile, String url, int size);
private native void nativeUpdate(long nativeEphemeralTabSceneLayer, int titleViewId, private native void nativeUpdate(long nativeEphemeralTabSceneLayer, int titleViewId,
float textLayerMinHeight, int progressBarBackgroundResourceId, float textLayerMinHeight, int progressBarBackgroundResourceId,
int progressBarResourceId, float dpToPx, float basePageBrightness, int progressBarResourceId, float dpToPx, float basePageBrightness,
......
...@@ -8,10 +8,12 @@ package org.chromium.chrome.browser.compositor.scene_layer; ...@@ -8,10 +8,12 @@ package org.chromium.chrome.browser.compositor.scene_layer;
* An extension of SceneLayer for SceneOverlay. * An extension of SceneLayer for SceneOverlay.
*/ */
public abstract class SceneOverlayLayer extends SceneLayer { public abstract class SceneOverlayLayer extends SceneLayer {
protected static final int INVALID_RESOURCE_ID = -1;
/** /**
* Sets a content tree inside this scene overlay tree. * Sets a content tree inside this scene overlay tree.
* TODO(jaekyun): We need to rename this method later because the meaning of "content" isn't * TODO(jaekyun): We need to rename this method later because the meaning of "content" isn't
* clear. * clear.
*/ */
public abstract void setContentTree(SceneLayer contentTree); public abstract void setContentTree(SceneLayer contentTree);
} }
\ No newline at end of file
...@@ -4,12 +4,50 @@ ...@@ -4,12 +4,50 @@
#include "chrome/browser/android/compositor/layer/ephemeral_tab_layer.h" #include "chrome/browser/android/compositor/layer/ephemeral_tab_layer.h"
#include "base/task/cancelable_task_tracker.h"
#include "cc/layers/layer.h" #include "cc/layers/layer.h"
#include "cc/layers/nine_patch_layer.h" #include "cc/layers/ui_resource_layer.h"
#include "cc/resources/scoped_ui_resource.h" #include "chrome/browser/favicon/favicon_service_factory.h"
#include "content/public/browser/android/compositor.h" #include "chrome/browser/profiles/profile.h"
#include "ui/android/resources/nine_patch_resource.h" #include "components/favicon/core/favicon_service.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/android/resources/resource_manager.h" #include "ui/android/resources/resource_manager.h"
#include "ui/base/l10n/l10n_util_android.h"
#include "ui/gfx/codec/png_codec.h"
#include "url/gurl.h"
namespace {
void OnLocalFaviconAvailable(
scoped_refptr<cc::UIResourceLayer> layer,
scoped_refptr<cc::UIResourceLayer> icon_layer,
const float dp_to_px,
const float panel_width,
const float bar_height,
const float padding,
const favicon_base::FaviconRawBitmapResult& result) {
if (!result.is_valid())
return;
SkBitmap favicon_bitmap;
gfx::PNGCodec::Decode(result.bitmap_data->front(), result.bitmap_data->size(),
&favicon_bitmap);
if (favicon_bitmap.isNull())
return;
const float icon_width =
android::OverlayPanelLayer::kDefaultIconWidthDp * dp_to_px;
favicon_bitmap.setImmutable();
layer->SetBitmap(favicon_bitmap);
layer->SetBounds(gfx::Size(icon_width, icon_width));
bool is_rtl = l10n_util::IsLayoutRtl();
float icon_x = is_rtl ? panel_width - icon_width - padding : padding;
float icon_y = (bar_height - layer->bounds().height()) / 2;
icon_layer->SetIsDrawable(false);
layer->SetIsDrawable(true);
layer->SetPosition(gfx::PointF(icon_x, icon_y));
}
} // namespace
namespace android { namespace android {
// static // static
...@@ -63,6 +101,10 @@ void EphemeralTabLayer::SetProperties( ...@@ -63,6 +101,10 @@ void EphemeralTabLayer::SetProperties(
progress_bar_background_resource_id, progress_bar_resource_id, progress_bar_background_resource_id, progress_bar_resource_id,
progress_bar_visible, bar_bottom, progress_bar_height, progress_bar_visible, bar_bottom, progress_bar_height,
progress_bar_opacity, progress_bar_completion, panel_width); progress_bar_opacity, progress_bar_completion, panel_width);
dp_to_px_ = dp_to_px;
panel_width_ = panel_width;
bar_height_ = bar_height;
bar_margin_side_ = bar_margin_side;
} }
void EphemeralTabLayer::SetupTextLayer(float bar_top, void EphemeralTabLayer::SetupTextLayer(float bar_top,
...@@ -113,17 +155,48 @@ void EphemeralTabLayer::SetupTextLayer(float bar_top, ...@@ -113,17 +155,48 @@ void EphemeralTabLayer::SetupTextLayer(float bar_top,
title_->SetPosition(gfx::PointF(0.f, title_top)); title_->SetPosition(gfx::PointF(0.f, title_top));
} }
void EphemeralTabLayer::GetLocalFaviconImageForURL(Profile* profile,
const std::string& url,
int size) {
panel_icon_->SetIsDrawable(true);
favicon_layer_->SetIsDrawable(false);
favicon::FaviconService* favicon_service =
FaviconServiceFactory::GetForProfile(profile,
ServiceAccessType::EXPLICIT_ACCESS);
DCHECK(favicon_service);
if (!favicon_service)
return;
favicon_base::FaviconRawBitmapCallback callback_runner = base::BindRepeating(
&OnLocalFaviconAvailable, favicon_layer_, panel_icon_, dp_to_px_,
panel_width_, bar_height_, bar_margin_side_);
// Set |fallback_to_host|=true so the favicon database will fall back to
// matching only the hostname to have the best chance of finding a favicon.
const bool fallback_to_host = true;
favicon_service->GetRawFaviconForPageURL(
GURL(url),
{favicon_base::IconType::kFavicon, favicon_base::IconType::kTouchIcon,
favicon_base::IconType::kTouchPrecomposedIcon,
favicon_base::IconType::kWebManifestIcon},
size, fallback_to_host, callback_runner, cancelable_task_tracker_.get());
}
EphemeralTabLayer::EphemeralTabLayer(ui::ResourceManager* resource_manager) EphemeralTabLayer::EphemeralTabLayer(ui::ResourceManager* resource_manager)
: OverlayPanelLayer(resource_manager), : OverlayPanelLayer(resource_manager),
title_(cc::UIResourceLayer::Create()), title_(cc::UIResourceLayer::Create()),
favicon_layer_(cc::UIResourceLayer::Create()),
text_layer_(cc::UIResourceLayer::Create()) { text_layer_(cc::UIResourceLayer::Create()) {
// Content layer // Content layer
text_layer_->SetIsDrawable(true); text_layer_->SetIsDrawable(true);
title_->SetIsDrawable(true); title_->SetIsDrawable(true);
AddBarTextLayer(text_layer_); AddBarTextLayer(text_layer_);
text_layer_->AddChild(title_); text_layer_->AddChild(title_);
favicon_layer_->SetIsDrawable(true);
layer_->AddChild(favicon_layer_);
cancelable_task_tracker_.reset(new base::CancelableTaskTracker());
} }
EphemeralTabLayer::~EphemeralTabLayer() {} EphemeralTabLayer::~EphemeralTabLayer() {}
......
...@@ -5,13 +5,17 @@ ...@@ -5,13 +5,17 @@
#ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_EPHEMERAL_TAB_LAYER_H_ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_EPHEMERAL_TAB_LAYER_H_
#define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_EPHEMERAL_TAB_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_LAYER_EPHEMERAL_TAB_LAYER_H_
#include <memory>
#include "chrome/browser/android/compositor/layer/overlay_panel_layer.h" #include "chrome/browser/android/compositor/layer/overlay_panel_layer.h"
class Profile;
namespace base {
class CancelableTaskTracker;
}
namespace cc { namespace cc {
class Layer; class Layer;
} // namespace cc }
namespace ui { namespace ui {
class ResourceManager; class ResourceManager;
...@@ -51,13 +55,23 @@ class EphemeralTabLayer : public OverlayPanelLayer { ...@@ -51,13 +55,23 @@ class EphemeralTabLayer : public OverlayPanelLayer {
float text_layer_min_height, float text_layer_min_height,
int context_resource_id); int context_resource_id);
void GetLocalFaviconImageForURL(Profile* profile,
const std::string& url,
int size);
protected: protected:
explicit EphemeralTabLayer(ui::ResourceManager* resource_manager); explicit EphemeralTabLayer(ui::ResourceManager* resource_manager);
~EphemeralTabLayer() override; ~EphemeralTabLayer() override;
private: private:
float dp_to_px_;
float panel_width_;
float bar_height_;
float bar_margin_side_;
scoped_refptr<cc::UIResourceLayer> title_; scoped_refptr<cc::UIResourceLayer> title_;
scoped_refptr<cc::UIResourceLayer> favicon_layer_;
scoped_refptr<cc::UIResourceLayer> text_layer_; scoped_refptr<cc::UIResourceLayer> text_layer_;
std::unique_ptr<base::CancelableTaskTracker> cancelable_task_tracker_;
}; };
} // namespace android } // namespace android
......
...@@ -16,16 +16,14 @@ ...@@ -16,16 +16,14 @@
#include "ui/base/l10n/l10n_util_android.h" #include "ui/base/l10n/l10n_util_android.h"
#include "ui/gfx/color_utils.h" #include "ui/gfx/color_utils.h"
namespace {
// This is the default width for any icon displayed on an OverlayPanel.
const float kDefaultIconWidthDp = 36.0f;
} // namespace
namespace android { namespace android {
const float OverlayPanelLayer::kDefaultIconWidthDp = 36.0f;
const int OverlayPanelLayer::kInvalidResourceID = -1;
scoped_refptr<cc::Layer> OverlayPanelLayer::GetIconLayer() { scoped_refptr<cc::Layer> OverlayPanelLayer::GetIconLayer() {
if (panel_icon_resource_id_ == -1)
return nullptr;
ui::Resource* panel_icon_resource = resource_manager_->GetResource( ui::Resource* panel_icon_resource = resource_manager_->GetResource(
ui::ANDROID_RESOURCE_TYPE_STATIC, panel_icon_resource_id_); ui::ANDROID_RESOURCE_TYPE_STATIC, panel_icon_resource_id_);
DCHECK(panel_icon_resource); DCHECK(panel_icon_resource);
...@@ -209,7 +207,7 @@ void OverlayPanelLayer::SetProperties( ...@@ -209,7 +207,7 @@ void OverlayPanelLayer::SetProperties(
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Open Tab icon // Open Tab icon
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
if (open_tab_icon_resource_id_ != -1) { if (open_tab_icon_resource_id_ != kInvalidResourceID) {
ui::Resource* open_tab_icon_resource = ui::Resource* open_tab_icon_resource =
resource_manager_->GetStaticResourceWithTint(open_tab_icon_resource_id_, resource_manager_->GetStaticResourceWithTint(open_tab_icon_resource_id_,
icon_tint); icon_tint);
......
...@@ -24,6 +24,12 @@ namespace android { ...@@ -24,6 +24,12 @@ namespace android {
class OverlayPanelLayer : public Layer { class OverlayPanelLayer : public Layer {
public: public:
// Default width for any icon displayed on an OverlayPanel.
static const float kDefaultIconWidthDp;
// ID for Invalid resource.
static const int kInvalidResourceID;
void SetResourceIds(int bar_text_resource_id, void SetResourceIds(int bar_text_resource_id,
int panel_shadow_resource_id, int panel_shadow_resource_id,
int bar_shadow_resource_id, int bar_shadow_resource_id,
......
...@@ -3,17 +3,16 @@ ...@@ -3,17 +3,16 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.h" #include "chrome/browser/android/compositor/scene_layer/ephemeral_tab_scene_layer.h"
#include "base/android/jni_android.h" #include "base/android/jni_string.h"
#include "base/android/jni_array.h"
#include "cc/layers/solid_color_layer.h" #include "cc/layers/solid_color_layer.h"
#include "chrome/browser/android/compositor/layer/ephemeral_tab_layer.h" #include "chrome/browser/android/compositor/layer/ephemeral_tab_layer.h"
#include "content/public/browser/android/compositor.h" #include "chrome/browser/profiles/profile_android.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "jni/EphemeralTabSceneLayer_jni.h" #include "jni/EphemeralTabSceneLayer_jni.h"
#include "ui/android/resources/resource_manager_impl.h" #include "ui/android/resources/resource_manager_impl.h"
#include "ui/android/view_android.h" #include "ui/android/view_android.h"
#include "ui/gfx/android/java_bitmap.h"
using base::android::ConvertJavaStringToUTF8;
using base::android::JavaParamRef; using base::android::JavaParamRef;
using base::android::JavaRef; using base::android::JavaRef;
...@@ -60,6 +59,19 @@ void EphemeralTabSceneLayer::SetResourceIds(JNIEnv* env, ...@@ -60,6 +59,19 @@ void EphemeralTabSceneLayer::SetResourceIds(JNIEnv* env,
open_tab_icon_resource_id, close_icon_resource_id); open_tab_icon_resource_id, close_icon_resource_id);
} }
void EphemeralTabSceneLayer::GetFavicon(JNIEnv* env,
const JavaParamRef<jobject>& object,
const JavaParamRef<jobject>& jprofile,
const JavaParamRef<jstring>& jurl,
jint size) {
Profile* profile = ProfileAndroid::FromProfileAndroid(jprofile);
DCHECK(profile);
if (!profile)
return;
ephemeral_tab_layer_->GetLocalFaviconImageForURL(
profile, ConvertJavaStringToUTF8(env, jurl), size);
}
void EphemeralTabSceneLayer::Update(JNIEnv* env, void EphemeralTabSceneLayer::Update(JNIEnv* env,
const JavaParamRef<jobject>& object, const JavaParamRef<jobject>& object,
jint title_view_resource_id, jint title_view_resource_id,
......
...@@ -5,15 +5,10 @@ ...@@ -5,15 +5,10 @@
#ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_EPHEMERAL_TAB_SCENE_LAYER_H_ #ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_EPHEMERAL_TAB_SCENE_LAYER_H_
#define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_EPHEMERAL_TAB_SCENE_LAYER_H_ #define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_EPHEMERAL_TAB_SCENE_LAYER_H_
#include <memory>
#include <vector>
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_weak_ref.h" #include "base/android/jni_weak_ref.h"
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "chrome/browser/android/compositor/scene_layer/scene_layer.h" #include "chrome/browser/android/compositor/scene_layer/scene_layer.h"
#include "ui/android/resources/resource_manager_impl.h"
namespace cc { namespace cc {
class Layer; class Layer;
...@@ -45,6 +40,12 @@ class EphemeralTabSceneLayer : public SceneLayer { ...@@ -45,6 +40,12 @@ class EphemeralTabSceneLayer : public SceneLayer {
jint open_tab_icon_resource_id, jint open_tab_icon_resource_id,
jint close_icon_resource_id); jint close_icon_resource_id);
void GetFavicon(JNIEnv* env,
const base::android::JavaParamRef<jobject>& object,
const base::android::JavaParamRef<jobject>& jprofile,
const base::android::JavaParamRef<jstring>& jurl,
jint size);
void Update(JNIEnv* env, void Update(JNIEnv* env,
const base::android::JavaParamRef<jobject>& object, const base::android::JavaParamRef<jobject>& object,
jint title_view_resource_id, jint title_view_resource_id,
......
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