20
20
21
21
import org .mozilla .geckoview .AllowOrDeny ;
22
22
import org .mozilla .geckoview .ContentBlocking ;
23
+ import org .mozilla .geckoview .GeckoResponse ;
23
24
import org .mozilla .geckoview .GeckoResult ;
24
25
import org .mozilla .geckoview .GeckoRuntime ;
25
26
import org .mozilla .geckoview .GeckoSession ;
54
55
public class SessionStack implements ContentBlocking .Delegate , GeckoSession .NavigationDelegate ,
55
56
GeckoSession .ProgressDelegate , GeckoSession .ContentDelegate , GeckoSession .TextInputDelegate ,
56
57
GeckoSession .PromptDelegate , GeckoSession .MediaDelegate , GeckoSession .HistoryDelegate ,
57
- SharedPreferences .OnSharedPreferenceChangeListener {
58
+ GeckoSession . SelectionActionDelegate , SharedPreferences .OnSharedPreferenceChangeListener {
58
59
59
60
private static final String LOGTAG = SystemUtils .createLogtag (SessionStack .class );
60
61
// You can test a local file using: "resource://android/assets/webvr/index.html"
@@ -66,6 +67,7 @@ public class SessionStack implements ContentBlocking.Delegate, GeckoSession.Navi
66
67
private transient LinkedList <SessionChangeListener > mSessionChangeListeners ;
67
68
private transient LinkedList <GeckoSession .TextInputDelegate > mTextInputListeners ;
68
69
private transient LinkedList <VideoAvailabilityListener > mVideoAvailabilityListeners ;
70
+ private transient LinkedList <GeckoSession .SelectionActionDelegate > mSelectionActionListeners ;
69
71
private transient UserAgentOverride mUserAgentOverride ;
70
72
71
73
private transient GeckoSession mCurrentSession ;
@@ -92,6 +94,7 @@ protected SessionStack(Context context, GeckoRuntime runtime, boolean usePrivate
92
94
mSessionChangeListeners = new LinkedList <>();
93
95
mTextInputListeners = new LinkedList <>();
94
96
mVideoAvailabilityListeners = new LinkedList <>();
97
+ mSelectionActionListeners = new LinkedList <>();
95
98
96
99
if (mPrefs != null ) {
97
100
mPrefs .registerOnSharedPreferenceChangeListener (this );
@@ -122,6 +125,7 @@ protected void shutdown() {
122
125
mSessionChangeListeners .clear ();
123
126
mTextInputListeners .clear ();
124
127
mVideoAvailabilityListeners .clear ();
128
+ mSelectionActionListeners .clear ();
125
129
126
130
if (mPrefs != null ) {
127
131
mPrefs .unregisterOnSharedPreferenceChangeListener (this );
@@ -267,6 +271,27 @@ public void removeVideoAvailabilityListener(VideoAvailabilityListener aListener)
267
271
mVideoAvailabilityListeners .remove (aListener );
268
272
}
269
273
274
+ public void addSelectionActionListener (GeckoSession .SelectionActionDelegate aListener ) {
275
+ mSelectionActionListeners .add (aListener );
276
+ }
277
+
278
+ public void removeSelectionActionListener (GeckoSession .ContentDelegate aListener ) {
279
+ mSelectionActionListeners .remove (aListener );
280
+ }
281
+
282
+ private void setUpListeners (GeckoSession aSession ) {
283
+ aSession .setNavigationDelegate (this );
284
+ aSession .setProgressDelegate (this );
285
+ aSession .setContentDelegate (this );
286
+ aSession .getTextInput ().setDelegate (this );
287
+ aSession .setPermissionDelegate (mPermissionDelegate );
288
+ aSession .setPromptDelegate (mPromptDelegate );
289
+ aSession .setContentBlockingDelegate (this );
290
+ aSession .setMediaDelegate (this );
291
+ aSession .setHistoryDelegate (this );
292
+ aSession .setSelectionActionDelegate (this );
293
+ }
294
+
270
295
public void restore (SessionStack store , int currentSessionId ) {
271
296
mSessions .clear ();
272
297
@@ -301,16 +326,8 @@ public void restore(SessionStack store, int currentSessionId) {
301
326
}
302
327
303
328
int newSessionId = state .mSession .hashCode ();
329
+ setUpListeners (state .mSession );
304
330
305
- state .mSession .setNavigationDelegate (this );
306
- state .mSession .setProgressDelegate (this );
307
- state .mSession .setContentDelegate (this );
308
- state .mSession .getTextInput ().setDelegate (this );
309
- state .mSession .setPermissionDelegate (mPermissionDelegate );
310
- state .mSession .setPromptDelegate (mPromptDelegate );
311
- state .mSession .setContentBlockingDelegate (this );
312
- state .mSession .setMediaDelegate (this );
313
- state .mSession .setHistoryDelegate (this );
314
331
for (SessionChangeListener listener : mSessionChangeListeners ) {
315
332
listener .onNewSession (state .mSession , newSessionId );
316
333
}
@@ -368,15 +385,7 @@ private int createSession(@NonNull SessionSettings aSettings) {
368
385
state .mSession .getSettings ().setSuspendMediaWhenInactive (aSettings .isSuspendMediaWhenInactiveEnabled ());
369
386
state .mSession .getSettings ().setUserAgentMode (aSettings .getUserAgentMode ());
370
387
state .mSession .getSettings ().setUserAgentOverride (aSettings .getUserAgentOverride ());
371
- state .mSession .setNavigationDelegate (this );
372
- state .mSession .setProgressDelegate (this );
373
- state .mSession .setContentDelegate (this );
374
- state .mSession .getTextInput ().setDelegate (this );
375
- state .mSession .setPermissionDelegate (mPermissionDelegate );
376
- state .mSession .setPromptDelegate (mPromptDelegate );
377
- state .mSession .setContentBlockingDelegate (this );
378
- state .mSession .setMediaDelegate (this );
379
- state .mSession .setHistoryDelegate (this );
388
+ setUpListeners (state .mSession );
380
389
for (SessionChangeListener listener : mSessionChangeListeners ) {
381
390
listener .onNewSession (state .mSession , result );
382
391
}
@@ -417,6 +426,7 @@ private void removeSession(int aSessionId) {
417
426
session .setContentBlockingDelegate (null );
418
427
session .setMediaDelegate (null );
419
428
session .setHistoryDelegate (null );
429
+ session .setSelectionActionDelegate (this );
420
430
mSessions .remove (aSessionId );
421
431
for (SessionChangeListener listener : mSessionChangeListeners ) {
422
432
listener .onRemoveSession (session , aSessionId );
@@ -1419,4 +1429,24 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
1419
1429
}
1420
1430
}
1421
1431
}
1432
+
1433
+ // GeckoSession.SelectionActionDelegate
1434
+
1435
+ @ Override
1436
+ public void onShowActionRequest (@ NonNull GeckoSession aSession , @ NonNull Selection selection , @ NonNull String [] strings , @ NonNull GeckoResponse <String > geckoResponse ) {
1437
+ if (aSession == mCurrentSession ) {
1438
+ for (GeckoSession .SelectionActionDelegate listener : mSelectionActionListeners ) {
1439
+ listener .onShowActionRequest (aSession , selection , strings , geckoResponse );
1440
+ }
1441
+ }
1442
+ }
1443
+
1444
+ @ Override
1445
+ public void onHideAction (@ NonNull GeckoSession aSession , int aHideReason ) {
1446
+ if (aSession == mCurrentSession ) {
1447
+ for (GeckoSession .SelectionActionDelegate listener : mSelectionActionListeners ) {
1448
+ listener .onHideAction (aSession , aHideReason );
1449
+ }
1450
+ }
1451
+ }
1422
1452
}
0 commit comments