summaryrefslogtreecommitdiffstats
path: root/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TrackingPermissionService.java
blob: 141849589e02f531e6e9cbca063e124587c1b22b (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package org.mozilla.geckoview.test;

import android.content.Context;
import android.content.Intent;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.io.File;
import java.util.List;
import org.mozilla.gecko.util.GeckoBundle;
import org.mozilla.geckoview.GeckoResult;
import org.mozilla.geckoview.GeckoSession;
import org.mozilla.geckoview.GeckoSession.PermissionDelegate;
import org.mozilla.geckoview.GeckoSession.PermissionDelegate.ContentPermission;
import org.mozilla.geckoview.GeckoSessionSettings;

public class TrackingPermissionService extends TestRuntimeService {
  public static final int MESSAGE_SET_TRACKING_PERMISSION = FIRST_SAFE_MESSAGE + 1;
  public static final int MESSAGE_SET_PRIVATE_BROWSING_TRACKING_PERMISSION = FIRST_SAFE_MESSAGE + 2;
  public static final int MESSAGE_GET_TRACKING_PERMISSION = FIRST_SAFE_MESSAGE + 3;

  private ContentPermission mContentPermission;

  @Override
  protected GeckoSession createSession(final Intent intent) {
    return new GeckoSession(
        new GeckoSessionSettings.Builder()
            .usePrivateMode(mTestData.getBoolean("privateMode"))
            .build());
  }

  @Override
  protected void onSessionReady(final GeckoSession session) {
    session.setNavigationDelegate(
        new GeckoSession.NavigationDelegate() {
          @Override
          public void onLocationChange(
              final @NonNull GeckoSession session,
              final @Nullable String url,
              final @NonNull List<ContentPermission> perms) {
            for (ContentPermission perm : perms) {
              if (perm.permission == PermissionDelegate.PERMISSION_TRACKING) {
                mContentPermission = perm;
              }
            }
          }
        });
  }

  @Override
  protected GeckoResult<GeckoBundle> handleMessage(final int messageId, final GeckoBundle data) {
    if (mContentPermission == null) {
      throw new IllegalStateException("Content permission not received yet!");
    }

    switch (messageId) {
      case MESSAGE_SET_TRACKING_PERMISSION:
        {
          final int permission = data.getInt("trackingPermission");
          mRuntime.getStorageController().setPermission(mContentPermission, permission);
          break;
        }
      case MESSAGE_SET_PRIVATE_BROWSING_TRACKING_PERMISSION:
        {
          final int permission = data.getInt("trackingPermission");
          mRuntime
              .getStorageController()
              .setPrivateBrowsingPermanentPermission(mContentPermission, permission);
          break;
        }
      case MESSAGE_GET_TRACKING_PERMISSION:
        {
          final GeckoBundle result = new GeckoBundle(1);
          result.putInt("trackingPermission", mContentPermission.value);
          return GeckoResult.fromValue(result);
        }
    }

    return null;
  }

  public static class TrackingPermissionInstance
      extends RuntimeInstance<TrackingPermissionService> {
    public static GeckoBundle testData(boolean privateMode) {
      GeckoBundle testData = new GeckoBundle(1);
      testData.putBoolean("privateMode", privateMode);
      return testData;
    }

    private TrackingPermissionInstance(
        final Context context, final File profileFolder, final boolean privateMode) {
      super(context, TrackingPermissionService.class, profileFolder, testData(privateMode));
    }

    public static TrackingPermissionInstance start(
        final Context context, final File profileFolder, final boolean privateMode) {
      TrackingPermissionInstance instance =
          new TrackingPermissionInstance(context, profileFolder, privateMode);
      instance.sendIntent();
      return instance;
    }

    public GeckoResult<Integer> getTrackingPermission() {
      return query(MESSAGE_GET_TRACKING_PERMISSION)
          .map(bundle -> bundle.getInt("trackingPermission"));
    }

    public void setTrackingPermission(final int permission) {
      final GeckoBundle bundle = new GeckoBundle(1);
      bundle.putInt("trackingPermission", permission);
      sendMessage(MESSAGE_SET_TRACKING_PERMISSION, bundle);
    }

    public void setPrivateBrowsingPermanentTrackingPermission(final int permission) {
      final GeckoBundle bundle = new GeckoBundle(1);
      bundle.putInt("trackingPermission", permission);
      sendMessage(MESSAGE_SET_PRIVATE_BROWSING_TRACKING_PERMISSION, bundle);
    }
  }
}