summaryrefslogtreecommitdiff
path: root/chromium/weblayer/browser/java/org/chromium/weblayer_private/FaviconCallbackProxy.java
blob: 219560ada963e59620fb87f5394563d5d92c19df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 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.weblayer_private;

import android.graphics.Bitmap;
import android.os.RemoteException;
import android.util.AndroidRuntimeException;

import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.weblayer_private.interfaces.IFaviconFetcher;
import org.chromium.weblayer_private.interfaces.IFaviconFetcherClient;

/**
 * Owns the c++ ErrorPageCallbackProxy class, which is responsible for forwarding all
 * ErrorPageDelegate calls to this class, which in turn forwards to the
 * ErrorPageCallbackClient.
 */
@JNINamespace("weblayer")
public final class FaviconCallbackProxy extends IFaviconFetcher.Stub {
    private TabImpl mTab;
    private long mNativeFaviconCallbackProxy;
    private IFaviconFetcherClient mClient;

    FaviconCallbackProxy(TabImpl tab, long nativeTab, IFaviconFetcherClient client) {
        assert client != null;
        mTab = tab;
        mClient = client;
        mNativeFaviconCallbackProxy =
                FaviconCallbackProxyJni.get().createFaviconCallbackProxy(this, nativeTab);
    }

    @Override
    public void destroy() {
        // As Tab implicitly destroys this, and the embedder is allowed to destroy this, allow
        // destroy() to be called multiple times.
        if (mNativeFaviconCallbackProxy == 0) {
            return;
        }
        mTab.removeFaviconCallbackProxy(this);
        try {
            mClient.onDestroyed();
        } catch (RemoteException e) {
            throw new AndroidRuntimeException(e);
        }
        FaviconCallbackProxyJni.get().deleteFaviconCallbackProxy(mNativeFaviconCallbackProxy);
        mNativeFaviconCallbackProxy = 0;
        mClient = null;
    }

    @CalledByNative
    private void onFaviconChanged(Bitmap bitmap) throws RemoteException {
        mTab.onFaviconChanged(bitmap);
        mClient.onFaviconChanged(bitmap);
    }

    @NativeMethods
    interface Natives {
        long createFaviconCallbackProxy(FaviconCallbackProxy proxy, long tab);
        void deleteFaviconCallbackProxy(long proxy);
    }
}