4
4
5
5
#include " GeckoViewHistory.h"
6
6
7
+ #ifdef MOZ_WIDGET_ANDROID
8
+ # include " JavaBuiltins.h"
9
+ #endif
7
10
#include " jsapi.h"
8
11
#include " js/Array.h" // JS::GetArrayLength, JS::IsArrayObject
9
12
#include " js/PropertyAndElement.h" // JS_GetElement
@@ -29,8 +32,8 @@ using namespace mozilla::dom;
29
32
using namespace mozilla ::ipc;
30
33
using namespace mozilla ::widget;
31
34
32
- static const nsLiteralString kOnVisitedMessage = u" GeckoView:OnVisited" _ns ;
33
- static const nsLiteralString kGetVisitedMessage = u" GeckoView:GetVisited" _ns ;
35
+ static const char16_t kOnVisitedMessage [] = u" GeckoView:OnVisited" ;
36
+ static const char16_t kGetVisitedMessage [] = u" GeckoView:GetVisited" ;
34
37
35
38
// Keep in sync with `GeckoSession.HistoryDelegate.VisitFlags`.
36
39
enum class GeckoViewVisitFlags : int32_t {
@@ -238,7 +241,6 @@ NS_IMETHODIMP
238
241
GeckoViewHistory::VisitURI(nsIWidget* aWidget, nsIURI* aURI,
239
242
nsIURI* aLastVisitedURI, uint32_t aFlags,
240
243
uint64_t aBrowserId) {
241
- AssertIsOnMainThread ();
242
244
if (!aURI) {
243
245
return NS_OK;
244
246
}
@@ -272,33 +274,28 @@ GeckoViewHistory::VisitURI(nsIWidget* aWidget, nsIURI* aURI,
272
274
}
273
275
274
276
// If nobody is listening for this, we can stop now.
275
- if (!dispatcher->HasEmbedderListener (kOnVisitedMessage )) {
277
+ if (!dispatcher->HasListener (kOnVisitedMessage )) {
276
278
return NS_OK;
277
279
}
278
280
279
- dom::AutoJSAPI jsapi;
280
- NS_ENSURE_TRUE (jsapi.Init(xpc::PrivilegedJunkScope()), NS_OK);
281
-
282
- JS::Rooted<JSObject*> bundle (jsapi.cx (), JS_NewPlainObject (jsapi.cx ()));
283
- NS_ENSURE_TRUE (bundle, NS_OK);
284
-
285
- JS::Rooted<JS::Value> value (jsapi.cx ());
281
+ #ifdef MOZ_WIDGET_ANDROID
282
+ AutoTArray<jni::String::LocalRef, 3 > keys;
283
+ AutoTArray<jni::Object::LocalRef, 3 > values;
286
284
287
285
nsAutoCString uriSpec;
288
286
if (NS_WARN_IF(NS_FAILED(aURI->GetSpec (uriSpec)))) {
289
287
return NS_OK;
290
288
}
291
- NS_ENSURE_TRUE (ToJSValue(jsapi.cx(), uriSpec, &value), NS_OK );
292
- NS_ENSURE_TRUE (JS_SetProperty(jsapi.cx(), bundle, "url", value), NS_OK );
289
+ keys. AppendElement ( jni::StringParam ( u" url " _ns) );
290
+ values. AppendElement ( jni::StringParam (uriSpec) );
293
291
294
292
if (aLastVisitedURI) {
295
293
nsAutoCString lastVisitedURISpec;
296
294
if (NS_WARN_IF(NS_FAILED(aLastVisitedURI->GetSpec (lastVisitedURISpec)))) {
297
295
return NS_OK;
298
296
}
299
- NS_ENSURE_TRUE (ToJSValue(jsapi.cx(), lastVisitedURISpec, &value), NS_OK);
300
- NS_ENSURE_TRUE (JS_SetProperty(jsapi.cx(), bundle, "lastVisitedURL", value),
301
- NS_OK);
297
+ keys.AppendElement (jni::StringParam (u" lastVisitedURL" _ns));
298
+ values.AppendElement (jni::StringParam (lastVisitedURISpec));
302
299
}
303
300
304
301
int32_t flags = 0 ;
@@ -324,14 +321,26 @@ GeckoViewHistory::VisitURI(nsIWidget* aWidget, nsIURI* aURI,
324
321
flags |=
325
322
static_cast <int32_t >(GeckoViewVisitFlags::VISIT_UNRECOVERABLE_ERROR);
326
323
}
327
- value = JS::Int32Value (flags);
328
- NS_ENSURE_TRUE (JS_SetProperty(jsapi.cx(), bundle, "flags", value), NS_OK);
324
+ keys.AppendElement (jni::StringParam (u" flags" _ns));
325
+ values.AppendElement (java::sdk::Integer::ValueOf (flags));
326
+
327
+ MOZ_ASSERT (keys.Length () == values.Length ());
328
+
329
+ auto bundleKeys = jni::ObjectArray::New<jni::String>(keys.Length ());
330
+ auto bundleValues = jni::ObjectArray::New<jni::Object>(values.Length ());
331
+ for (size_t i = 0 ; i < keys.Length (); ++i) {
332
+ bundleKeys->SetElement (i, keys[i]);
333
+ bundleValues->SetElement (i, values[i]);
334
+ }
335
+ auto bundle = java::GeckoBundle::New (bundleKeys, bundleValues);
329
336
330
337
nsCOMPtr<nsIGeckoViewEventCallback> callback =
331
338
new OnVisitedCallback (this , aURI);
332
339
333
340
Unused << NS_WARN_IF(
334
341
NS_FAILED (dispatcher->Dispatch (kOnVisitedMessage , bundle, callback)));
342
+ #endif
343
+
335
344
return NS_OK;
336
345
}
337
346
@@ -443,8 +452,6 @@ void GeckoViewHistory::QueryVisitedState(nsIWidget* aWidget,
443
452
ContentParent* aInterestedProcess,
444
453
nsTArray<RefPtr<nsIURI>>&& aURIs) {
445
454
MOZ_ASSERT (XRE_IsParentProcess ());
446
- AssertIsOnMainThread ();
447
-
448
455
RefPtr<nsWindow> window = nsWindow::From (aWidget);
449
456
if (NS_WARN_IF(!window)) {
450
457
return ;
@@ -455,34 +462,38 @@ void GeckoViewHistory::QueryVisitedState(nsIWidget* aWidget,
455
462
}
456
463
457
464
// If nobody is listening for this we can stop now
458
- if (!dispatcher->HasEmbedderListener (kGetVisitedMessage )) {
465
+ if (!dispatcher->HasListener (kGetVisitedMessage )) {
459
466
return ;
460
467
}
461
468
462
- dom::AutoJSAPI jsapi;
463
- NS_ENSURE_TRUE_VOID (!jsapi.Init(xpc::PrivilegedJunkScope()));
464
-
465
- nsTArray<nsCString> specs (aURIs.Length ());
466
- for (auto & uri : aURIs) {
469
+ #ifdef MOZ_WIDGET_ANDROID
470
+ // Assemble a bundle like `{ urls: ["http://example.com/1", ...] }`.
471
+ auto uris = jni::ObjectArray::New<jni::String>(aURIs.Length ());
472
+ for (size_t i = 0 ; i < aURIs.Length (); ++i) {
467
473
nsAutoCString uriSpec;
468
- if (NS_WARN_IF(NS_FAILED(uri ->GetSpec (uriSpec)))) {
474
+ if (NS_WARN_IF(NS_FAILED(aURIs[i] ->GetSpec (uriSpec)))) {
469
475
continue ;
470
476
}
471
- specs.AppendElement (uriSpec);
477
+ jni::String::LocalRef value{jni::StringParam (uriSpec)};
478
+ uris->SetElement (i, value);
472
479
}
473
480
474
- JS::Rooted<JS::Value> urls (jsapi.cx ());
475
- NS_ENSURE_TRUE_VOID (ToJSValue(jsapi.cx(), specs, &urls));
481
+ auto bundleKeys = jni::ObjectArray::New<jni::String>(1 );
482
+ jni::String::LocalRef key (jni::StringParam (u" urls" _ns));
483
+ bundleKeys->SetElement (0 , key);
484
+
485
+ auto bundleValues = jni::ObjectArray::New<jni::Object>(1 );
486
+ jni::Object::LocalRef value (uris);
487
+ bundleValues->SetElement (0 , value);
476
488
477
- JS::Rooted<JSObject*> bundle (jsapi.cx (), JS_NewPlainObject (jsapi.cx ()));
478
- NS_ENSURE_TRUE_VOID (bundle);
479
- NS_ENSURE_TRUE_VOID (JS_SetProperty(jsapi.cx(), bundle, "urls", urls));
489
+ auto bundle = java::GeckoBundle::New (bundleKeys, bundleValues);
480
490
481
491
nsCOMPtr<nsIGeckoViewEventCallback> callback =
482
492
new GetVisitedCallback (this , aInterestedProcess, std::move (aURIs));
483
493
484
494
Unused << NS_WARN_IF(
485
495
NS_FAILED (dispatcher->Dispatch (kGetVisitedMessage , bundle, callback)));
496
+ #endif
486
497
}
487
498
488
499
/* *
0 commit comments