diff --git a/build.dev.sh b/build.dev.sh new file mode 100755 index 000000000..46e29bf0c --- /dev/null +++ b/build.dev.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# smaller version of build.sh that sets the commit hash to the current git commit hash and uses the package.json version + +echo "Ensure adb is in PATH" +export PATH="$ANDROID_HOME/platform-tools:$PATH" +adb version + +echo "Update submodule" +git submodule update --init + +echo "Cleanup old build and test artefacts" +rm -rf consoleLog.txt +rm -rf test-app/dist/*.xml + +./gradlew cleanRuntime + +./gradlew -PgitCommitVersion=$(git rev-parse HEAD) +cp dist/nativescript-android-*.tgz dist/nativescript-android.tgz + diff --git a/package.json b/package.json index 45234c850..1735d45a7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@nativescript/android", "description": "NativeScript for Android using v8", - "version": "8.4.0", + "version": "8.5.0", "repository": { "type": "git", "url": "https://github.com/NativeScript/android.git" diff --git a/test-app/app/src/main/assets/app/mainpage.js b/test-app/app/src/main/assets/app/mainpage.js index bc66f2f18..3b6b4f6f3 100644 --- a/test-app/app/src/main/assets/app/mainpage.js +++ b/test-app/app/src/main/assets/app/mainpage.js @@ -66,4 +66,6 @@ require("./tests/kotlin/extensions/testExtensionFunctionsSupport"); require("./tests/kotlin/enums/testEnumsSupport"); require("./tests/kotlin/access/testInternalLanguageFeaturesSupport"); require("./tests/testPackagePrivate"); -require("./tests/kotlin/properties/testPropertiesSupport.js") \ No newline at end of file +require("./tests/kotlin/properties/testPropertiesSupport.js"); +require('./tests/testNativeTimers'); +require("./tests/console/logTests.js"); \ No newline at end of file diff --git a/test-app/app/src/main/assets/app/tests/console/logTests.js b/test-app/app/src/main/assets/app/tests/console/logTests.js new file mode 100644 index 000000000..6f4ea0e2f --- /dev/null +++ b/test-app/app/src/main/assets/app/tests/console/logTests.js @@ -0,0 +1,31 @@ +describe("Test JSONObject conversions", () => { + it("console.log with number param should not crash", () => { + console.log(123); + }); + + it("console.log with string param should not crash", () => { + console.log("123"); + }); + + it("console.log with object param should not crash", () => { + console.log({ num: 123 }); + }); + + it("console.log with function param should not crash", () => { + console.log(function() {}); + }); + + it("console.log with arrow function param should not crash", () => { + console.log(() => {}); + }); + + it("console.log with primitive array param should not crash", () => { + console.log([1, 2, 3]); + }); + + it("console.log with object array param should not crash", () => { + console.log([{ + num: 123 + }]); + }); +}); \ No newline at end of file diff --git a/test-app/app/src/main/assets/app/tests/exceptionHandlingTests.js b/test-app/app/src/main/assets/app/tests/exceptionHandlingTests.js index f8e05aafc..bf9aed120 100644 --- a/test-app/app/src/main/assets/app/tests/exceptionHandlingTests.js +++ b/test-app/app/src/main/assets/app/tests/exceptionHandlingTests.js @@ -322,7 +322,7 @@ describe("Tests exception handling ", function () { // run this test only for API level bigger than 25 as we have handling there if(android.os.Build.VERSION.SDK_INT > 25 && android.os.Build.CPU_ABI != "x86" && android.os.Build.CPU_ABI != "x86_64") { - it("Should handle SIGABRT and throw a NativeScript exception when incorrectly calling JNI methods", function () { + xit("Should handle SIGABRT and throw a NativeScript exception when incorrectly calling JNI methods", function () { let myClassInstance = new com.tns.tests.MyTestBaseClass3(); // public void callMeWithAString(java.lang.String[] stringArr, Runnable arbitraryInterface) try { diff --git a/test-app/app/src/main/assets/app/tests/testNativeTimers.js b/test-app/app/src/main/assets/app/tests/testNativeTimers.js new file mode 100644 index 000000000..58af54916 --- /dev/null +++ b/test-app/app/src/main/assets/app/tests/testNativeTimers.js @@ -0,0 +1,126 @@ +describe('native timer', () => { + + /** @type {global.setTimeout} */ + let setTimeout = global.__ns__setTimeout; + /** @type {global.setInterval} */ + let setInterval = global.__ns__setInterval; /** @type global.setTimeout */ + /** @type {global.clearTimeout} */ + let clearTimeout = global.__ns__clearTimeout; + /** @type {global.clearInterval} */ + let clearInterval = global.__ns__clearInterval; + + it('exists', () => { + expect(setTimeout).toBeDefined(); + expect(setInterval).toBeDefined(); + expect(clearTimeout).toBeDefined(); + expect(clearInterval).toBeDefined(); + }); + + it('triggers timeout', (done) => { + const now = Date.now(); + setTimeout(() => { + expect(Date.now() - now).not.toBeLessThan(100); + done(); + }, 100); + }); + + it('triggers timeout', (done) => { + const now = Date.now(); + setTimeout(() => { + expect(Date.now() - now).not.toBeLessThan(100); + done(); + }, 100); + }); + + it('triggers interval', (done) => { + let calls = 0; + const itv = setInterval(() => { + calls++; + }, 100); + setTimeout(() => { + clearInterval(itv); + expect(calls).toBe(10); + done(); + }, 1000); + }); + + it('cancels timeout', (done) => { + let triggered = false; + const now = Date.now(); + const timeout = setTimeout(() => { + triggered = true; + }, 100); + clearTimeout(timeout); + setTimeout(() => { + expect(triggered).toBe(false); + done(); + }, 200); + }); + + it('cancels interval', (done) => { + let triggered = false; + const now = Date.now(); + const timeout = setInterval(() => { + triggered = true; + }, 100); + clearInterval(timeout); + setTimeout(() => { + expect(triggered).toBe(false); + done(); + }, 200); + }); + + it('cancels interval inside function', (done) => { + let calls = 0; + const itv = setInterval(() => { + calls++; + clearInterval(itv); + }, 10); + setTimeout(() => { + expect(calls).toBe(1); + done(); + }, 100); + }); + + it('preserves order', (done) => { + let calls = 0; + setTimeout(() => { + expect(calls).toBe(0); + calls++; + }); + setTimeout(() => { + expect(calls).toBe(1); + calls++; + done(); + }); + }); + it('frees up resources after complete', (done) => { + let timeout = 0; + let interval = 0; + let weakRef; + { + let obj = { + value: 0 + }; + weakRef = new WeakRef(obj); + timeout = setTimeout(() => { + obj.value++; + }, 100); + interval = setInterval(() => { + obj.value++; + }, 50); + } + setTimeout(() => { + // use !! here because if you pass weakRef.get() it creates a strong reference (side effect of expect) + expect(!!weakRef.get()).toBe(true); + clearInterval(interval); + clearTimeout(timeout); + // use another timeout as native weakrefs can't be gced until we leave the isolate after being used once + setTimeout(() => { + gc(); + expect(!!weakRef.get()).toBe(false); + done(); + }) + }, 200); + }) +}); \ No newline at end of file diff --git a/test-app/app/src/main/assets/app/tests/testWeakRef.js b/test-app/app/src/main/assets/app/tests/testWeakRef.js index f8499d6a1..4749b9cd5 100644 --- a/test-app/app/src/main/assets/app/tests/testWeakRef.js +++ b/test-app/app/src/main/assets/app/tests/testWeakRef.js @@ -1,149 +1,97 @@ describe("Test WeakRef ", function () { - - it("Test if WeakRef gets cleared after gc", function () { - + it("Test if WeakRef gets cleared after gc", function (done) { __log("TEST: TestWeakRefGetsClearedAfterGC"); - + var wr = new WeakRef({ someProp: 12345 }); - + var val = wr.get().someProp; expect(val).toBe(12345); - gc(); - - var val = wr.get(); - expect(val).toBe(null); - }); - - it("Test if WeakRef gets cleared after clear", function () { - - __log("TEST: TestWeakRefGetsClearedAfterClear"); - - var wr = new WeakRef({ someProp: 54321 }); - - var val = wr.get().someProp; - expect(val).toBe(54321); - - wr.clear(); - - var val = wr.get(); - expect(val).toBe(null); + + setTimeout(() => { + gc(); + var val = wr.get(); + expect(val).toBe(undefined); + done(); + }); }); - - it("Test if WeakRef can create multiple instances", function () { - + + it("Test if WeakRef can create multiple instances", function (done) { __log("TEST: TestWeakRefCanCreateMultipleInstances"); - - var target = { someProp: 54321 }; - - var wr1 = new WeakRef(target); - var wr2 = new WeakRef(target); - - target = null; - - wr1.clear(); - - var val = wr1.get(); - expect(val).toBe(null); - - val = wr2.get().someProp; - expect(val).toBe(54321); - }); - - it("Test if WeakRef can create multiple instances 2", function () { - __log("TEST: TestWeakRefCanCreateMultipleInstances2"); - var target = { someProp: 54321 }; - + var wr1 = new WeakRef(target); var wr2 = new WeakRef(target); - + target = null; - gc(); - - var val1 = wr1.get(); - expect(val1).toBe(null); - - var val2 = wr2.get(); - expect(val2).toBe(null); + setTimeout(() => { + gc(); + + var val1 = wr1.get(); + expect(val1).toBe(undefined); + + var val2 = wr2.get(); + expect(val2).toBe(undefined); + done(); + }); }); - + it("Test if WeakRef throws exception when constructed with wrong number of parameters", function () { - - __log("TEST: TestWeakRefThrowsExceptionWhenConstructedWithWrongNumberOfParameters"); - + __log( + "TEST: TestWeakRefThrowsExceptionWhenConstructedWithWrongNumberOfParameters" + ); + var exceptionCaught = false; - try - { + try { new WeakRef(); - } - catch (e) - { + } catch (e) { exceptionCaught = true; } expect(exceptionCaught).toBe(true); - + exceptionCaught = false; - try - { + try { new WeakRef(1, 2); - } - catch (e) - { + } catch (e) { exceptionCaught = true; } expect(exceptionCaught).toBe(true); - }); it("Test if WeakRef throws exception when constructed with non object", function () { - __log("TEST: TestWeakRefThrowsExceptionWhenConstructedWithNonObject"); - + var exceptionCaught = false; - try - { + try { new WeakRef(1); - } - catch (e) - { + } catch (e) { exceptionCaught = true; } expect(exceptionCaught).toBe(true); - + exceptionCaught = false; - try - { + try { new WeakRef(false); - } - catch (e) - { + } catch (e) { exceptionCaught = true; } expect(exceptionCaught).toBe(true); exceptionCaught = false; - try - { + try { new WeakRef(null); - } - catch (e) - { + } catch (e) { exceptionCaught = true; } expect(exceptionCaught).toBe(true); exceptionCaught = false; - try - { + try { new WeakRef(undefined); - } - catch (e) - { + } catch (e) { exceptionCaught = true; } expect(exceptionCaught).toBe(true); }); }); - diff --git a/test-app/app/src/main/java/com/tns/Benchmarker.java b/test-app/app/src/main/java/com/tns/Benchmarker.java new file mode 100644 index 000000000..d50129757 --- /dev/null +++ b/test-app/app/src/main/java/com/tns/Benchmarker.java @@ -0,0 +1,2 @@ +package com.tns;public class Benchmarker { +} diff --git a/test-app/build-tools/sbg-interfaces-names.txt b/test-app/build-tools/sbg-interfaces-names.txt deleted file mode 100644 index bfa196f81..000000000 --- a/test-app/build-tools/sbg-interfaces-names.txt +++ /dev/null @@ -1,1705 +0,0 @@ -kotlinx.parcelize.IgnoredOnParcel -kotlinx.parcelize.Parceler -kotlinx.parcelize.Parcelize -kotlinx.parcelize.RawValue -kotlinx.parcelize.TypeParceler.Container -kotlinx.parcelize.TypeParceler -kotlinx.parcelize.WriteWith -androidx.lifecycle.HasDefaultViewModelProviderFactory -kotlin.jvm.internal.FunctionAdapter -androidx.arch.core.internal.SafeIterableMap.SupportRemove -androidx.lifecycle.LifecycleRegistryOwner -androidx.lifecycle.ReportFragment.ActivityInitializationListener -androidx.vectordrawable.graphics.drawable.Animatable2Compat -androidx.lifecycle.ViewModelProvider.Factory -androidx.exifinterface.media.ExifInterface.ExifStreamType -androidx.arch.core.util.Function -androidx.exifinterface.media.ExifInterface.IfdType -androidx.lifecycle.Observer -androidx.lifecycle.FullLifecycleObserver -androidx.lifecycle.GeneratedAdapter -androidx.lifecycle.GenericLifecycleObserver -kotlin.io.path.ExperimentalPathApi -androidx.constraintlayout.solver.state.Reference -androidx.constraintlayout.solver.state.ConstraintReference.ConstraintReferenceFactory -androidx.loader.app.LoaderManager.LoaderCallbacks -androidx.dynamicanimation.animation.AnimationHandler.AnimationFrameCallback -com.tns.ExtractPolicy -com.tns.FileExtractor -androidx.lifecycle.LifecycleEventObserver -androidx.lifecycle.LifecycleObserver -androidx.lifecycle.LifecycleOwner -com.tns.JavaScriptImplementation -com.tns.Logger -com.tns.ManualInstrumentation.Frame -androidx.lifecycle.OnLifecycleEvent -androidx.viewpager.widget.ViewPager.DecorView -androidx.viewpager.widget.ViewPager.OnAdapterChangeListener -androidx.viewpager.widget.ViewPager.OnPageChangeListener -androidx.viewpager.widget.ViewPager.PageTransformer -androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationEndListener -androidx.dynamicanimation.animation.DynamicAnimation.OnAnimationUpdateListener -androidx.loader.content.Loader.OnLoadCanceledListener -androidx.loader.content.Loader.OnLoadCompleteListener -androidx.lifecycle.ViewModelStoreOwner -org.intellij.lang.annotations.Flow -org.intellij.lang.annotations.Identifier -org.intellij.lang.annotations.JdkConstants.AdjustableOrientation -org.intellij.lang.annotations.JdkConstants.BoxLayoutAxis -org.intellij.lang.annotations.JdkConstants.CalendarMonth -org.intellij.lang.annotations.JdkConstants.CursorType -org.intellij.lang.annotations.JdkConstants.FlowLayoutAlignment -org.intellij.lang.annotations.JdkConstants.FontStyle -org.intellij.lang.annotations.JdkConstants.HorizontalAlignment -org.intellij.lang.annotations.JdkConstants.InputEventMask -org.intellij.lang.annotations.JdkConstants.ListSelectionMode -org.intellij.lang.annotations.JdkConstants.PatternFlags -org.intellij.lang.annotations.JdkConstants.TabLayoutPolicy -org.intellij.lang.annotations.JdkConstants.TabPlacement -org.intellij.lang.annotations.JdkConstants.TitledBorderJustification -androidx.recyclerview.widget.AdapterHelper.Callback -org.intellij.lang.annotations.JdkConstants.TitledBorderTitlePosition -org.intellij.lang.annotations.JdkConstants.TreeSelectionMode -org.intellij.lang.annotations.Language -org.intellij.lang.annotations.MagicConstant -org.intellij.lang.annotations.Pattern -kotlin.jvm.internal.RepeatableContainer -androidx.dynamicanimation.animation.Force -org.intellij.lang.annotations.PrintFormat -org.intellij.lang.annotations.RegExp -org.intellij.lang.annotations.Subst -androidx.savedstate.SavedStateRegistry.AutoRecreated -org.jetbrains.annotations.Contract -androidx.savedstate.SavedStateRegistry.SavedStateProvider -org.jetbrains.annotations.Nls -org.jetbrains.annotations.NonNls -org.jetbrains.annotations.NotNull -org.jetbrains.annotations.Nullable -androidx.customview.widget.FocusStrategy.BoundsAdapter -org.jetbrains.annotations.PropertyKey -androidx.customview.widget.FocusStrategy.CollectionAdapter -org.jetbrains.annotations.TestOnly -com.tns.NativeScriptHashCodeProvider -kotlin.BuilderInference -androidx.activity.Cancellable -androidx.transition.AnimatorUtils.AnimatorPauseListenerCompat -androidx.savedstate.SavedStateRegistryOwner -androidx.annotation.experimental.Experimental -androidx.annotation.experimental.UseExperimental -androidx.annotation.AnimRes -androidx.annotation.AnimatorRes -androidx.constraintlayout.solver.LinearSystem.Row -androidx.annotation.AnyRes -androidx.annotation.AnyThread -androidx.print.PrintHelper.OnPrintFinishCallback -androidx.annotation.ArrayRes -androidx.annotation.AttrRes -androidx.annotation.BinderThread -androidx.annotation.BoolRes -androidx.annotation.CallSuper -androidx.annotation.CheckResult -androidx.constraintlayout.solver.Pools.Pool -androidx.annotation.ChecksSdkIntAtLeast -androidx.annotation.ColorInt -androidx.annotation.ColorLong -androidx.annotation.ColorRes -androidx.annotation.ContentView -androidx.annotation.DimenRes -androidx.annotation.Dimension -androidx.drawerlayout.widget.DrawerLayout.DrawerListener -androidx.annotation.DoNotInline -androidx.annotation.DrawableRes -androidx.annotation.FloatRange -androidx.annotation.FontRes -androidx.annotation.FractionRes -androidx.annotation.GuardedBy -androidx.constraintlayout.solver.ArrayRow.ArrayRowVariables -androidx.annotation.HalfFloat -androidx.annotation.IdRes -androidx.annotation.InspectableProperty.EnumEntry -androidx.annotation.InspectableProperty.FlagEntry -androidx.recyclerview.widget.AsyncListDiffer.ListListener -androidx.annotation.InspectableProperty -androidx.versionedparcelable.NonParcelField -androidx.annotation.IntDef -androidx.annotation.IntRange -androidx.annotation.IntegerRes -androidx.annotation.InterpolatorRes -androidx.versionedparcelable.ParcelField -androidx.annotation.Keep -androidx.annotation.LayoutRes -androidx.annotation.LongDef -androidx.annotation.MainThread -androidx.annotation.MenuRes -androidx.annotation.NavigationRes -androidx.annotation.NonNull -androidx.annotation.Nullable -kotlin.Deprecated -androidx.annotation.PluralsRes -androidx.fragment.app.Fragment.OnStartEnterTransitionListener -androidx.annotation.Px -kotlin.DeprecatedSinceKotlin -androidx.annotation.RawRes -androidx.annotation.RequiresApi -com.tns.NativeScriptWeakHashMap.Entry.Type -androidx.annotation.RequiresFeature -kotlin.DslMarker -androidx.annotation.RequiresPermission.Read -androidx.annotation.RequiresPermission.Write -android.support.v4.app.INotificationSideChannel -androidx.annotation.RequiresPermission -androidx.activity.OnBackPressedDispatcherOwner -androidx.annotation.RestrictTo -androidx.activity.contextaware.ContextAware -androidx.annotation.Size -androidx.annotation.StringDef -androidx.annotation.StringRes -androidx.activity.contextaware.OnContextAvailableListener -androidx.annotation.StyleRes -androidx.annotation.StyleableRes -androidx.annotation.TransitionRes -androidx.annotation.UiThread -androidx.annotation.VisibleForTesting -android.support.v4.os.IResultReceiver -androidx.annotation.WorkerThread -androidx.annotation.XmlRes -kotlin.Experimental -androidx.activity.result.ActivityResultCallback -kotlin.ExperimentalMultiplatform -androidx.activity.result.ActivityResultCaller -kotlin.ExperimentalStdlibApi -kotlin.ExperimentalUnsignedTypes -kotlin.ExtensionFunctionType -kotlin.Function -androidx.viewpager2.adapter.StatefulAdapter -androidx.appcompat.app.ActionBar.DisplayOptions -androidx.recyclerview.widget.ChildHelper.Callback -androidx.appcompat.app.ActionBar.NavigationMode -androidx.appcompat.app.ActionBar.OnMenuVisibilityListener -androidx.core.app.ActivityCompat.OnRequestPermissionsResultCallback -androidx.appcompat.app.ActionBar.OnNavigationListener -androidx.core.app.ActivityCompat.PermissionCompatDelegate -androidx.core.app.ActivityCompat.RequestPermissionsRequestCodeValidator -androidx.appcompat.app.ActionBar.TabListener -androidx.appcompat.app.ActionBarDrawerToggle.Delegate -androidx.versionedparcelable.VersionedParcelable -androidx.versionedparcelable.VersionedParcelize -androidx.cardview.widget.CardViewDelegate -androidx.cardview.widget.CardViewImpl -androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider -androidx.cardview.widget.RoundRectDrawableWithShadow.RoundRectHelper -android.window.SplashScreen -android.window.SplashScreen.OnExitAnimationListener -androidx.viewpager2.widget.ViewPager2.OffscreenPageLimit -kotlin.Lazy -androidx.viewpager2.widget.ViewPager2.Orientation -androidx.constraintlayout.solver.widgets.Helper -com.tns.RuntimeCallable -com.tns.ThreadScheduler -androidx.viewpager2.widget.ViewPager2.PageTransformer -androidx.appcompat.app.AlertController.AlertParams.OnPrepareListViewListener -kotlin.Metadata -androidx.viewpager2.widget.ViewPager2.ScrollState -androidx.multidex.MultiDex.V14.ElementConstructor -androidx.coordinatorlayout.widget.CoordinatorLayout.AttachedBehavior -androidx.activity.result.ActivityResultRegistryOwner -android.nfc.NfcAdapter.CreateBeamUrisCallback -androidx.coordinatorlayout.widget.CoordinatorLayout.DefaultBehavior -androidx.coordinatorlayout.widget.CoordinatorLayout.DispatchChangeEvent -androidx.transition.GhostView -kotlin.OptIn -kotlin.OptionalExpectation -kotlin.OverloadResolutionByLambdaReturnType -kotlin.ParameterName -android.nfc.NfcAdapter.ReaderCallback -com.tns.bindings.desc.ClassDescriptor -com.tns.bindings.desc.Descriptor -com.tns.bindings.desc.MethodDescriptor -androidx.core.app.CoreComponentFactory.CompatWrapped -android.nfc.NfcAdapter.CreateNdefMessageCallback -android.nfc.NfcAdapter.OnNdefPushCompleteCallback -android.nfc.NfcAdapter.OnTagRemovedListener -com.tns.system.classes.caching.ClassCache -kotlin.PublishedApi -kotlin.ReplaceWith -com.tns.system.classes.loading.ClassStorageService -kotlin.RequiresOptIn -com.tns.system.classloaders.ClassLoadersCollection -android.nfc.tech.TagTechnology -fi.iki.elonen.NanoHTTPD.AsyncRunner -androidx.core.app.FrameMetricsAggregator.MetricType -androidx.constraintlayout.motion.widget.Animatable -androidx.constraintlayout.motion.widget.CustomFloatAttributes -androidx.core.app.JobIntentService.CompatJobEngine -androidx.appcompat.app.AppCompatCallback -androidx.cursoradapter.widget.CursorFilter.CursorFilterClient -androidx.appcompat.app.AppCompatDelegate.NightMode -androidx.core.app.JobIntentService.GenericWorkItem -androidx.cursoradapter.widget.SimpleCursorAdapter.CursorToStringConverter -androidx.cursoradapter.widget.SimpleCursorAdapter.ViewBinder -kotlinx.android.extensions.ContainerOptions -kotlinx.android.extensions.LayoutContainer -kotlinx.android.parcel.IgnoredOnParcel -kotlinx.android.parcel.Parceler -kotlinx.android.parcel.Parcelize -kotlinx.android.parcel.RawValue -kotlinx.android.parcel.TypeParceler.Container -android.renderscript.Allocation.OnBufferAvailableListener -kotlinx.android.parcel.TypeParceler -fi.iki.elonen.NanoHTTPD.IHTTPSession -kotlinx.android.parcel.WriteWith -kotlin.SinceKotlin -androidx.core.app.NotificationBuilderWithBuilderAccessor -fi.iki.elonen.NanoHTTPD.Response.IStatus -androidx.transition.Slide.CalculateSlide -kotlin.Suppress -androidx.transition.Slide.GravityFlag -androidx.transition.Styleable.ArcMotion -androidx.transition.Styleable.ChangeBounds -androidx.transition.Styleable.ChangeTransform -androidx.transition.Styleable.Fade -androidx.transition.Styleable.PatternPathMotion -androidx.transition.Styleable.Slide -androidx.transition.Styleable.Transition -androidx.transition.Styleable.TransitionManager -androidx.transition.Styleable.TransitionSet -androidx.transition.Styleable.TransitionTarget -androidx.transition.Styleable.VisibilityTransition -fi.iki.elonen.NanoHTTPD.ServerSocketFactory -fi.iki.elonen.NanoHTTPD.TempFile -fi.iki.elonen.NanoHTTPD.TempFileManager -fi.iki.elonen.NanoHTTPD.TempFileManagerFactory -androidx.core.app.NotificationCompat.Action.Extender -androidx.core.app.NotificationCompat.Action.SemanticAction -androidx.transition.Transition.MatchOrder -androidx.transition.Transition.TransitionListener -androidx.core.app.NotificationCompat.BadgeIconType -androidx.constraintlayout.solver.widgets.analyzer.Dependency -androidx.fragment.app.FragmentManager.BackStackEntry -androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.Measurer -androidx.recyclerview.widget.ItemTouchHelper.ViewDropHandler -androidx.fragment.app.FragmentManager.OnBackStackChangedListener -androidx.fragment.app.FragmentManager.OpGenerator -com.google.android.material.animation.TransformationCallback -androidx.recyclerview.widget.ItemTouchUIUtil -com.google.android.material.appbar.AppBarLayout.BaseOnOffsetChangedListener -androidx.transition.ViewGroupOverlayImpl -kotlin.UnsafeVariance -com.google.android.material.appbar.AppBarLayout.LayoutParams.ScrollFlags -kotlin.UseExperimental -kotlin.WasExperimental -androidx.core.app.NotificationCompat.Extender -com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener -androidx.core.app.NotificationCompat.GroupAlertBehavior -org.ow2.asmdex.Constants -kotlin.annotation.MustBeDocumented -kotlin.annotation.Repeatable -kotlin.annotation.Retention -kotlin.annotation.Target -androidx.fragment.app.FragmentOnAttachListener -androidx.transition.ViewOverlayImpl -androidx.fragment.app.FragmentResultListener -androidx.fragment.app.FragmentResultOwner -androidx.recyclerview.widget.ListUpdateCallback -androidx.core.app.NotificationCompat.NotificationVisibility -androidx.core.app.NotificationCompat.StreamType -androidx.appcompat.widget.ResourceManagerInternal.InflateDelegate -androidx.constraintlayout.motion.widget.MotionLayout.MotionTracker -androidx.appcompat.widget.ResourceManagerInternal.ResourceManagerHooks -androidx.transition.Visibility.Mode -androidx.constraintlayout.motion.widget.MotionLayout.TransitionListener -com.google.android.material.appbar.CollapsingToolbarLayout.TitleCollapseMode -androidx.recyclerview.widget.OpReorderer.Callback -androidx.fragment.app.FragmentStateManagerControl -androidx.transition.WindowIdImpl -org.ow2.asmdex.Opcodes -androidx.recyclerview.widget.RecyclerView.ChildDrawingOrderCallback -androidx.recyclerview.widget.RecyclerView.EdgeEffectFactory.EdgeDirection -androidx.recyclerview.widget.RecyclerView.ItemAnimator.AdapterChanges -androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener -androidx.recyclerview.widget.RecyclerView.ItemAnimator.ItemAnimatorListener -com.google.android.material.badge.BadgeDrawable.BadgeGravity -org.ow2.asmdex.instruction.IDebugDifferenceAddressInstruction -org.ow2.asmdex.instruction.IDebugDifferenceLineInstruction -org.ow2.asmdex.instruction.IDebugLocalVariableInstruction -org.ow2.asmdex.instruction.IDebugLocalVariableStartInstruction -org.ow2.asmdex.instruction.IDebugRegisterInstruction -org.ow2.asmdex.instruction.IDebugSourceNameInstruction -org.ow2.asmdex.instruction.IIndexInstruction -org.ow2.asmdex.instruction.ILiteralInstruction -org.ow2.asmdex.instruction.ILongLiteralInstruction -org.ow2.asmdex.instruction.IOffsetInstruction -org.ow2.asmdex.instruction.IOneRegisterInstruction -org.ow2.asmdex.instruction.IPseudoInstruction -org.ow2.asmdex.instruction.IRegisterArrayInstruction -org.ow2.asmdex.instruction.IThreeRegistersInstruction -org.ow2.asmdex.instruction.ITwoRegistersInstruction -androidx.fragment.app.FragmentTransition.Callback -androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection -androidx.recyclerview.widget.RecyclerView.LayoutManager.LayoutPrefetchRegistry -android.companion.DeviceFilter -androidx.core.app.NotificationManagerCompat.Task -androidx.appcompat.view.ActionMode.Callback -androidx.appcompat.view.CollapsibleActionView -com.google.android.material.badge.ExperimentalBadgeUtils -android.se.omapi.SEService.OnConnectedListener -androidx.core.app.RemoteInput.EditChoicesBeforeSending -com.google.android.material.behavior.SwipeDismissBehavior.OnDismissListener -androidx.core.app.RemoteInput.Source -android.database.Cursor -android.database.DatabaseErrorHandler -org.ow2.asmdex.lowLevelUtils.IDalvikValueReader -org.ow2.asmdex.specificAnnotationParser.ISpecificAnnotationParser -com.google.android.material.bottomappbar.BottomAppBar.AnimationListener -androidx.constraintlayout.motion.widget.ProxyInterface -androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener -androidx.recyclerview.widget.RecyclerView.OnItemTouchListener -org.ow2.asmdex.structureReader.ISwitchCase -androidx.recyclerview.widget.RecyclerView.Orientation -android.database.sqlite.SQLiteDatabase.CursorFactory -android.database.sqlite.SQLiteCursorDriver -android.database.sqlite.SQLiteTransactionListener -androidx.recyclerview.widget.RecyclerView.RecyclerListener -androidx.core.app.ServiceCompat.StopForegroundFlags -com.google.android.material.bottomappbar.BottomAppBar.FabAlignmentMode -com.google.android.material.bottomappbar.BottomAppBar.FabAnimationMode -org.ow2.asmdex.structureWriter.IAnnotationsHolder -androidx.fragment.app.SpecialEffectsControllerFactory -androidx.appcompat.view.menu.CascadingMenuPopup.HorizPosition -androidx.recyclerview.widget.RecyclerView.SmoothScroller.ScrollVectorProvider -android.database.CrossProcessCursor -androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener -androidx.core.app.TaskStackBuilder.SupportParentable -com.google.android.material.bottomnavigation.BottomNavigationView.OnNavigationItemReselectedListener -com.google.android.material.bottomnavigation.BottomNavigationView.OnNavigationItemSelectedListener -com.google.android.material.bottomnavigation.LabelVisibilityMode -androidx.appcompat.view.menu.MenuBuilder.Callback -androidx.appcompat.view.menu.MenuBuilder.ItemInvoker -androidx.core.content.FileProvider.PathStrategy -com.google.android.material.bottomsheet.BottomSheetBehavior.SaveFlags -com.google.android.material.bottomsheet.BottomSheetBehavior.State -androidx.core.content.PermissionChecker.PermissionResult -androidx.appcompat.view.menu.MenuHelper -androidx.core.content.pm.PermissionInfoCompat.Protection -androidx.core.content.pm.PermissionInfoCompat.ProtectionFlags -android.bluetooth.BluetoothAdapter.LeScanCallback -org.ow2.asmdex.util.TextComponent -android.bluetooth.BluetoothProfile.ServiceListener -android.bluetooth.BluetoothProfile -androidx.core.content.pm.ShortcutManagerCompat.ShortcutMatchFlags -com.google.android.material.button.MaterialButton.IconGravity -com.google.android.material.button.MaterialButton.OnCheckedChangeListener -com.google.android.material.button.MaterialButton.OnPressedChangeListener -androidx.appcompat.view.menu.MenuPresenter.Callback -androidx.appcompat.view.menu.MenuPresenter -androidx.appcompat.view.menu.MenuView.ItemView -androidx.appcompat.view.menu.MenuView -androidx.appcompat.view.menu.ShowableListMenu -androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry -androidx.core.content.res.FontResourcesParserCompat.FetchStrategy -android.transition.Transition.TransitionListener -com.google.android.material.button.MaterialButtonToggleGroup.OnButtonCheckedListener -android.speech.tts.TextToSpeech.OnUtteranceCompletedListener -androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback -android.speech.tts.SynthesisCallback -com.google.android.material.card.MaterialCardView.OnCheckedChangeListener -android.speech.tts.TextToSpeech.OnInitListener -android.speech.RecognitionListener -androidx.recyclerview.widget.ThreadUtil.BackgroundCallback -androidx.recyclerview.widget.ThreadUtil.MainThreadCallback -androidx.recyclerview.widget.ThreadUtil -android.text.ParcelableSpan -androidx.recyclerview.widget.ViewBoundsCheck.Callback -androidx.recyclerview.widget.ViewBoundsCheck.ViewBounds -androidx.appcompat.widget.ActionMenuView.ActionMenuChildView -androidx.recyclerview.widget.ViewInfoStore.ProcessCallback -androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener -android.text.method.TransformationMethod -androidx.appcompat.widget.ActivityChooserModel.ActivityChooserModelClient -androidx.appcompat.widget.ActivityChooserModel.ActivitySorter -android.text.method.KeyListener -androidx.appcompat.widget.ActivityChooserModel.OnChooseActivityListener -android.text.method.MovementMethod -android.text.Html.TagHandler -androidx.core.graphics.TypefaceCompatBaseImpl.StyleExtractor -android.text.Editable -android.text.Spanned -android.text.Html.ImageGetter -com.google.android.material.chip.ChipDrawable.Delegate -androidx.core.graphics.drawable.IconCompat.IconType -android.text.InputType -android.text.GetChars -android.text.TextShaper.GlyphsConsumer -android.text.style.LineHeightSpan.WithDensity -android.text.style.LeadingMarginSpan.LeadingMarginSpan2 -androidx.core.graphics.drawable.TintAwareDrawable -androidx.core.graphics.drawable.WrappedDrawable -com.google.android.material.chip.ChipGroup.OnCheckedChangeListener -android.text.style.AlignmentSpan -androidx.core.internal.package-info -androidx.core.internal.view.SupportMenu -android.text.style.LeadingMarginSpan -androidx.core.internal.view.SupportMenuItem -androidx.core.internal.view.SupportSubMenu -androidx.core.location.GnssStatusCompat.ConstellationType -com.google.android.material.circularreveal.CircularRevealHelper.Delegate -android.text.style.UpdateLayout -com.google.android.material.circularreveal.CircularRevealHelper.Strategy -android.text.style.UpdateAppearance -android.text.style.WrapTogetherSpan -android.text.style.LineBackgroundSpan -com.google.android.material.circularreveal.CircularRevealWidget -android.text.style.LineHeightSpan -android.text.style.TabStopSpan -androidx.appcompat.widget.AppCompatSpinner.SpinnerPopup -android.text.style.ParagraphStyle -android.text.util.Linkify.MatchFilter -com.google.android.material.datepicker.CalendarConstraints.DateValidator -android.text.util.Linkify.TransformFilter -androidx.core.net.ConnectivityManagerCompat.RestrictBackgroundStatus -com.google.android.material.datepicker.CompositeDateValidator.Operator -android.text.TextWatcher -android.text.Spannable -android.text.TextUtils.EllipsizeCallback -android.text.NoCopySpan -android.text.TextUtils.StringSplitter -android.text.SpanWatcher -androidx.core.os.CancellationSignal.OnCancelListener -com.google.android.material.datepicker.DateSelector -android.text.InputFilter -android.text.TextDirectionHeuristic -androidx.core.os.LocaleListInterface -androidx.core.os.ParcelableCompatCreatorCallbacks -android.hardware.Camera.AutoFocusCallback -android.hardware.Camera.OnZoomChangeListener -com.google.android.material.datepicker.MaterialCalendar.OnDayClickListener -androidx.appcompat.widget.ContentFrameLayout.OnAttachListener -androidx.appcompat.widget.DecorContentParent -androidx.appcompat.widget.DecorToolbar -android.hardware.Camera.PreviewCallback -android.hardware.Camera.FaceDetectionListener -androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason -androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener -androidx.appcompat.widget.FitWindowsViewGroup -androidx.appcompat.widget.LinearLayoutCompat.DividerMode -com.google.android.material.datepicker.MaterialDatePicker.InputMode -androidx.appcompat.widget.LinearLayoutCompat.OrientationMode -androidx.core.provider.SelfDestructiveThread.ReplyCallback -android.hardware.display.DisplayManager.DisplayListener -com.google.android.material.datepicker.MaterialPickerOnPositiveButtonClickListener -android.hardware.SensorListener -android.hardware.biometrics.BiometricManager.Authenticators -android.hardware.Camera.AutoFocusMoveCallback -android.hardware.Camera.PictureCallback -androidx.core.text.TextDirectionHeuristicCompat -androidx.core.text.TextDirectionHeuristicsCompat.TextDirectionAlgorithm -androidx.appcompat.widget.MenuItemHoverListener -androidx.appcompat.widget.PopupMenu.OnDismissListener -androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener -android.hardware.Camera.ShutterCallback -androidx.core.text.util.LinkifyCompat.LinkifyMask -android.hardware.input.InputManager.InputDeviceListener -android.hardware.SensorEventListener -android.hardware.Camera.ErrorCallback -android.hardware.SensorEventListener2 -androidx.core.util.Consumer -androidx.appcompat.widget.SearchView.OnCloseListener -androidx.appcompat.widget.SearchView.OnQueryTextListener -androidx.appcompat.widget.SearchView.OnSuggestionListener -androidx.core.util.Pools.Pool -androidx.core.util.Predicate -androidx.core.util.Supplier -androidx.core.view.ActionProvider.SubUiVisibilityListener -androidx.core.view.ActionProvider.VisibilityListener -androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener -androidx.core.view.ContentInfoCompat.Flags -androidx.core.view.ContentInfoCompat.Source -com.google.android.material.expandable.ExpandableTransformationWidget -com.google.android.material.expandable.ExpandableWidget -androidx.core.view.DragStartHelper.OnDragStartListener -androidx.core.view.GestureDetectorCompat.GestureDetectorCompatImpl -androidx.core.view.KeyEventDispatcher.Component -androidx.core.view.LayoutInflaterFactory -androidx.appcompat.widget.ThemedSpinnerAdapter -androidx.core.view.MenuItemCompat.OnActionExpandListener -androidx.appcompat.widget.Toolbar.OnMenuItemClickListener -com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton.Size -androidx.core.view.NestedScrollingChild -androidx.core.view.NestedScrollingChild2 -androidx.core.view.NestedScrollingChild3 -androidx.core.view.NestedScrollingParent -androidx.core.view.NestedScrollingParent2 -androidx.core.view.NestedScrollingParent3 -androidx.core.view.OnApplyWindowInsetsListener -androidx.core.view.OnReceiveContentListener -androidx.core.view.OnReceiveContentViewBehavior -androidx.core.view.ScrollingView -androidx.core.view.TintableBackgroundView -androidx.appcompat.widget.ViewStubCompat.OnInflateListener -com.google.android.material.floatingactionbutton.FloatingActionButton.Size -androidx.appcompat.widget.WithHint -androidx.core.view.ViewCompat.FocusDirection -androidx.core.view.ViewCompat.FocusRealDirection -androidx.core.view.ViewCompat.FocusRelativeDirection -androidx.core.view.ViewCompat.NestedScrollType -androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat -androidx.core.view.ViewCompat.ScrollAxis -androidx.core.view.ViewCompat.ScrollIndicators -android.service.autofill.Transformation -android.service.autofill.OnClickAction -com.google.android.material.floatingactionbutton.FloatingActionButtonImpl.InternalTransformationCallback -com.google.android.material.floatingactionbutton.FloatingActionButtonImpl.InternalVisibilityChangedListener -com.google.android.material.floatingactionbutton.MotionStrategy -android.service.autofill.Sanitizer -android.service.autofill.Validator -android.service.autofill.SavedDatasetsInfoCallback -android.service.quickaccesswallet.GetWalletCardsCallback -com.google.android.material.internal.Experimental -androidx.core.view.ViewPropertyAnimatorListener -androidx.core.view.ViewPropertyAnimatorUpdateListener -androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode -com.google.android.material.internal.NavigationMenuPresenter.NavigationMenuItem -androidx.core.view.WindowInsetsAnimationControlListenerCompat -kotlin.collections.Grouping -com.google.android.material.internal.TextDrawableHelper.TextDrawableDelegate -kotlin.collections.MapWithDefault -androidx.core.view.WindowInsetsCompat.Type.InsetsType -android.service.carrier.CarrierMessagingService.ResultCallback -android.webkit.JavascriptInterface -android.webkit.WebResourceRequest -com.google.android.material.internal.ViewGroupOverlayImpl -android.webkit.WebChromeClient.CustomViewCallback -android.webkit.DownloadListener -com.google.android.material.internal.ViewOverlayImpl -android.webkit.WebView.FindListener -com.google.android.material.internal.ViewUtils.OnApplyWindowInsetsListener -android.webkit.WebIconDatabase.IconListener -androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener -com.google.android.material.internal.package-info -androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType -androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener -androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener -android.webkit.WebView.PictureListener -android.webkit.PluginStub -android.webkit.ValueCallback -android.webkit.WebStorage.QuotaUpdater -android.webkit.GeolocationPermissions.Callback -kotlin.collections.MutableMapWithDefault -com.google.android.material.navigation.NavigationBarView.LabelVisibility -com.google.android.material.navigation.NavigationBarView.OnItemReselectedListener -com.google.android.material.navigation.NavigationBarView.OnItemSelectedListener -com.google.android.material.navigation.NavigationView.OnNavigationItemSelectedListener -com.google.android.material.progressindicator.BaseProgressIndicator.HideAnimationBehavior -com.google.android.material.progressindicator.BaseProgressIndicator.ShowAnimationBehavior -androidx.core.view.accessibility.AccessibilityViewCommand -androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener -com.google.android.material.progressindicator.CircularProgressIndicator.IndicatorDirection -android.app.LoaderManager.LoaderCallbacks -android.app.AppOpsManager.OnOpChangedListener -androidx.core.view.inputmethod.InputContentInfoCompat.InputContentInfoCompatImpl -android.app.SharedElementCallback.OnSharedElementsReadyListener -androidx.core.widget.AutoSizeableTextView -android.app.DatePickerDialog.OnDateSetListener -androidx.core.widget.NestedScrollView.OnScrollChangeListener -com.google.android.material.progressindicator.LinearProgressIndicator.IndeterminateAnimationType -com.google.android.material.progressindicator.LinearProgressIndicator.IndicatorDirection -com.google.android.material.resources.CancelableFontCallback.ApplyFont -android.app.Application.ActivityLifecycleCallbacks -androidx.core.widget.TextViewCompat.AutoSizeTextType -android.app.FragmentManager.OnBackStackChangedListener -androidx.core.widget.TintableCompoundButton -androidx.core.widget.TintableCompoundDrawablesView -androidx.core.widget.TintableImageSourceView -com.google.android.material.shadow.ShadowViewDelegate -com.google.android.material.shape.CornerFamily -com.google.android.material.shape.CornerSize -com.google.android.material.shape.MaterialShapeDrawable.CompatibilityShadowMode -android.app.appsearch.BatchResultCallback -com.google.android.material.shape.ShapeAppearanceModel.CornerSizeUnaryOperator -com.google.android.material.shape.ShapeAppearancePathProvider.PathListener -com.google.android.material.shape.Shapeable -android.app.Notification.Action.Extender -android.app.KeyguardManager.OnKeyguardExitResult -com.google.android.material.slider.BaseOnChangeListener -com.google.android.material.slider.BaseOnSliderTouchListener -android.app.FragmentManager.BackStackEntry -com.google.android.material.slider.BaseSlider.TooltipDrawableFactory -android.app.PendingIntent.OnFinished -com.google.android.material.slider.LabelFormatter -com.google.android.material.slider.RangeSlider.OnChangeListener -com.google.android.material.slider.RangeSlider.OnSliderTouchListener -android.app.TimePickerDialog.OnTimeSetListener -com.google.android.material.slider.Slider.OnChangeListener -com.google.android.material.slider.Slider.OnSliderTouchListener -android.app.ActionBar.TabListener -com.google.android.material.snackbar.BaseTransientBottomBar.AnimationMode -com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback.DismissEvent -com.google.android.material.snackbar.BaseTransientBottomBar.ContentViewCallback -com.google.android.material.snackbar.BaseTransientBottomBar.Duration -com.google.android.material.snackbar.BaseTransientBottomBar.OnAttachStateChangeListener -com.google.android.material.snackbar.BaseTransientBottomBar.OnLayoutChangeListener -android.app.UiAutomation.AccessibilityEventFilter -com.google.android.material.snackbar.ContentViewCallback -kotlin.contracts.CallsInPlace -kotlin.contracts.ConditionalEffect -kotlin.contracts.ContractBuilder -com.google.android.material.snackbar.SnackbarManager.Callback -kotlin.contracts.Effect -kotlin.contracts.ExperimentalContracts -kotlin.contracts.Returns -kotlin.contracts.ReturnsNotNull -kotlin.contracts.SimpleEffect -android.app.ZygotePreload -android.app.SearchManager.OnDismissListener -com.google.android.material.tabs.TabLayout.BaseOnTabSelectedListener -android.app.ActionBar.OnNavigationListener -com.google.android.material.tabs.TabLayout.LabelVisibility -com.google.android.material.tabs.TabLayout.Mode -kotlin.coroutines.Continuation -com.google.android.material.tabs.TabLayout.OnTabSelectedListener -kotlin.coroutines.ContinuationInterceptor -com.google.android.material.tabs.TabLayout.TabGravity -kotlin.coroutines.CoroutineContext.Element -com.google.android.material.tabs.TabLayout.TabIndicatorAnimationMode -kotlin.coroutines.CoroutineContext.Key -com.google.android.material.tabs.TabLayout.TabIndicatorGravity -kotlin.coroutines.CoroutineContext -kotlin.coroutines.RestrictsSuspension -android.app.FragmentBreadCrumbs.OnBreadCrumbClickListener -android.app.AlarmManager.OnAlarmListener -android.app.SearchManager.OnCancelListener -android.app.AppOpsManager.OnOpActiveChangedListener -com.google.android.material.tabs.TabLayoutMediator.TabConfigurationStrategy -kotlin.coroutines.jvm.internal.CoroutineStackFrame -kotlin.coroutines.jvm.internal.DebugMetadata -android.app.Notification.Extender -android.app.UiAutomation.OnAccessibilityEventListener -android.app.ActionBar.OnMenuVisibilityListener -kotlin.coroutines.jvm.internal.SuspendFunction -android.app.WallpaperManager.OnColorsChangedListener -android.app.Application.OnProvideAssistDataListener -kotlin.experimental.ExperimentalTypeInference -kotlin.internal.AccessibleLateinitPropertyLiteral -kotlin.internal.ContractsDsl -kotlin.internal.DynamicExtension -kotlin.internal.Exact -kotlin.internal.HidesMembers -kotlin.internal.InlineOnly -kotlin.internal.LowPriorityInOverloadResolution -kotlin.internal.NoInfer -kotlin.internal.OnlyInputTypes -kotlin.internal.PlatformDependent -kotlin.internal.PureReifiable -kotlin.internal.RequireKotlin.Container -kotlin.internal.RequireKotlin -com.google.android.material.textfield.TextInputLayout.BoxBackgroundMode -com.google.android.material.textfield.TextInputLayout.EndIconMode -com.google.android.material.textfield.TextInputLayout.OnEditTextAttachedListener -com.google.android.material.textfield.TextInputLayout.OnEndIconChangedListener -android.app.admin.DevicePolicyManager.OnClearApplicationUserDataListener -android.app.backup.BackupHelper -com.google.android.material.timepicker.ClockHandView.OnActionUpListener -kotlin.js.ExperimentalJsExport -com.google.android.material.timepicker.ClockHandView.OnRotateListener -kotlin.jvm.JvmDefault -kotlin.jvm.JvmDefaultWithoutCompatibility -kotlin.jvm.JvmField -kotlin.jvm.JvmInline -kotlin.jvm.JvmMultifileClass -kotlin.jvm.JvmName -kotlin.jvm.JvmOverloads -kotlin.jvm.JvmPackageName -kotlin.jvm.JvmRecord -android.accessibilityservice.AccessibilityService.SoftKeyboardController.OnShowModeChangedListener -kotlin.jvm.JvmStatic -kotlin.jvm.JvmSuppressWildcards -kotlin.jvm.JvmSynthetic -kotlin.jvm.JvmWildcard -kotlin.jvm.PurelyImplements -kotlin.jvm.Strictfp -kotlin.jvm.Synchronized -android.accessibilityservice.AccessibilityService.MagnificationController.OnMagnificationChangedListener -kotlin.jvm.Throws -kotlin.jvm.Transient -kotlin.jvm.Volatile -kotlin.jvm.functions.Function0 -kotlin.jvm.functions.Function1 -kotlin.jvm.functions.Function10 -kotlin.jvm.functions.Function11 -kotlin.jvm.functions.Function12 -kotlin.jvm.functions.Function13 -com.google.android.material.timepicker.TimeFormat -kotlin.jvm.functions.Function14 -kotlin.jvm.functions.Function15 -kotlin.jvm.functions.Function16 -android.accessibilityservice.AccessibilityService.TakeScreenshotCallback -kotlin.jvm.functions.Function17 -kotlin.jvm.functions.Function18 -kotlin.jvm.functions.Function19 -kotlin.jvm.functions.Function2 -kotlin.jvm.functions.Function20 -kotlin.jvm.functions.Function21 -com.google.android.material.timepicker.TimePickerControls.ActiveSelection -kotlin.jvm.functions.Function22 -com.google.android.material.timepicker.TimePickerControls.ClockPeriod -com.google.android.material.timepicker.TimePickerControls -kotlin.jvm.functions.Function3 -com.google.android.material.timepicker.TimePickerPresenter -kotlin.jvm.functions.Function4 -kotlin.jvm.functions.Function5 -kotlin.jvm.functions.Function6 -kotlin.jvm.functions.Function7 -kotlin.jvm.functions.Function8 -android.preference.PreferenceDataStore -kotlin.jvm.functions.Function9 -kotlin.jvm.functions.FunctionN -com.google.android.material.timepicker.TimePickerView.OnDoubleTapListener -com.google.android.material.timepicker.TimePickerView.OnPeriodChangeListener -com.google.android.material.timepicker.TimePickerView.OnSelectionChange -android.preference.PreferenceManager.OnActivityStopListener -android.preference.PreferenceFragment.OnPreferenceStartFragmentCallback -kotlin.jvm.internal.ClassBasedDeclarationContainer -android.preference.Preference.OnPreferenceChangeListener -android.preference.PreferenceManager.OnActivityDestroyListener -com.google.android.material.transition.FadeModeEvaluator -kotlin.jvm.internal.FunctionBase -kotlin.jvm.internal.KTypeBase -com.google.android.material.transition.FitModeEvaluator -android.preference.Preference.OnPreferenceClickListener -android.preference.PreferenceManager.OnActivityResultListener -com.google.android.material.transition.MaterialContainerTransform.FadeMode -com.google.android.material.transition.MaterialContainerTransform.FitMode -com.google.android.material.transition.MaterialContainerTransform.TransitionDirection -android.accounts.AccountManagerFuture -android.accounts.OnAccountsUpdateListener -android.accounts.AccountManagerCallback -kotlin.jvm.internal.markers.KMappedMarker -kotlin.jvm.internal.markers.KMutableCollection -kotlin.jvm.internal.markers.KMutableIterable -kotlin.jvm.internal.markers.KMutableIterator -kotlin.jvm.internal.markers.KMutableList -android.provider.ContactsContract.DataColumnsWithJoins -kotlin.jvm.internal.markers.KMutableListIterator -kotlin.jvm.internal.markers.KMutableMap.Entry -kotlin.jvm.internal.markers.KMutableMap -kotlin.jvm.internal.markers.KMutableSet -android.provider.ContactsContract.PhoneticNameStyle -android.provider.CalendarContract.CalendarCacheColumns -android.provider.Contacts.OrganizationColumns -android.provider.MediaStore.Video.VideoColumns -com.google.android.material.transition.MaterialSharedAxis.Axis -com.google.android.material.transition.SlideDistanceProvider.GravityFlag -android.provider.ContactsContract.SyncColumns -com.google.android.material.transition.TransitionUtils.CanvasOperation -com.google.android.material.transition.TransitionUtils.CornerSizeBinaryOperator -kotlin.properties.PropertyDelegateProvider -kotlin.properties.ReadOnlyProperty -android.provider.ContactsContract.DataUsageStatColumns -kotlin.properties.ReadWriteProperty -com.google.android.material.transition.VisibilityAnimatorProvider -com.google.android.material.transition.platform.FadeModeEvaluator -android.provider.OpenableColumns -android.provider.ContactsContract.ContactsColumns -android.provider.MediaStore.Audio.ArtistColumns -android.provider.Telephony.TextBasedSmsColumns -com.google.android.material.transition.platform.FitModeEvaluator -android.provider.Contacts.PhonesColumns -android.provider.ContactsContract.CommonDataKinds.CommonColumns -com.google.android.material.transition.platform.MaterialContainerTransform.FadeMode -android.provider.CalendarContract.ColorsColumns -com.google.android.material.transition.platform.MaterialContainerTransform.FitMode -com.google.android.material.transition.platform.MaterialContainerTransform.TransitionDirection -android.provider.CalendarContract.EventDaysColumns -android.provider.ContactsContract.ContactOptionsColumns -android.provider.Contacts.PeopleColumns -kotlin.ranges.ClosedFloatingPointRange -android.provider.BaseColumns -kotlin.ranges.ClosedRange -com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback.ShapeProvider -android.provider.ContactsContract.CommonDataKinds.BaseTypes -android.provider.MediaStore.DownloadColumns -android.provider.MediaStore.MediaColumns -com.google.android.material.transition.platform.MaterialSharedAxis.Axis -android.provider.Contacts.ExtensionsColumns -android.provider.MediaStore.Audio.AudioColumns -android.provider.CalendarContract.RemindersColumns -android.provider.MediaStore.Images.ImageColumns -com.google.android.material.transition.platform.SlideDistanceProvider.GravityFlag -com.google.android.material.transition.platform.TransitionUtils.CanvasOperation -com.google.android.material.transition.platform.TransitionUtils.CornerSizeBinaryOperator -com.google.android.material.transition.platform.VisibilityAnimatorProvider -android.provider.ContactsContract.StatusColumns -android.provider.CalendarContract.CalendarSyncColumns -android.provider.ContactsContract.ContactStatusColumns -android.provider.ContactsContract.DisplayNameSources -kotlin.reflect.KAnnotatedElement -android.provider.SyncStateContract.Columns -android.provider.ContactsContract.PhoneLookupColumns -kotlin.reflect.KCallable -kotlin.reflect.KClass -android.provider.ContactsContract.DeletedContactsColumns -kotlin.reflect.KClassifier -android.provider.ContactsContract.GroupsColumns -kotlin.reflect.KDeclarationContainer -kotlin.reflect.KFunction -kotlin.reflect.KMutableProperty.Setter -kotlin.reflect.KMutableProperty -kotlin.reflect.KMutableProperty0.Setter -kotlin.reflect.KMutableProperty0 -kotlin.reflect.KMutableProperty1.Setter -android.provider.Contacts.PhotosColumns -kotlin.reflect.KMutableProperty1 -kotlin.reflect.KMutableProperty2.Setter -kotlin.reflect.KMutableProperty2 -kotlin.reflect.KParameter -kotlin.reflect.KProperty.Accessor -android.provider.ContactsContract.FullNameStyle -kotlin.reflect.KProperty.Getter -kotlin.reflect.KProperty -android.provider.CalendarContract.ExtendedPropertiesColumns -kotlin.reflect.KProperty0.Getter -kotlin.reflect.KProperty0 -kotlin.reflect.KProperty1.Getter -kotlin.reflect.KProperty1 -kotlin.reflect.KProperty2.Getter -kotlin.reflect.KProperty2 -android.provider.MediaStore.Files.FileColumns -kotlin.reflect.KType -kotlin.reflect.KTypeParameter -android.provider.MediaStore.Audio.GenresColumns -android.provider.Contacts.SettingsColumns -kotlin.reflect.TypeImpl -android.provider.CalendarContract.CalendarColumns -android.provider.CalendarContract.EventsColumns -android.provider.Telephony.BaseMmsColumns -android.provider.ContactsContract.PresenceColumns -android.provider.ContactsContract.ContactNameColumns -android.provider.ContactsContract.DataColumns -kotlin.sequences.DropTakeSequence -android.provider.ContactsContract.RawContactsColumns -android.provider.Contacts.GroupsColumns -android.provider.Contacts.ContactMethodsColumns -android.provider.Telephony.ThreadsColumns -android.provider.ContactsContract.SettingsColumns -android.provider.CalendarContract.AttendeesColumns -android.provider.ContactsContract.BaseSyncColumns -kotlin.sequences.Sequence -android.provider.MediaStore.Audio.PlaylistsColumns -android.provider.CalendarContract.SyncColumns -android.provider.Telephony.CanonicalAddressesColumns -android.provider.CalendarContract.CalendarAlertsColumns -android.provider.Contacts.PresenceColumns -android.provider.MediaStore.Audio.AlbumColumns -android.os.Parcelable.ClassLoaderCreator -android.os.IInterface -android.os.OutcomeReceiver -android.os.Parcelable.Creator -android.os.IBinder.DeathRecipient -android.os.MessageQueue.OnFileDescriptorEventListener -android.os.StrictMode.OnThreadViolationListener -android.os.PowerManager.OnThermalStatusChangedListener -android.os.RecoverySystem.ProgressListener -android.os.FileUtils.ProgressListener -android.os.ParcelFileDescriptor.OnCloseListener -android.os.MessageQueue.IdleHandler -android.os.StrictMode.OnVmViolationListener -android.os.CancellationSignal.OnCancelListener -android.os.Handler.Callback -android.os.IBinder -android.os.Parcelable -kotlin.text.FlagEnum -kotlin.text.MatchGroupCollection -kotlin.text.MatchNamedGroupCollection -kotlin.text.MatchResult -android.content.DialogInterface.OnCancelListener -android.content.DialogInterface.OnShowListener -android.content.DialogInterface.OnClickListener -android.content.DialogInterface.OnDismissListener -android.content.ContentProvider.PipeDataWriter -android.content.pm.PackageManager.OnChecksumsReadyListener -android.content.IntentSender.OnFinished -android.content.ClipboardManager.OnPrimaryClipChangedListener -android.content.DialogInterface.OnKeyListener -android.content.DialogInterface -android.content.DialogInterface.OnMultiChoiceClickListener -android.content.EntityIterator -android.content.ComponentCallbacks -android.content.SharedPreferences -android.content.Loader.OnLoadCanceledListener -android.content.ComponentCallbacks2 -android.content.ServiceConnection -kotlin.time.ExperimentalTime -android.content.SharedPreferences.Editor -kotlin.time.TimeSource -android.content.Loader.OnLoadCompleteListener -android.content.res.XmlResourceParser -android.content.res.loader.AssetsProvider -android.content.SyncStatusObserver -android.content.SharedPreferences.OnSharedPreferenceChangeListener -android.drm.DrmManagerClient.OnInfoListener -android.drm.DrmManagerClient.OnEventListener -android.drm.DrmStore.ConstraintsColumns -android.drm.DrmManagerClient.OnErrorListener -android.util.Printer -android.util.AttributeSet -android.media.MediaPlayer.OnCompletionListener -android.media.MediaCodec.OnFirstTunnelFrameReadyListener -android.media.MediaScannerConnection.OnScanCompletedListener -android.media.VolumeAutomation -android.media.AudioMetadata.Key -android.media.AudioTrack.OnRoutingChangedListener -android.media.MediaDrm.HdcpLevel -android.media.ImageWriter.OnImageReleasedListener -android.media.MediaSync.OnErrorListener -android.media.RemoteControlClient.OnGetPlaybackPositionListener -android.media.MediaPlayer.OnVideoSizeChangedListener -android.media.session.MediaSessionManager.OnSession2TokensChangedListener -android.media.session.MediaSessionManager.OnActiveSessionsChangedListener -android.media.MediaParser.SeekableInputReader -android.media.MediaDrm.OnExpirationUpdateListener -android.media.MediaCas.EventListener -android.media.RemoteControlClient.OnPlaybackPositionUpdateListener -android.media.MediaPlayer.OnErrorListener -android.media.AudioManager.OnModeChangedListener -android.media.MediaDrm.OnSessionLostStateListener -android.media.AudioRecord.OnRecordPositionUpdateListener -android.media.MediaRecorder.OnErrorListener -android.media.MediaPlayer.OnSubtitleDataListener -android.media.MediaDrm.SecurityLevel -android.media.MediaPlayer.OnPreparedListener -android.media.effect.EffectUpdateListener -android.media.ImageReader.OnImageAvailableListener -android.media.MediaPlayer.OnDrmInfoListener -android.media.AudioTrack.OnPlaybackPositionUpdateListener -android.media.tv.TvView.OnUnhandledInputEventListener -android.media.tv.TvContract.BaseTvColumns -android.media.MediaPlayer.OnDrmPreparedListener -android.media.MediaRouter2.OnGetControllerHintsListener -android.media.RemoteControlClient.OnMetadataUpdateListener -android.media.AudioRouting.OnRoutingChangedListener -android.media.MediaPlayer.OnSeekCompleteListener -android.media.MicrophoneDirection -android.media.AudioTrack.OnCodecFormatChangedListener -android.media.MediaParser.InputReader -android.media.AudioManager.OnAudioFocusChangeListener -android.media.MediaPlayer.OnBufferingUpdateListener -android.media.RemoteController.OnClientUpdateListener -android.media.MediaPlayer.OnMediaTimeDiscontinuityListener -android.media.SoundPool.OnLoadCompleteListener -android.media.MediaDrm.OnEventListener -android.media.MediaPlayer.OnTimedTextListener -android.media.AudioMetadataReadMap -android.media.JetPlayer.OnJetEventListener -android.media.MediaCodec.OnFrameRenderedListener -android.media.AudioRouting -android.media.MediaPlayer.OnDrmConfigHelper -android.media.MediaParser.OutputConsumer -android.media.AudioManager.OnCommunicationDeviceChangedListener -android.media.MediaDrm.OnKeyStatusChangeListener -android.media.MediaScannerConnection.MediaScannerConnectionClient -android.media.midi.MidiManager.OnDeviceOpenedListener -android.media.MediaPlayer.OnTimedMetaDataAvailableListener -android.media.AudioRecordingMonitor -android.media.AudioMetadataMap -android.media.AudioRecord.OnRoutingChangedListener -android.media.MediaRecorder.OnInfoListener -android.media.MediaPlayer.OnInfoListener -android.media.audiofx.AudioEffect.OnEnableStatusChangeListener -android.media.audiofx.Visualizer.OnDataCaptureListener -android.media.audiofx.Virtualizer.OnParameterChangeListener -android.media.audiofx.AudioEffect.OnControlStatusChangeListener -android.media.audiofx.EnvironmentalReverb.OnParameterChangeListener -android.media.audiofx.Equalizer.OnParameterChangeListener -android.media.audiofx.BassBoost.OnParameterChangeListener -android.media.audiofx.PresetReverb.OnParameterChangeListener -android.graphics.SurfaceTexture.OnFrameAvailableListener -android.graphics.drawable.Icon.OnDrawableLoadedListener -android.graphics.drawable.Animatable2 -android.graphics.drawable.Drawable.Callback -android.graphics.drawable.Animatable -android.graphics.PostProcessor -android.graphics.ImageDecoder.OnHeaderDecodedListener -android.graphics.ImageDecoder.OnPartialImageListener -android.gesture.GestureOverlayView.OnGesturePerformedListener -android.gesture.GestureOverlayView.OnGestureListener -android.gesture.GestureOverlayView.OnGesturingListener -android.annotation.Nullable -android.annotation.TargetApi -android.annotation.NonNull -android.annotation.SuppressLint -android.location.GpsStatus.Listener -android.location.GnssAntennaInfo.Listener -android.location.LocationListener -android.location.GpsStatus.NmeaListener -android.location.OnNmeaMessageListener -android.icu.lang.UCharacterEnums.ECharacterCategory -android.icu.lang.UCharacterEnums.ECharacterDirection -android.icu.lang.UCharacter.SentenceBreak -android.icu.lang.UCharacter.JoiningGroup -android.icu.lang.UCharacter.EastAsianWidth -android.icu.lang.UProperty.NameChoice -android.icu.lang.UCharacter.LineBreak -android.icu.lang.UCharacter.JoiningType -android.icu.lang.UCharacter.VerticalOrientation -android.icu.lang.UCharacter.BidiPairedBracketType -android.icu.lang.UCharacter.HangulSyllableType -android.icu.lang.UCharacter.NumericType -android.icu.lang.UCharacter.DecompositionType -android.icu.lang.UCharacter.WordBreak -android.icu.lang.UCharacter.IndicSyllabicCategory -android.icu.lang.UProperty -android.icu.lang.UCharacter.IndicPositionalCategory -android.icu.lang.UCharacter.GraphemeClusterBreak -android.icu.text.SymbolTable -android.icu.text.Collator.ReorderCodes -android.icu.text.UnicodeMatcher -android.icu.text.Replaceable -android.icu.text.FormattedValue -android.icu.util.Freezable -android.icu.util.ValueIterator -android.icu.util.RangeValueIterator -android.net.DnsResolver.Callback -android.net.wifi.WifiManager.SuggestionUserApprovalStatusListener -android.net.wifi.WifiManager.SuggestionConnectionStatusListener -android.net.wifi.p2p.WifiP2pManager.DnsSdServiceResponseListener -android.net.wifi.p2p.WifiP2pManager.P2pStateListener -android.net.wifi.p2p.WifiP2pManager.UpnpServiceResponseListener -android.net.wifi.p2p.WifiP2pManager.DnsSdTxtRecordListener -android.net.wifi.p2p.WifiP2pManager.ActionListener -android.net.wifi.p2p.WifiP2pManager.DeviceInfoListener -android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener -android.net.wifi.p2p.WifiP2pManager.ChannelListener -android.net.wifi.p2p.WifiP2pManager.GroupInfoListener -android.net.wifi.p2p.WifiP2pManager.PeerListListener -android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener -android.net.wifi.p2p.WifiP2pManager.ServiceResponseListener -android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener -android.net.sip.SipRegistrationListener -android.net.UrlQuerySanitizer.ValueSanitizer -android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4Address -android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv6DnsServer -android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv6Address -android.net.ipsec.ike.ChildSessionCallback -android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4DhcpServer -android.net.ipsec.ike.IkeSessionCallback -android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4DnsServer -android.net.ipsec.ike.TunnelModeChildSessionParams.TunnelModeChildConfigRequest -android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequestIpv4Netmask -android.net.ConnectivityManager.OnNetworkActiveListener -android.net.TransportInfo -android.net.nsd.NsdManager.DiscoveryListener -android.net.nsd.NsdManager.ResolveListener -android.net.nsd.NsdManager.RegistrationListener -android.telephony.ims.RegistrationManager -android.telephony.TelephonyCallback.DataActivationStateListener -android.telephony.TelephonyCallback.CellLocationListener -android.telephony.TelephonyCallback.UserMobileDataStateListener -android.telephony.TelephonyCallback.PreciseDataConnectionStateListener -android.telephony.TelephonyCallback.DisplayInfoListener -android.telephony.TelephonyCallback.CellInfoListener -android.telephony.TelephonyCallback.MessageWaitingIndicatorListener -android.telephony.TelephonyCallback.CarrierNetworkListener -android.telephony.TelephonyCallback.DataActivityListener -android.telephony.TelephonyCallback.RegistrationFailedListener -android.telephony.mbms.GroupCallCallback -android.telephony.mbms.MbmsGroupCallSessionCallback -android.telephony.TelephonyCallback.PhysicalChannelConfigListener -android.telephony.TelephonyCallback.ImsCallDisconnectCauseListener -android.telephony.TelephonyCallback.ActiveDataSubscriptionIdListener -android.telephony.TelephonyCallback.SignalStrengthsListener -android.telephony.TelephonyCallback.CallForwardingIndicatorListener -android.telephony.TelephonyCallback.CallStateListener -android.telephony.TelephonyCallback.BarringInfoListener -android.telephony.TelephonyCallback.DataConnectionStateListener -android.telephony.TelephonyCallback.EmergencyNumberListListener -android.telephony.TelephonyCallback.CallDisconnectCauseListener -android.telephony.TelephonyCallback.ServiceStateListener -android.security.KeyChainAliasCallback -android.view.View.OnUnhandledKeyEventListener -android.view.GestureDetector.OnGestureListener -android.view.Window.Callback -android.view.View.OnGenericMotionListener -android.view.View.OnScrollChangeListener -android.view.textclassifier.TextClassifier -android.view.textclassifier.TextClassificationSessionFactory -android.view.Window.OnFrameMetricsAvailableListener -android.view.View.OnAttachStateChangeListener -android.view.GestureDetector.OnDoubleTapListener -android.view.View.OnSystemUiVisibilityChangeListener -android.view.MenuItem.OnMenuItemClickListener -android.view.TextureView.SurfaceTextureListener -android.view.ViewDebug.ExportedProperty -android.view.View.OnCreateContextMenuListener -android.view.ContextMenu.ContextMenuInfo -android.view.textservice.SpellCheckerSession.SpellCheckerSessionListener -android.view.ViewStub.OnInflateListener -android.view.ScrollCaptureCallback -android.view.ViewDebug.CapturedViewProperty -android.view.View.OnCapturedPointerListener -android.view.SurfaceHolder -android.view.WindowInsetsController -android.view.AttachedSurfaceControl -android.view.InputQueue.Callback -android.view.ViewDebug.IntToString -android.view.View.OnClickListener -android.view.ViewTreeObserver.OnGlobalFocusChangeListener -android.view.ActionMode.Callback -android.view.Window.OnRestrictedCaptionAreaChangedListener -android.view.WindowInsetsAnimationControlListener -android.view.ViewTreeObserver.OnGlobalLayoutListener -android.view.ActionProvider.VisibilityListener -android.view.inspector.PropertyReader -android.view.inspector.PropertyMapper -android.view.inspector.InspectionCompanion -android.view.inspector.InspectionCompanionProvider -android.view.Menu -android.view.WindowInsetsAnimationController -android.view.ViewManager -android.view.ContextMenu -android.view.KeyEvent.Callback -android.view.LayoutInflater.Filter -android.view.ViewTreeObserver.OnWindowAttachListener -android.view.ScaleGestureDetector.OnScaleGestureListener -android.view.ViewTreeObserver.OnDrawListener -android.view.WindowManager -android.view.WindowInsetsController.OnControllableInsetsChangedListener -android.view.SurfaceHolder.Callback2 -android.view.contentcapture.DataShareWriteAdapter -android.view.View.OnKeyListener -android.view.ViewTreeObserver.OnPreDrawListener -android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener -android.view.accessibility.AccessibilityEventSource -android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener -android.view.SubMenu -android.view.View.OnHoverListener -android.view.displayhash.DisplayHashResultCallback -android.view.ViewGroup.OnHierarchyChangeListener -android.view.ViewParent -android.view.View.OnLayoutChangeListener -android.view.LayoutInflater.Factory2 -android.view.ViewDebug.FlagToString -android.view.SurfaceHolder.Callback -android.view.GestureDetector.OnContextClickListener -android.view.View.OnLongClickListener -android.view.ViewTreeObserver.OnWindowFocusChangeListener -android.view.View.OnTouchListener -android.view.MenuItem -android.view.Choreographer.FrameCallback -android.view.View.OnContextClickListener -android.view.translation.UiTranslationStateCallback -android.view.translation.ViewTranslationCallback -android.view.ViewTreeObserver.OnTouchModeChangeListener -android.view.View.OnApplyWindowInsetsListener -android.view.animation.Interpolator -android.view.animation.Animation.AnimationListener -android.view.PixelCopy.OnPixelCopyFinishedListener -android.view.OnReceiveContentListener -android.view.inputmethod.InputConnection -android.view.inputmethod.InputMethod -android.view.inputmethod.InputMethodSession -android.view.inputmethod.InputMethodSession.EventCallback -android.view.inputmethod.InputMethod.SessionCallback -android.view.View.OnFocusChangeListener -android.view.MenuItem.OnActionExpandListener -android.view.CollapsibleActionView -android.view.View.OnDragListener -android.view.LayoutInflater.Factory -android.view.ViewTreeObserver.OnScrollChangedListener -android.opengl.GLES32.DebugProc -android.opengl.GLSurfaceView.EGLWindowSurfaceFactory -android.opengl.GLES31Ext.DebugProcKHR -android.opengl.GLSurfaceView.EGLConfigChooser -android.opengl.GLSurfaceView.EGLContextFactory -android.opengl.GLSurfaceView.GLWrapper -android.opengl.GLSurfaceView.Renderer -android.widget.Filter.FilterListener -android.widget.AutoCompleteTextView.OnDismissListener -android.widget.SimpleCursorAdapter.CursorToStringConverter -android.widget.TimePicker.OnTimeChangedListener -android.widget.RemoteViewsService.RemoteViewsFactory -android.widget.RemoteViews.RemoteView -android.widget.WrapperListAdapter -android.widget.Checkable -android.widget.SimpleAdapter.ViewBinder -android.widget.Filterable -android.widget.ZoomButtonsController.OnZoomListener -android.widget.AbsListView.RecyclerListener -android.widget.TabHost.TabContentFactory -android.widget.SlidingDrawer.OnDrawerOpenListener -android.widget.ShareActionProvider.OnShareTargetSelectedListener -android.widget.PopupMenu.OnDismissListener -android.widget.DatePicker.OnDateChangedListener -android.widget.Advanceable -android.widget.NumberPicker.Formatter -android.widget.inline.InlineContentView.SurfaceControlCallback -android.widget.SectionIndexer -android.widget.PopupMenu.OnMenuItemClickListener -android.widget.Chronometer.OnChronometerTickListener -android.widget.Toolbar.OnMenuItemClickListener -android.widget.SlidingDrawer.OnDrawerCloseListener -android.widget.SearchView.OnQueryTextListener -android.widget.NumberPicker.OnValueChangeListener -android.widget.AbsListView.OnScrollListener -android.widget.MultiAutoCompleteTextView.Tokenizer -android.widget.SlidingDrawer.OnDrawerScrollListener -android.widget.ListAdapter -android.widget.AdapterView.OnItemSelectedListener -android.widget.ExpandableListView.OnGroupCollapseListener -android.widget.ExpandableListAdapter -android.widget.ExpandableListView.OnGroupClickListener -android.widget.TextView.OnEditorActionListener -android.widget.MediaController.MediaPlayerControl -android.widget.Adapter -android.widget.SpinnerAdapter -android.widget.AutoCompleteTextView.Validator -android.widget.AbsListView.MultiChoiceModeListener -android.widget.SearchView.OnCloseListener -android.widget.AbsListView.SelectionBoundsAdjuster -android.widget.ThemedSpinnerAdapter -android.widget.SeekBar.OnSeekBarChangeListener -android.widget.TabHost.OnTabChangeListener -android.widget.SimpleCursorAdapter.ViewBinder -android.widget.CalendarView.OnDateChangeListener -android.widget.AdapterView.OnItemLongClickListener -android.widget.ExpandableListView.OnGroupExpandListener -android.widget.CompoundButton.OnCheckedChangeListener -android.widget.RatingBar.OnRatingBarChangeListener -android.widget.RadioGroup.OnCheckedChangeListener -android.widget.PopupWindow.OnDismissListener -android.widget.AdapterView.OnItemClickListener -android.widget.HeterogeneousExpandableList -android.widget.SimpleCursorTreeAdapter.ViewBinder -android.widget.ViewSwitcher.ViewFactory -android.widget.ExpandableListView.OnChildClickListener -android.widget.FilterQueryProvider -android.widget.SearchView.OnSuggestionListener -android.widget.NumberPicker.OnScrollListener -android.widget.ActionMenuView.OnMenuItemClickListener -android.inputmethodservice.KeyboardView.OnKeyboardActionListener -android.sax.EndElementListener -android.sax.EndTextElementListener -android.sax.StartElementListener -android.sax.TextElementListener -android.sax.ElementListener -android.animation.Animator.AnimatorListener -android.animation.TimeInterpolator -android.animation.TimeAnimator.TimeListener -android.animation.TypeEvaluator -android.animation.Animator.AnimatorPauseListener -android.animation.LayoutTransition.TransitionListener -android.animation.ValueAnimator.AnimatorUpdateListener -androidx.annotation.RecentlyNullable -androidx.annotation.RecentlyNonNull -dalvik.bytecode.Opcodes -dalvik.annotation.TestTarget -dalvik.annotation.TestTargetClass -java.nio.channels.WritableByteChannel -java.nio.channels.CompletionHandler -java.nio.channels.InterruptibleChannel -java.nio.channels.SeekableByteChannel -java.nio.channels.ReadableByteChannel -java.nio.channels.AsynchronousChannel -java.nio.channels.GatheringByteChannel -java.nio.channels.ScatteringByteChannel -java.nio.channels.ByteChannel -java.nio.channels.Channel -java.nio.channels.MulticastChannel -java.nio.channels.NetworkChannel -java.nio.channels.AsynchronousByteChannel -java.nio.file.FileVisitor -java.nio.file.OpenOption -java.nio.file.SecureDirectoryStream -java.nio.file.DirectoryStream -java.nio.file.DirectoryStream.Filter -java.nio.file.WatchService -java.nio.file.WatchEvent.Kind -java.nio.file.Watchable -java.nio.file.Path -java.nio.file.WatchEvent.Modifier -java.nio.file.WatchEvent -java.nio.file.attribute.UserDefinedFileAttributeView -java.nio.file.attribute.BasicFileAttributes -java.nio.file.attribute.GroupPrincipal -java.nio.file.attribute.UserPrincipal -java.nio.file.attribute.DosFileAttributeView -java.nio.file.attribute.BasicFileAttributeView -java.nio.file.attribute.AclFileAttributeView -java.nio.file.attribute.FileStoreAttributeView -java.nio.file.attribute.PosixFileAttributes -java.nio.file.attribute.FileOwnerAttributeView -java.nio.file.attribute.FileAttributeView -java.nio.file.attribute.AttributeView -java.nio.file.attribute.FileAttribute -java.nio.file.attribute.PosixFileAttributeView -java.nio.file.attribute.DosFileAttributes -java.nio.file.PathMatcher -java.nio.file.WatchKey -java.nio.file.CopyOption -java.lang.AutoCloseable -java.lang.reflect.Member -java.lang.reflect.TypeVariable -java.lang.reflect.ParameterizedType -java.lang.reflect.WildcardType -java.lang.reflect.Type -java.lang.reflect.GenericDeclaration -java.lang.reflect.GenericArrayType -java.lang.reflect.AnnotatedElement -java.lang.reflect.InvocationHandler -java.lang.invoke.MethodHandleInfo -java.lang.Comparable -java.lang.SuppressWarnings -java.lang.SafeVarargs -java.lang.Runnable -java.lang.annotation.Repeatable -java.lang.annotation.Native -java.lang.annotation.Target -java.lang.annotation.Documented -java.lang.annotation.Retention -java.lang.annotation.Annotation -java.lang.annotation.Inherited -java.lang.Iterable -java.lang.Deprecated -java.lang.Appendable -java.lang.Cloneable -java.lang.Thread.UncaughtExceptionHandler -java.lang.CharSequence -java.lang.Readable -java.lang.Override -java.lang.FunctionalInterface -java.text.AttributedCharacterIterator -java.text.CharacterIterator -java.io.ObjectInput -java.io.ObjectOutput -java.io.Closeable -java.io.DataOutput -java.io.ObjectStreamConstants -java.io.FileFilter -java.io.ObjectInputValidation -java.io.Serializable -java.io.Externalizable -java.io.Flushable -java.io.FilenameFilter -java.io.DataInput -java.beans.PropertyChangeListener -java.util.Set -java.util.prefs.PreferenceChangeListener -java.util.prefs.PreferencesFactory -java.util.prefs.NodeChangeListener -java.util.concurrent.locks.ReadWriteLock -java.util.concurrent.locks.Lock -java.util.concurrent.locks.Condition -java.util.concurrent.TransferQueue -java.util.concurrent.Flow.Publisher -java.util.concurrent.Future -java.util.concurrent.Delayed -java.util.concurrent.BlockingDeque -java.util.concurrent.Flow.Processor -java.util.concurrent.Flow.Subscriber -java.util.concurrent.RunnableScheduledFuture -java.util.concurrent.ConcurrentNavigableMap -java.util.concurrent.ScheduledExecutorService -java.util.concurrent.ForkJoinPool.ForkJoinWorkerThreadFactory -java.util.concurrent.ThreadFactory -java.util.concurrent.ConcurrentMap -java.util.concurrent.CompletionStage -java.util.concurrent.RunnableFuture -java.util.concurrent.ForkJoinPool.ManagedBlocker -java.util.concurrent.ExecutorService -java.util.concurrent.ScheduledFuture -java.util.concurrent.Flow.Subscription -java.util.concurrent.RejectedExecutionHandler -java.util.concurrent.CompletionService -java.util.concurrent.Callable -java.util.concurrent.Executor -java.util.concurrent.CompletableFuture.AsynchronousCompletionTask -java.util.concurrent.BlockingQueue -java.util.NavigableMap -java.util.jar.Pack200.Unpacker -java.util.jar.Pack200.Packer -java.util.function.ToIntBiFunction -java.util.function.ToDoubleBiFunction -java.util.function.DoubleFunction -java.util.function.ObjLongConsumer -java.util.function.BinaryOperator -java.util.function.LongBinaryOperator -java.util.function.IntToLongFunction -java.util.function.BooleanSupplier -java.util.function.LongFunction -java.util.function.DoubleSupplier -java.util.function.BiConsumer -java.util.function.Predicate -java.util.function.LongUnaryOperator -java.util.function.BiPredicate -java.util.function.DoubleConsumer -java.util.function.DoubleToLongFunction -java.util.function.ObjDoubleConsumer -java.util.function.DoublePredicate -java.util.function.LongConsumer -java.util.function.Function -java.util.function.Supplier -java.util.function.DoubleBinaryOperator -java.util.function.ToDoubleFunction -java.util.function.IntToDoubleFunction -java.util.function.IntConsumer -java.util.function.UnaryOperator -java.util.function.ToLongBiFunction -java.util.function.IntBinaryOperator -java.util.function.LongToIntFunction -java.util.function.IntPredicate -java.util.function.IntUnaryOperator -java.util.function.ObjIntConsumer -java.util.function.IntFunction -java.util.function.BiFunction -java.util.function.Consumer -java.util.function.DoubleToIntFunction -java.util.function.ToLongFunction -java.util.function.DoubleUnaryOperator -java.util.function.IntSupplier -java.util.function.LongToDoubleFunction -java.util.function.ToIntFunction -java.util.function.LongPredicate -java.util.function.LongSupplier -java.util.PrimitiveIterator -java.util.Formattable -java.util.stream.Stream -java.util.stream.IntStream.Builder -java.util.stream.LongStream -java.util.stream.Collector -java.util.stream.DoubleStream -java.util.stream.Stream.Builder -java.util.stream.IntStream -java.util.stream.BaseStream -java.util.stream.LongStream.Builder -java.util.stream.DoubleStream.Builder -java.util.Deque -java.util.zip.Checksum -java.util.Observer -java.util.NavigableSet -java.util.regex.MatchResult -java.util.SortedMap -java.util.List -java.util.PrimitiveIterator.OfInt -java.util.logging.Filter -java.util.logging.LoggingMXBean -java.util.Enumeration -java.util.Spliterator -java.util.RandomAccess -java.util.PrimitiveIterator.OfLong -java.util.Queue -java.util.Spliterator.OfLong -java.util.Collection -java.util.SortedSet -java.util.Spliterator.OfPrimitive -java.util.Map -java.util.Iterator -java.util.EventListener -java.util.PrimitiveIterator.OfDouble -java.util.Spliterator.OfInt -java.util.Spliterator.OfDouble -java.util.ListIterator -java.util.Map.Entry -java.util.Comparator -java.time.temporal.TemporalField -java.time.temporal.TemporalQuery -java.time.temporal.TemporalAmount -java.time.temporal.TemporalUnit -java.time.temporal.Temporal -java.time.temporal.TemporalAdjuster -java.time.temporal.TemporalAccessor -java.time.chrono.ChronoPeriod -java.time.chrono.ChronoZonedDateTime -java.time.chrono.Era -java.time.chrono.ChronoLocalDateTime -java.time.chrono.Chronology -java.time.chrono.ChronoLocalDate -java.net.DatagramSocketImplFactory -java.net.SocketImplFactory -java.net.FileNameMap -java.net.ProtocolFamily -java.net.URLStreamHandlerFactory -java.net.SocketOption -java.net.CookiePolicy -java.net.ContentHandlerFactory -java.net.CookieStore -java.net.SocketOptions -java.security.KeyStore.LoadStoreParameter -java.security.Key -java.security.Certificate -java.security.Guard -java.security.spec.KeySpec -java.security.spec.ECField -java.security.spec.AlgorithmParameterSpec -java.security.PublicKey -java.security.KeyStore.ProtectionParameter -java.security.KeyStore.Entry -java.security.interfaces.DSAPrivateKey -java.security.interfaces.RSAKey -java.security.interfaces.ECPublicKey -java.security.interfaces.RSAPrivateCrtKey -java.security.interfaces.ECKey -java.security.interfaces.DSAParams -java.security.interfaces.RSAPublicKey -java.security.interfaces.ECPrivateKey -java.security.interfaces.RSAPrivateKey -java.security.interfaces.DSAKeyPairGenerator -java.security.interfaces.DSAKey -java.security.interfaces.DSAPublicKey -java.security.interfaces.RSAMultiPrimePrivateCrtKey -java.security.Principal -java.security.AlgorithmConstraints -java.security.cert.CRLSelector -java.security.cert.CertStoreParameters -java.security.cert.CertPathValidatorException.Reason -java.security.cert.CertPathParameters -java.security.cert.CertPathValidatorResult -java.security.cert.CertPathBuilderResult -java.security.cert.CertSelector -java.security.cert.PolicyNode -java.security.cert.Extension -java.security.cert.X509Extension -java.security.cert.CertPathChecker -java.security.acl.AclEntry -java.security.acl.Owner -java.security.acl.Group -java.security.acl.Permission -java.security.acl.Acl -java.security.KeyStore.Entry.Attribute -java.security.Policy.Parameters -java.security.PrivilegedExceptionAction -java.security.PrivateKey -java.security.PrivilegedAction -java.security.DomainCombiner -java.sql.RowId -java.sql.SQLData -java.sql.SQLXML -java.sql.NClob -java.sql.Statement -java.sql.Blob -java.sql.CallableStatement -java.sql.DatabaseMetaData -java.sql.SQLOutput -java.sql.Connection -java.sql.Array -java.sql.Ref -java.sql.PreparedStatement -java.sql.Struct -java.sql.Wrapper -java.sql.ParameterMetaData -java.sql.SQLInput -java.sql.Clob -java.sql.Savepoint -java.sql.Driver -java.sql.ResultSet -java.sql.ResultSetMetaData -javax.microedition.khronos.opengles.GL10Ext -javax.microedition.khronos.opengles.GL11Ext -javax.microedition.khronos.opengles.GL11 -javax.microedition.khronos.opengles.GL -javax.microedition.khronos.opengles.GL11ExtensionPack -javax.microedition.khronos.opengles.GL10 -javax.microedition.khronos.egl.EGL11 -javax.microedition.khronos.egl.EGL -javax.microedition.khronos.egl.EGL10 -javax.crypto.interfaces.DHPublicKey -javax.crypto.interfaces.DHPrivateKey -javax.crypto.interfaces.PBEKey -javax.crypto.interfaces.DHKey -javax.crypto.SecretKey -javax.xml.transform.Source -javax.xml.transform.URIResolver -javax.xml.transform.SourceLocator -javax.xml.transform.Result -javax.xml.transform.Templates -javax.xml.transform.ErrorListener -javax.xml.transform.sax.TemplatesHandler -javax.xml.transform.sax.TransformerHandler -javax.xml.transform.dom.DOMLocator -javax.xml.xpath.XPathExpression -javax.xml.xpath.XPath -javax.xml.xpath.XPathVariableResolver -javax.xml.xpath.XPathFunction -javax.xml.xpath.XPathFunctionResolver -javax.xml.namespace.NamespaceContext -javax.net.ssl.X509TrustManager -javax.net.ssl.X509KeyManager -javax.net.ssl.SSLSession -javax.net.ssl.HandshakeCompletedListener -javax.net.ssl.KeyManager -javax.net.ssl.SSLSessionContext -javax.net.ssl.SSLSessionBindingListener -javax.net.ssl.HostnameVerifier -javax.net.ssl.TrustManager -javax.net.ssl.ManagerFactoryParameters -javax.security.auth.Destroyable -javax.security.auth.callback.Callback -javax.security.auth.callback.CallbackHandler -javax.sql.DataSource -javax.sql.RowSetListener -javax.sql.StatementEventListener -javax.sql.RowSetWriter -javax.sql.RowSet -javax.sql.RowSetMetaData -javax.sql.RowSetReader -javax.sql.ConnectionPoolDataSource -javax.sql.ConnectionEventListener -javax.sql.CommonDataSource -javax.sql.RowSetInternal -javax.sql.PooledConnection -org.apache.http.params.HttpParams -org.apache.http.params.CoreConnectionPNames -org.apache.http.conn.ssl.X509HostnameVerifier -org.apache.http.conn.scheme.HostNameResolver -org.apache.http.conn.scheme.SocketFactory -org.apache.http.conn.scheme.LayeredSocketFactory -org.xmlpull.v1.XmlSerializer -org.xmlpull.v1.XmlPullParser -org.xml.sax.ErrorHandler -org.xml.sax.Locator -org.xml.sax.AttributeList -org.xml.sax.DocumentHandler -org.xml.sax.DTDHandler -org.xml.sax.XMLFilter -org.xml.sax.XMLReader -org.xml.sax.Parser -org.xml.sax.Attributes -org.xml.sax.ContentHandler -org.xml.sax.EntityResolver -org.xml.sax.ext.LexicalHandler -org.xml.sax.ext.Attributes2 -org.xml.sax.ext.DeclHandler -org.xml.sax.ext.EntityResolver2 -org.xml.sax.ext.Locator2 -org.w3c.dom.DOMStringList -org.w3c.dom.TypeInfo -org.w3c.dom.ProcessingInstruction -org.w3c.dom.Text -org.w3c.dom.NamedNodeMap -org.w3c.dom.EntityReference -org.w3c.dom.Document -org.w3c.dom.Notation -org.w3c.dom.NameList -org.w3c.dom.NodeList -org.w3c.dom.Entity -org.w3c.dom.UserDataHandler -org.w3c.dom.ls.LSInput -org.w3c.dom.ls.LSParser -org.w3c.dom.ls.LSOutput -org.w3c.dom.ls.LSSerializer -org.w3c.dom.ls.DOMImplementationLS -org.w3c.dom.ls.LSParserFilter -org.w3c.dom.ls.LSResourceResolver -org.w3c.dom.Node -org.w3c.dom.Attr -org.w3c.dom.Comment -org.w3c.dom.CDATASection -org.w3c.dom.DOMImplementationList -org.w3c.dom.DOMError -org.w3c.dom.CharacterData -org.w3c.dom.DOMImplementation -org.w3c.dom.DOMConfiguration -org.w3c.dom.DocumentType -org.w3c.dom.Element -org.w3c.dom.DOMLocator -org.w3c.dom.DOMImplementationSource -org.w3c.dom.DocumentFragment -org.w3c.dom.DOMErrorHandler diff --git a/test-app/gradle.properties b/test-app/gradle.properties index ee7d6d67b..7ef2d5561 100644 --- a/test-app/gradle.properties +++ b/test-app/gradle.properties @@ -20,8 +20,8 @@ android.enableJetifier=true android.useAndroidX=true # Default versions used throughout the gradle configurations -NS_DEFAULT_BUILD_TOOLS_VERSION=32.0.0 -NS_DEFAULT_COMPILE_SDK_VERSION=32 +NS_DEFAULT_BUILD_TOOLS_VERSION=33.0.0 +NS_DEFAULT_COMPILE_SDK_VERSION=33 NS_DEFAULT_MIN_SDK_VERSION=17 NS_DEFAULT_ANDROID_BUILD_TOOLS_VERSION=7.3.0 diff --git a/test-app/runtime/CMakeLists.txt b/test-app/runtime/CMakeLists.txt index f7d21d9dd..7ee5ac161 100644 --- a/test-app/runtime/CMakeLists.txt +++ b/test-app/runtime/CMakeLists.txt @@ -18,7 +18,7 @@ endif (CCACHE_FOUND AND (USE_CCACHE)) # "-DANDROID_STL=c++_static" is just not enough for clang++ to find some libraries in the ndk MESSAGE(STATUS "## ANDROID_NDK_ROOT: " ${ANDROID_NDK_ROOT}) -set(COMMON_CMAKE_ARGUMENTS "-nostdinc++ -std=c++14 -Werror -Wno-unused-result -mstackrealign -fexceptions -fno-builtin-stpcpy -fno-rtti -D_LIBCPP_ABI_VERSION=Cr -D_LIBCPP_ENABLE_NODISCARD -D_LIBCPP_ABI_UNSTABLE -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_EMBEDDED_BUILTINS") +set(COMMON_CMAKE_ARGUMENTS "-std=c++17 -Werror -Wno-unused-result -mstackrealign -fexceptions -fno-builtin-stpcpy -fno-rtti -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_EMBEDDED_BUILTINS") if("${ANDROID_ABI}" MATCHES "arm64-v8a$" OR "${ANDROID_ABI}" MATCHES "x86_64$") # Enable pointer compression on 64 bit platforms @@ -41,88 +41,42 @@ endif() # MESSAGE(STATUS "## Using default linker") #endif () +#add_library( v8_shared STATIC IMPORTED ) +#set_target_properties( v8_shared PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libv8android.so ) + # Command info: https://cmake.org/cmake/help/v3.4/command/include_directories.html include_directories( - # V8 uses a custom STL compiled with the LIBCPP_ABI_UNSTABLE flag. To maintain the ABI - # compatibility we use this same STL headers for building the runtime - src/main/cpp/include/libc++ - src/main/cpp - src/main/cpp/include - src/main/cpp/v8_inspector - # This folder contains V8's built-in natives and snapshot blobs - src/main/libs/${ANDROID_ABI}/include + # V8 uses a custom STL compiled with the LIBCPP_ABI_UNSTABLE flag. To maintain the ABI + # compatibility we use this same STL headers for building the runtime + src/main/cpp/include/libc++ + src/main/cpp + src/main/cpp/include + src/main/cpp/v8_inspector + # This folder contains V8's built-in natives and snapshot blobs + src/main/libs/${ANDROID_ABI}/include ) if (OPTIMIZED_BUILD OR OPTIMIZED_WITH_INSPECTOR_BUILD) set(CMAKE_CXX_FLAGS "${COMMON_CMAKE_ARGUMENTS} -O3 -fvisibility=hidden -ffunction-sections -fno-data-sections") else () set(CMAKE_CXX_FLAGS "${COMMON_CMAKE_ARGUMENTS} -g") +# set(CMAKE_CXX_FLAGS "${COMMON_CMAKE_ARGUMENTS} -O3 -fvisibility=hidden -ffunction-sections -fno-data-sections") endif () if (NOT OPTIMIZED_BUILD OR OPTIMIZED_WITH_INSPECTOR_BUILD) - # When building in Release mode we do not include the V8 inspector sources + # Debug builds will include the V8 inspector sources add_definitions(-DAPPLICATION_IN_DEBUG) set( INSPECTOR_SOURCES src/main/cpp/com_tns_AndroidJsV8Inspector.cpp - src/main/cpp/JsV8InspectorClient.cpp src/main/cpp/DOMDomainCallbackHandlers.cpp + src/main/cpp/JsV8InspectorClient.cpp src/main/cpp/NetworkDomainCallbackHandlers.cpp - src/main/cpp/NSV8DebuggerAgentImpl.cpp - - src/main/cpp/v8_inspector/src/inspector/protocol/CSS.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Console.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/DOM.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Debugger.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/HeapProfiler.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Log.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Network.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Overlay.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Page.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Profiler.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Protocol.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Runtime.cpp - src/main/cpp/v8_inspector/src/inspector/protocol/Schema.cpp - src/main/cpp/v8_inspector/src/inspector/utils/base64.cpp - src/main/cpp/v8_inspector/src/inspector/utils/v8-inspector-common.cpp - src/main/cpp/v8_inspector/src/inspector/utils/v8-network-request-data.cpp - src/main/cpp/v8_inspector/src/inspector/utils/v8-page-resources.cpp - src/main/cpp/v8_inspector/src/inspector/v8-css-agent-impl.cpp - src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp - src/main/cpp/v8_inspector/src/inspector/v8-log-agent-impl.cpp - src/main/cpp/v8_inspector/src/inspector/v8-network-agent-impl.cpp - src/main/cpp/v8_inspector/src/inspector/v8-overlay-agent-impl.cpp - src/main/cpp/v8_inspector/src/inspector/v8-page-agent-impl.cpp - - src/main/cpp/v8_inspector/src/inspector/custom-preview.cc - src/main/cpp/v8_inspector/src/inspector/injected-script.cc - src/main/cpp/v8_inspector/src/inspector/inspected-context.cc - src/main/cpp/v8_inspector/src/inspector/remote-object-id.cc - src/main/cpp/v8_inspector/src/inspector/search-util.cc - src/main/cpp/v8_inspector/src/inspector/string-16.cc - src/main/cpp/v8_inspector/src/inspector/string-util.cc - src/main/cpp/v8_inspector/src/inspector/v8-console.cc - src/main/cpp/v8_inspector/src/inspector/v8-console-agent-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-console-message.cc - src/main/cpp/v8_inspector/src/inspector/v8-debugger.cc - src/main/cpp/v8_inspector/src/inspector/v8-debugger-agent-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-debugger-script.cc - src/main/cpp/v8_inspector/src/inspector/v8-heap-profiler-agent-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-inspector-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-inspector-session-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-profiler-agent-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-regex.cc - src/main/cpp/v8_inspector/src/inspector/v8-runtime-agent-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-schema-agent-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-stack-trace-impl.cc - src/main/cpp/v8_inspector/src/inspector/v8-string-conversions.cc - src/main/cpp/v8_inspector/src/inspector/v8-value-utils.cc - src/main/cpp/v8_inspector/src/inspector/value-mirror.cc ) else () - # Debug builds will include the V8 inspector sources + # When building in Release mode we do not include the V8 inspector sources set(INSPECTOR_SOURCES) endif () @@ -130,73 +84,78 @@ endif () # Creates(shared static) and names a library given relative sources # Gradle automatically packages shared libraries with your APK. add_library( - # Sets the name of the library. When it's built you can find it with lib prefix libNativeScript.so - NativeScript - - # Sets the library as a shared library. - SHARED - - # Runtime source - src/main/cpp/ArgConverter.cpp - src/main/cpp/ArrayBufferHelper.cpp - src/main/cpp/ArrayElementAccessor.cpp - src/main/cpp/ArrayHelper.cpp - src/main/cpp/AssetExtractor.cpp - src/main/cpp/CallbackHandlers.cpp - src/main/cpp/Constants.cpp - src/main/cpp/DirectBuffer.cpp - src/main/cpp/FieldAccessor.cpp - src/main/cpp/File.cpp - src/main/cpp/IsolateDisposer.cpp - src/main/cpp/JEnv.cpp - src/main/cpp/DesugaredInterfaceCompanionClassNameResolver.cpp - src/main/cpp/JType.cpp - src/main/cpp/JniSignatureParser.cpp - src/main/cpp/JsArgConverter.cpp - src/main/cpp/JsArgToArrayConverter.cpp - src/main/cpp/JSONObjectHelper.cpp - src/main/cpp/Logger.cpp - src/main/cpp/ManualInstrumentation.cpp - src/main/cpp/MessageLoopTimer.cpp - src/main/cpp/MetadataMethodInfo.cpp - src/main/cpp/MetadataNode.cpp - src/main/cpp/MetadataReader.cpp - src/main/cpp/MetadataTreeNode.cpp - src/main/cpp/MethodCache.cpp - src/main/cpp/ModuleInternal.cpp - src/main/cpp/NativeScriptException.cpp - src/main/cpp/NumericCasts.cpp - src/main/cpp/ObjectManager.cpp - src/main/cpp/Profiler.cpp - src/main/cpp/ReadWriteLock.cpp - src/main/cpp/Runtime.cpp - src/main/cpp/SimpleAllocator.cpp - src/main/cpp/SimpleProfiler.cpp - src/main/cpp/Util.cpp - src/main/cpp/V8GlobalHelpers.cpp - src/main/cpp/V8StringConstants.cpp - src/main/cpp/WeakRef.cpp - src/main/cpp/com_tns_AssetExtractor.cpp - src/main/cpp/com_tns_Runtime.cpp - src/main/cpp/console/Console.cpp - - # V8 inspector source files will be included only in Release mode - ${INSPECTOR_SOURCES} + # Sets the name of the library. When it's built you can find it with lib prefix libNativeScript.so + NativeScript + + # Sets the library as a shared library. + SHARED + + # Runtime source + src/main/cpp/ArgConverter.cpp + src/main/cpp/ArrayBufferHelper.cpp + src/main/cpp/ArrayElementAccessor.cpp + src/main/cpp/ArrayHelper.cpp + src/main/cpp/AssetExtractor.cpp + src/main/cpp/CallbackHandlers.cpp + src/main/cpp/Constants.cpp + src/main/cpp/DirectBuffer.cpp + src/main/cpp/FieldAccessor.cpp + src/main/cpp/File.cpp + src/main/cpp/IsolateDisposer.cpp + src/main/cpp/JEnv.cpp + src/main/cpp/DesugaredInterfaceCompanionClassNameResolver.cpp + src/main/cpp/JType.cpp + src/main/cpp/JniSignatureParser.cpp + src/main/cpp/JsArgConverter.cpp + src/main/cpp/JsArgToArrayConverter.cpp + src/main/cpp/JSONObjectHelper.cpp + src/main/cpp/Logger.cpp + src/main/cpp/ManualInstrumentation.cpp + src/main/cpp/MessageLoopTimer.cpp + src/main/cpp/MetadataMethodInfo.cpp + src/main/cpp/MetadataNode.cpp + src/main/cpp/MetadataReader.cpp + src/main/cpp/MetadataTreeNode.cpp + src/main/cpp/MethodCache.cpp + src/main/cpp/ModuleInternal.cpp + src/main/cpp/NativeScriptException.cpp + src/main/cpp/NumericCasts.cpp + src/main/cpp/ObjectManager.cpp + src/main/cpp/Profiler.cpp + src/main/cpp/ReadWriteLock.cpp + src/main/cpp/Runtime.cpp + src/main/cpp/SimpleAllocator.cpp + src/main/cpp/SimpleProfiler.cpp + src/main/cpp/Util.cpp + src/main/cpp/V8GlobalHelpers.cpp + src/main/cpp/V8StringConstants.cpp + src/main/cpp/WeakRef.cpp + src/main/cpp/Timers.cpp + src/main/cpp/com_tns_AssetExtractor.cpp + src/main/cpp/com_tns_Runtime.cpp + src/main/cpp/console/Console.cpp + src/main/cpp/conversions/JSToJavaConverter.cpp + src/main/cpp/conversions/objects/JSToJavaObjectsConverter.cpp + src/main/cpp/conversions/arrays/JSToJavaArraysConverter.cpp + src/main/cpp/conversions/primitives/JSToJavaPrimitivesConverter.cpp + + # V8 inspector source files will be included only in Release mode + ${INSPECTOR_SOURCES} ) set(NATIVES_BLOB_INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/include) if (OPTIMIZED_BUILD OR OPTIMIZED_WITH_INSPECTOR_BUILD) set_target_properties( - NativeScript - PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition -Wl,--exclude-libs=ALL -Wl,--gc-sections - INTERFACE_INCLUDE_DIRECTORIES NATIVES_BLOB_INCLUDE_DIRECTORIES + NativeScript + PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition -Wl,--exclude-libs=ALL -Wl,--gc-sections + INTERFACE_INCLUDE_DIRECTORIES NATIVES_BLOB_INCLUDE_DIRECTORIES ) else () set_target_properties( - NativeScript - PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition - INTERFACE_INCLUDE_DIRECTORIES NATIVES_BLOB_INCLUDE_DIRECTORIES + NativeScript + PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition + INTERFACE_INCLUDE_DIRECTORIES NATIVES_BLOB_INCLUDE_DIRECTORIES ) endif () @@ -211,7 +170,7 @@ MESSAGE(STATUS "# CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS}) # Command info: https://cmake.org/cmake/help/v3.4/command/target_link_libraries.html # linking v8 and custom STL libraries to the runtime (NativeScript library) target_link_libraries(NativeScript ${PROJECT_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libzip.a) -target_link_libraries(NativeScript ${PROJECT_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libv8.a) +target_link_libraries(NativeScript ${PROJECT_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libv8_monolith.a) if("${ANDROID_ABI}" MATCHES "armeabi-v7a$" OR "${ANDROID_ABI}" MATCHES "x86$") # On API Level 19 and lower we need to link with android_support @@ -232,4 +191,4 @@ find_library(system-android android) # Command info: https://cmake.org/cmake/help/v3.4/command/target_link_libraries.html # Specifies libraries CMake should link to your target library. -target_link_libraries(NativeScript ${system-log} ${system-z} ${system-android}) +target_link_libraries(NativeScript ${system-log} ${system-z} ${system-android}) \ No newline at end of file diff --git a/test-app/runtime/CMakeLists.txt.bak b/test-app/runtime/CMakeLists.txt.bak new file mode 100644 index 000000000..b6b2121db --- /dev/null +++ b/test-app/runtime/CMakeLists.txt.bak @@ -0,0 +1,113 @@ +# documentation: https://d.android.com/studio/projects/add-native-code.html + +# Command info: https://cmake.org/cmake/help/v3.4/command/cmake_minimum_required.html +cmake_minimum_required(VERSION 3.10.2) + +project(NativeScriptAndroidRuntime) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-unused-result -DV8_COMPRESS_POINTERS -DV8_31BIT_SMIS_ON_64BIT_ARCH -DV8_USE_SNAPSHOT=false -DCMAKE_EXPORT_COMPILE_COMMANDS=ON") + +add_library( v8_base STATIC IMPORTED ) +set_target_properties( v8_base PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libv8android.so ) + +# Command info: https://cmake.org/cmake/help/v3.4/command/include_directories.html +include_directories( + src/main/cpp + src/main/cpp/include + src/main/cpp/v8_inspector + # This folder contains V8's built-in natives and snapshot blobs + src/main/libs/${ANDROID_ABI}/include +) + +set(CMAKE_CXX_FLAGS "-g") + +# TODO: remove hardcoded cpp files below +#file(GLOB SOURCES "src/*.h") +#add_library(native-lib SHARED ${SOURCES}) + +add_library( + NativeScript + + SHARED + + src/main/cpp/ArgConverter.cpp + src/main/cpp/ArrayBufferHelper.cpp + src/main/cpp/ArrayElementAccessor.cpp + src/main/cpp/ArrayHelper.cpp + src/main/cpp/AssetExtractor.cpp + src/main/cpp/CallbackHandlers.cpp + src/main/cpp/Constants.cpp + src/main/cpp/DirectBuffer.cpp + src/main/cpp/FieldAccessor.cpp + src/main/cpp/File.cpp + src/main/cpp/IsolateDisposer.cpp + src/main/cpp/JEnv.cpp + src/main/cpp/DesugaredInterfaceCompanionClassNameResolver.cpp + src/main/cpp/JType.cpp + src/main/cpp/JniSignatureParser.cpp + src/main/cpp/JsArgConverter.cpp + src/main/cpp/JsArgToArrayConverter.cpp + src/main/cpp/JSONObjectHelper.cpp + src/main/cpp/Logger.cpp + src/main/cpp/ManualInstrumentation.cpp + src/main/cpp/MessageLoopTimer.cpp + src/main/cpp/MetadataMethodInfo.cpp + src/main/cpp/MetadataNode.cpp + src/main/cpp/MetadataReader.cpp + src/main/cpp/MetadataTreeNode.cpp + src/main/cpp/MethodCache.cpp + src/main/cpp/ModuleInternal.cpp + src/main/cpp/NativeScriptException.cpp + src/main/cpp/NumericCasts.cpp + src/main/cpp/ObjectManager.cpp + src/main/cpp/Profiler.cpp + src/main/cpp/ReadWriteLock.cpp + src/main/cpp/Runtime.cpp + src/main/cpp/SimpleAllocator.cpp + src/main/cpp/SimpleProfiler.cpp + src/main/cpp/Util.cpp + src/main/cpp/V8GlobalHelpers.cpp + src/main/cpp/V8StringConstants.cpp + src/main/cpp/WeakRef.cpp + src/main/cpp/com_tns_AssetExtractor.cpp + src/main/cpp/com_tns_Runtime.cpp + src/main/cpp/console/Console.cpp +) + +target_include_directories( NativeScript PRIVATE ${CMAKE_SOURCE_DIR}/src/main/cpp/include ) + +set(NATIVES_BLOB_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/include) + +set_target_properties( + NativeScript + PROPERTIES LINK_FLAGS -Wl,--allow-multiple-definition -Wl,--exclude-libs=ALL -Wl,--gc-sections + INTERFACE_INCLUDE_DIRECTORIES NATIVES_BLOB_INCLUDE_DIRECTORIES +) + + +#find_library(system-log log) +#find_library(system-z z) +#find_library(system-android android) +#target_link_libraries(NativeScript ${system-log} ${system-z} ${system-android}) + +MESSAGE(WARNING "# PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR}) +target_link_libraries(NativeScript ${PROJECT_SOURCE_DIR}/src/main/libs/${ANDROID_ABI}/libzip.a) +target_link_libraries(NativeScript D:\\Work\\nativescript\\android-runtime\\test-app\\runtime\\src\\main\\libs\\x86_64\\libzip.a) + + +find_library( # Sets the name of the path variable. + log-lib + + # Specifies the name of the NDK library that + # you want CMake to locate. + log ) + +target_link_libraries( # Specifies the target library. + NativeScript + v8_base + # Links the target library to the log library + # included in the NDK. + ${log-lib} ) + +find_library(system-android android) +target_link_libraries(NativeScript ${system-android}) \ No newline at end of file diff --git a/test-app/runtime/build.gradle b/test-app/runtime/build.gradle index edd6c6953..dade178df 100644 --- a/test-app/runtime/build.gradle +++ b/test-app/runtime/build.gradle @@ -90,26 +90,29 @@ android { if (optimized) { arguments.add("-DOPTIMIZED_BUILD=true") } - - if (optimizedWithInspector) { - arguments.add("-DOPTIMIZED_WITH_INSPECTOR_BUILD=true") - } - - if (useCCache) { - arguments.add("-DUSE_CCACHE=true") - } - - arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_static", "-DANDROID_NDK_ROOT=${NDK_PATH}" +// +// if (optimizedWithInspector) { +// arguments.add("-DOPTIMIZED_WITH_INSPECTOR_BUILD=true") +// } +// +// if (useCCache) { +// arguments.add("-DUSE_CCACHE=true") +// } +// +// arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_static", "-DANDROID_NDK_ROOT=${NDK_PATH}" + + cppFlags "-std=c++14" + arguments "-DANDROID_STL=c++_shared", "-DANDROID_NDK_ROOT=${NDK_PATH}" } } ndk { minSdkVersion NS_DEFAULT_MIN_SDK_VERSION as int - if (onlyX86) { - abiFilters 'x86' - } else { - abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' - } + if (onlyX86) { + abiFilters 'x86' + } else { + abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' + } } } diff --git a/test-app/runtime/src/main/cpp/ArgConverter.h b/test-app/runtime/src/main/cpp/ArgConverter.h index 695f48e30..88f940f21 100644 --- a/test-app/runtime/src/main/cpp/ArgConverter.h +++ b/test-app/runtime/src/main/cpp/ArgConverter.h @@ -78,8 +78,7 @@ class ArgConverter { } inline static v8::Local ConvertToV8String(v8::Isolate* isolate, const std::string& s) { - v8::Local str = v8::String::NewFromUtf8(isolate, s.c_str(), v8::NewStringType::kNormal, s.length()).ToLocalChecked(); - return str; + return v8::String::NewFromUtf8(isolate, s.c_str(), v8::NewStringType::kNormal, s.length()).ToLocalChecked(); } inline static v8::Local ConvertToV8String(v8::Isolate* isolate, const char* data, int length) { diff --git a/test-app/runtime/src/main/cpp/ArrayBufferHelper.cpp b/test-app/runtime/src/main/cpp/ArrayBufferHelper.cpp index 443cc6000..1a09d887e 100644 --- a/test-app/runtime/src/main/cpp/ArrayBufferHelper.cpp +++ b/test-app/runtime/src/main/cpp/ArrayBufferHelper.cpp @@ -89,7 +89,13 @@ void ArrayBufferHelper::CreateFromCallbackImpl(const FunctionCallbackInfo auto data = env.GetDirectBufferAddress(obj); auto size = env.GetDirectBufferCapacity(obj); - arrayBuffer = ArrayBuffer::New(isolate, data, size); + std::shared_ptr store = ArrayBuffer::NewBackingStore( + data, + size, + [](void* data, size_t length, void* deleter_data) {}, + data); + + arrayBuffer = ArrayBuffer::New(isolate, store); } else { if (m_remainingMethodID == nullptr) { m_remainingMethodID = env.GetMethodID(m_ByteBufferClass, "remaining", "()I"); @@ -106,9 +112,21 @@ void ArrayBufferHelper::CreateFromCallbackImpl(const FunctionCallbackInfo jbyteArray byteArray = env.NewByteArray(bufferRemainingSize); env.CallObjectMethod(obj, m_getMethodID, byteArray, 0, bufferRemainingSize); - auto buffer = env.GetByteArrayElements(byteArray, 0); - arrayBuffer = ArrayBuffer::New(isolate, bufferRemainingSize); - memcpy(arrayBuffer->GetContents().Data(), buffer, bufferRemainingSize); + auto byteArrayElements = env.GetByteArrayElements(byteArray, 0); + + jbyte* data = new jbyte[bufferRemainingSize]; + memcpy(data, byteArrayElements, bufferRemainingSize); + + std::shared_ptr store = ArrayBuffer::NewBackingStore( + data, + bufferRemainingSize, + [](void *data, size_t length, void *deleter_data) { + delete[] ((jbyte*)data); + }, + nullptr); + + arrayBuffer = ArrayBuffer::New(isolate, store); + env.ReleaseByteArrayElements(byteArray, byteArrayElements, 0); } auto ctx = isolate->GetCurrentContext(); diff --git a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-css-agent-impl.cpp b/test-app/runtime/src/main/cpp/CSSAgentImpl.cpp similarity index 71% rename from test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-css-agent-impl.cpp rename to test-app/runtime/src/main/cpp/CSSAgentImpl.cpp index 66f7278f8..184112161 100644 --- a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-css-agent-impl.cpp +++ b/test-app/runtime/src/main/cpp/CSSAgentImpl.cpp @@ -4,21 +4,20 @@ #include #include -#include #include -#include "v8-css-agent-impl.h" -namespace v8_inspector { +#include "CSSAgentImpl.h" +#include "utils/InspectorCommon.h" -using tns::ArgConverter; +namespace tns { namespace CSSAgentState { static const char cssEnabled[] = "cssEnabled"; } -V8CSSAgentImpl::V8CSSAgentImpl(V8InspectorSessionImpl* session, - protocol::FrontendChannel* frontendChannel, - protocol::DictionaryValue* state) +CSSAgentImpl::CSSAgentImpl(V8InspectorSessionImpl* session, + protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) : m_session(session), m_frontend(frontendChannel), m_state(state), @@ -26,9 +25,9 @@ V8CSSAgentImpl::V8CSSAgentImpl(V8InspectorSessionImpl* session, Instance = this; } -V8CSSAgentImpl::~V8CSSAgentImpl() { } +CSSAgentImpl::~CSSAgentImpl() { } -void V8CSSAgentImpl::enable(std::unique_ptr callback) { +void CSSAgentImpl::enable(std::unique_ptr callback) { if (m_enabled) { callback->sendSuccess(); return; @@ -40,7 +39,7 @@ void V8CSSAgentImpl::enable(std::unique_ptr callback) { callback->sendSuccess(); } -DispatchResponse V8CSSAgentImpl::disable() { +DispatchResponse CSSAgentImpl::disable() { if (!m_enabled) { return DispatchResponse::Success(); } @@ -53,7 +52,7 @@ DispatchResponse V8CSSAgentImpl::disable() { } // Not supported -DispatchResponse V8CSSAgentImpl::getMatchedStylesForNode(int in_nodeId, Maybe* out_inlineStyle, Maybe* out_attributesStyle, Maybe>* out_matchedCSSRules, Maybe>* out_pseudoElements, Maybe>* out_inherited, Maybe>* out_cssKeyframesRules) { +DispatchResponse CSSAgentImpl::getMatchedStylesForNode(int in_nodeId, Maybe* out_inlineStyle, Maybe* out_attributesStyle, Maybe>* out_matchedCSSRules, Maybe>* out_pseudoElements, Maybe>* out_inherited, Maybe>* out_cssKeyframesRules) { //// out_inlineStyle // auto cssPropsArr = protocol::Array::create(); // auto shorthandPropArr = protocol::Array::create(); @@ -114,7 +113,7 @@ DispatchResponse V8CSSAgentImpl::getMatchedStylesForNode(int in_nodeId, Maybe* out_inlineStyle, Maybe* out_attributesStyle) { +DispatchResponse CSSAgentImpl::getInlineStylesForNode(int in_nodeId, Maybe* out_inlineStyle, Maybe* out_attributesStyle) { //// out_inlineStyle // auto cssPropsArr = protocol::Array::create(); // auto shorthandPropArr = protocol::Array::create(); @@ -137,7 +136,7 @@ DispatchResponse V8CSSAgentImpl::getInlineStylesForNode(int in_nodeId, Maybe>* out_computedStyle) { +DispatchResponse CSSAgentImpl::getComputedStyleForNode(int in_nodeId, std::unique_ptr>* out_computedStyle) { auto computedStylePropertyArr = std::make_unique>(); std::string getComputedStylesForNodeString = "getComputedStylesForNode"; @@ -169,7 +168,7 @@ DispatchResponse V8CSSAgentImpl::getComputedStyleForNode(int in_nodeId, std::uni if (maybeResult.ToLocal(&outResult)) { auto resultString = outResult->ToString(context).ToLocalChecked(); - String16 resultProtocolString = toProtocolString(isolate, resultString); + v8_inspector::String16 resultProtocolString = v8_inspector::toProtocolString(isolate, resultString); std::vector cbor; v8_crdtp::json::ConvertJSONToCBOR(v8_crdtp::span(resultProtocolString.characters16(), resultProtocolString.length()), &cbor); std::unique_ptr resultJson = protocol::Value::parseBinary(cbor.data(), cbor.size()); @@ -178,7 +177,7 @@ DispatchResponse V8CSSAgentImpl::getComputedStyleForNode(int in_nodeId, std::uni std::vector json; v8_crdtp::json::ConvertCBORToJSON(errorSupport.Errors(), &json); - auto errorSupportString = String16(reinterpret_cast(json.data()), json.size()).utf8(); + auto errorSupportString = v8_inspector::String16(reinterpret_cast(json.data()), json.size()).utf8(); if (!errorSupportString.empty()) { auto errorMessage = "Error while parsing CSSComputedStyleProperty object. "; DEBUG_WRITE_FORCE("%s Error: %s", errorMessage, errorSupportString.c_str()); @@ -197,7 +196,7 @@ DispatchResponse V8CSSAgentImpl::getComputedStyleForNode(int in_nodeId, std::uni return DispatchResponse::Success(); } -DispatchResponse V8CSSAgentImpl::getPlatformFontsForNode(int in_nodeId, std::unique_ptr>* out_fonts) { +DispatchResponse CSSAgentImpl::getPlatformFontsForNode(int in_nodeId, std::unique_ptr>* out_fonts) { auto fontsArr = std::make_unique>(); auto defaultFont = "System Font"; fontsArr->emplace_back(std::move(protocol::CSS::PlatformFontUsage::create() @@ -210,71 +209,71 @@ DispatchResponse V8CSSAgentImpl::getPlatformFontsForNode(int in_nodeId, std::uni return DispatchResponse::Success(); } -DispatchResponse V8CSSAgentImpl::getStyleSheetText(const String& in_styleSheetId, String* out_text) { +DispatchResponse CSSAgentImpl::getStyleSheetText(const String& in_styleSheetId, String* out_text) { *out_text = ""; return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::addRule(const String& in_styleSheetId, const String& in_ruleText, std::unique_ptr in_location, std::unique_ptr* out_rule) { +DispatchResponse CSSAgentImpl::addRule(const String& in_styleSheetId, const String& in_ruleText, std::unique_ptr in_location, std::unique_ptr* out_rule) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::collectClassNames(const String& in_styleSheetId, std::unique_ptr>* out_classNames) { +DispatchResponse CSSAgentImpl::collectClassNames(const String& in_styleSheetId, std::unique_ptr>* out_classNames) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::createStyleSheet(const String& in_frameId, String* out_styleSheetId) { +DispatchResponse CSSAgentImpl::createStyleSheet(const String& in_frameId, String* out_styleSheetId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::forcePseudoState(int in_nodeId, std::unique_ptr> in_forcedPseudoClasses) { +DispatchResponse CSSAgentImpl::forcePseudoState(int in_nodeId, std::unique_ptr> in_forcedPseudoClasses) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::getBackgroundColors(int in_nodeId, Maybe>* out_backgroundColors, Maybe* out_computedFontSize, Maybe* out_computedFontWeight) { +DispatchResponse CSSAgentImpl::getBackgroundColors(int in_nodeId, Maybe>* out_backgroundColors, Maybe* out_computedFontSize, Maybe* out_computedFontWeight) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::getMediaQueries(std::unique_ptr>* out_medias) { +DispatchResponse CSSAgentImpl::getMediaQueries(std::unique_ptr>* out_medias) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::setEffectivePropertyValueForNode(int in_nodeId, const String& in_propertyName, const String& in_value) { +DispatchResponse CSSAgentImpl::setEffectivePropertyValueForNode(int in_nodeId, const String& in_propertyName, const String& in_value) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::setKeyframeKey(const String& in_styleSheetId, std::unique_ptr in_range, const String& in_keyText, std::unique_ptr* out_keyText) { +DispatchResponse CSSAgentImpl::setKeyframeKey(const String& in_styleSheetId, std::unique_ptr in_range, const String& in_keyText, std::unique_ptr* out_keyText) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::setMediaText(const String& in_styleSheetId, std::unique_ptr in_range, const String& in_text, std::unique_ptr* out_media) { +DispatchResponse CSSAgentImpl::setMediaText(const String& in_styleSheetId, std::unique_ptr in_range, const String& in_text, std::unique_ptr* out_media) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::setRuleSelector(const String& in_styleSheetId, std::unique_ptr in_range, const String& in_selector, std::unique_ptr* out_selectorList) { +DispatchResponse CSSAgentImpl::setRuleSelector(const String& in_styleSheetId, std::unique_ptr in_range, const String& in_selector, std::unique_ptr* out_selectorList) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::setStyleSheetText(const String& in_styleSheetId, const String& in_text, Maybe* out_sourceMapURL) { +DispatchResponse CSSAgentImpl::setStyleSheetText(const String& in_styleSheetId, const String& in_text, Maybe* out_sourceMapURL) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::setStyleTexts(std::unique_ptr> in_edits, std::unique_ptr>* out_styles) { +DispatchResponse CSSAgentImpl::setStyleTexts(std::unique_ptr> in_edits, std::unique_ptr>* out_styles) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::startRuleUsageTracking() { +DispatchResponse CSSAgentImpl::startRuleUsageTracking() { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::stopRuleUsageTracking(std::unique_ptr>* out_ruleUsage) { +DispatchResponse CSSAgentImpl::stopRuleUsageTracking(std::unique_ptr>* out_ruleUsage) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8CSSAgentImpl::takeCoverageDelta(std::unique_ptr>* out_coverage) { +DispatchResponse CSSAgentImpl::takeCoverageDelta(std::unique_ptr>* out_coverage) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -V8CSSAgentImpl* V8CSSAgentImpl::Instance = 0; -} \ No newline at end of file +CSSAgentImpl* CSSAgentImpl::Instance = 0; +} // namespace tns diff --git a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-css-agent-impl.h b/test-app/runtime/src/main/cpp/CSSAgentImpl.h similarity index 89% rename from test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-css-agent-impl.h rename to test-app/runtime/src/main/cpp/CSSAgentImpl.h index 2bae09cb9..3438a377f 100644 --- a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-css-agent-impl.h +++ b/test-app/runtime/src/main/cpp/CSSAgentImpl.h @@ -9,20 +9,23 @@ #include namespace v8_inspector { - class V8InspectorSessionImpl; +} + +namespace tns { +namespace protocol = v8_inspector::protocol; using v8_inspector::protocol::Maybe; using String = v8_inspector::String16; using protocol::DispatchResponse; +using v8_inspector::V8InspectorSessionImpl; - -class V8CSSAgentImpl : public protocol::CSS::Backend { +class CSSAgentImpl : public protocol::CSS::Backend { public: - V8CSSAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, - protocol::DictionaryValue* state); + CSSAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); - ~V8CSSAgentImpl() override; + ~CSSAgentImpl() override; void enable(std::unique_ptr callback) override; DispatchResponse disable() override; @@ -47,7 +50,7 @@ class V8CSSAgentImpl : public protocol::CSS::Backend { DispatchResponse stopRuleUsageTracking(std::unique_ptr>* out_ruleUsage) override; DispatchResponse takeCoverageDelta(std::unique_ptr>* out_coverage) override; - static V8CSSAgentImpl* Instance; + static CSSAgentImpl* Instance; protocol::CSS::Frontend m_frontend; private: @@ -55,9 +58,10 @@ class V8CSSAgentImpl : public protocol::CSS::Backend { protocol::DictionaryValue* m_state; bool m_enabled; - DISALLOW_COPY_AND_ASSIGN(V8CSSAgentImpl); + CSSAgentImpl(const CSSAgentImpl&) = delete; + CSSAgentImpl& operator=(const CSSAgentImpl&) = delete; }; -} +} // namespace tns #endif //V8_CSS_AGENT_IMPL_H diff --git a/test-app/runtime/src/main/cpp/CallbackHandlers.cpp b/test-app/runtime/src/main/cpp/CallbackHandlers.cpp index 6611ed79a..ab018268f 100644 --- a/test-app/runtime/src/main/cpp/CallbackHandlers.cpp +++ b/test-app/runtime/src/main/cpp/CallbackHandlers.cpp @@ -3,6 +3,7 @@ #include "Util.h" #include "V8GlobalHelpers.h" #include "V8StringConstants.h" +//#include "./conversions/JSToJavaConverter.h" #include "JsArgConverter.h" #include "JsArgToArrayConverter.h" #include "ArgConverter.h" @@ -102,6 +103,7 @@ bool CallbackHandlers::RegisterInstance(Isolate *isolate, const Local &j instance = env.NewObject(generatedJavaClass, mi.mid); } else { // resolve arguments before passing them on to the constructor +// JSToJavaConverter argConverter(isolate, argWrapper.args, mi.signature); JsArgConverter argConverter(argWrapper.args, mi.signature); auto ctorArgs = argConverter.ToArgs(); @@ -209,6 +211,8 @@ void CallbackHandlers::CallJavaMethod(const Local &caller, const string auto retType = MethodReturnType::Unknown; MethodCache::CacheMethodInfo mi; + auto isolate = args.GetIsolate(); + if ((entry != nullptr) && entry->isResolved) { isStatic = entry->isStatic; @@ -320,27 +324,25 @@ void CallbackHandlers::CallJavaMethod(const Local &caller, const string methodName.c_str()); } - JsArgConverter *argConverter; +// JSToJavaConverter argConverter = (entry != nullptr && entry->isExtensionFunction) +// ? JSToJavaConverter(isolate, args, *sig, entry, caller) +// : JSToJavaConverter(isolate, args, *sig, entry); - if (entry != nullptr && entry->isExtensionFunction) { - argConverter = new JsArgConverter(caller, args, *sig, entry); - } else { - argConverter = new JsArgConverter(args, false, *sig, entry); - } + JsArgConverter argConverter = (entry != nullptr && entry->isExtensionFunction) + ? JsArgConverter(caller, args, *sig, entry) + : JsArgConverter(args, false, *sig, entry); - if (!argConverter->IsValid()) { - JsArgConverter::Error err = argConverter->GetError(); + + if (!argConverter.IsValid()) { + JsArgConverter::Error err = argConverter.GetError(); throw NativeScriptException(err.msg); } - auto isolate = args.GetIsolate(); - JniLocalRef callerJavaObject; - jvalue *javaArgs = argConverter->ToArgs(); + jvalue *javaArgs = argConverter.ToArgs(); - - auto runtime = Runtime::GetRuntime(isolate); + auto runtime = Runtime::GetRuntimeFromIsolateData(isolate); auto objectManager = runtime->GetObjectManager(); if (!isStatic) { @@ -537,13 +539,11 @@ void CallbackHandlers::CallJavaMethod(const Local &caller, const string } } - static uint32_t adjustMemCount = 0; - - if ((++adjustMemCount % 2) == 0) { - AdjustAmountOfExternalAllocatedMemory(env, isolate); - } - - delete argConverter; +// static uint32_t adjustMemCount = 0; +// +// if ((++adjustMemCount % 2) == 0) { +// AdjustAmountOfExternalAllocatedMemory(env, isolate); +// } } void CallbackHandlers::AdjustAmountOfExternalAllocatedMemory(JEnv &env, Isolate *isolate) { @@ -1091,8 +1091,10 @@ CallbackHandlers::WorkerObjectPostMessageCallback(const v8::FunctionCallbackInfo ArgConverter::ConvertToV8String(isolate, "workerId"), jsId); - Local msg = tns::JsonStringifyObject(isolate, args[0], false); auto context = isolate->GetCurrentContext(); + auto objToStringify = args[0]->ToObject(context).ToLocalChecked(); + std::string msg = tns::JsonStringifyObject(isolate, objToStringify, false); + // get worker's ID that is associated on the other side - in Java auto id = jsId->Int32Value(context).ToChecked(); @@ -1100,7 +1102,7 @@ CallbackHandlers::WorkerObjectPostMessageCallback(const v8::FunctionCallbackInfo auto mId = env.GetStaticMethodID(RUNTIME_CLASS, "sendMessageFromMainToWorker", "(ILjava/lang/String;)V"); - auto jmsg = ArgConverter::ConvertToJavaString(msg); + jstring jmsg = env.NewStringUTF(msg.c_str()); JniLocalRef jmsgRef(jmsg); env.CallStaticVoidMethod(RUNTIME_CLASS, mId, id, (jstring) jmsgRef); @@ -1190,13 +1192,15 @@ CallbackHandlers::WorkerGlobalPostMessageCallback(const v8::FunctionCallbackInfo return; } - Local msg = tns::JsonStringifyObject(isolate, args[0], false); + auto context = isolate->GetCurrentContext(); + auto objToStringify = args[0]->ToObject(context).ToLocalChecked(); + std::string msg = tns::JsonStringifyObject(isolate, objToStringify, false); JEnv env; auto mId = env.GetStaticMethodID(RUNTIME_CLASS, "sendMessageFromWorkerToMain", "(Ljava/lang/String;)V"); - auto jmsg = ArgConverter::ConvertToJavaString(msg); + auto jmsg = env.NewStringUTF(msg.c_str()); JniLocalRef jmsgRef(jmsg); env.CallStaticVoidMethod(RUNTIME_CLASS, mId, (jstring) jmsgRef); diff --git a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp b/test-app/runtime/src/main/cpp/DOMAgentImpl.cpp similarity index 67% rename from test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp rename to test-app/runtime/src/main/cpp/DOMAgentImpl.cpp index 294341252..d9bde478d 100644 --- a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.cpp +++ b/test-app/runtime/src/main/cpp/DOMAgentImpl.cpp @@ -3,24 +3,22 @@ // #include -#include "v8-dom-agent-impl.h" #include -#include +#include #include -#include -namespace v8_inspector { +#include "DOMAgentImpl.h" +#include "utils/InspectorCommon.h" -using tns::Runtime; -using tns::ArgConverter; +namespace tns { namespace DOMAgentState { static const char domEnabled[] = "domEnabled"; } -V8DOMAgentImpl::V8DOMAgentImpl(V8InspectorSessionImpl* session, - protocol::FrontendChannel* frontendChannel, - protocol::DictionaryValue* state) +DOMAgentImpl::DOMAgentImpl(V8InspectorSessionImpl* session, + protocol::FrontendChannel* frontendChannel, + protocol::DictionaryValue* state) : m_session(session), m_frontend(frontendChannel), m_state(state), @@ -28,9 +26,9 @@ V8DOMAgentImpl::V8DOMAgentImpl(V8InspectorSessionImpl* session, Instance = this; } -V8DOMAgentImpl::~V8DOMAgentImpl() { } +DOMAgentImpl::~DOMAgentImpl() { } -DispatchResponse V8DOMAgentImpl::enable() { +DispatchResponse DOMAgentImpl::enable() { if (m_enabled) { return DispatchResponse::Success(); } @@ -42,7 +40,7 @@ DispatchResponse V8DOMAgentImpl::enable() { return DispatchResponse::Success(); } -DispatchResponse V8DOMAgentImpl::disable() { +DispatchResponse DOMAgentImpl::disable() { if (!m_enabled) { return DispatchResponse::Success(); } @@ -54,11 +52,11 @@ DispatchResponse V8DOMAgentImpl::disable() { return DispatchResponse::Success(); } -DispatchResponse V8DOMAgentImpl::getContentQuads(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, std::unique_ptr>>* out_quads) { +DispatchResponse DOMAgentImpl::getContentQuads(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, std::unique_ptr>>* out_quads) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getDocument(Maybe in_depth, Maybe in_pierce, std::unique_ptr* out_root) { +DispatchResponse DOMAgentImpl::getDocument(Maybe in_depth, Maybe in_pierce, std::unique_ptr* out_root) { std::unique_ptr defaultNode = protocol::DOM::Node::create() .setNodeId(0) .setBackendNodeId(0) @@ -105,7 +103,7 @@ DispatchResponse V8DOMAgentImpl::getDocument(Maybe in_depth, Maybe in } auto resultUtf16Data = resultString.data(); - String16 resultProtocolString = String16((const uint16_t*) resultUtf16Data); + v8_inspector::String16 resultProtocolString = v8_inspector::String16((const uint16_t*) resultUtf16Data); std::vector cbor; v8_crdtp::json::ConvertJSONToCBOR(v8_crdtp::span(resultProtocolString.characters16(), resultProtocolString.length()), &cbor); std::unique_ptr resultJson = protocol::Value::parseBinary(cbor.data(), cbor.size()); @@ -114,7 +112,7 @@ DispatchResponse V8DOMAgentImpl::getDocument(Maybe in_depth, Maybe in std::vector json; v8_crdtp::json::ConvertCBORToJSON(errorSupport.Errors(), &json); - auto errorSupportString = String16(reinterpret_cast(json.data()), json.size()).utf8(); + auto errorSupportString = v8_inspector::String16(reinterpret_cast(json.data()), json.size()).utf8(); if (!errorSupportString.empty()) { auto errorMessage = "Error while parsing debug `DOM Node` object. "; DEBUG_WRITE_FORCE("JS Error: %s, Error support: %s", errorMessage, errorSupportString.c_str()); @@ -134,7 +132,7 @@ DispatchResponse V8DOMAgentImpl::getDocument(Maybe in_depth, Maybe in return DispatchResponse::ServerError("Error getting DOM tree."); } -DispatchResponse V8DOMAgentImpl::removeNode(int in_nodeId) { +DispatchResponse DOMAgentImpl::removeNode(int in_nodeId) { std::string removeNodeFunctionString = "removeNode"; // TODO: Pete: Find a better way to get a hold of the isolate @@ -167,11 +165,11 @@ DispatchResponse V8DOMAgentImpl::removeNode(int in_nodeId) { return DispatchResponse::ServerError("Couldn't remove the selected DOMNode from the visual tree. Global Inspector object not found."); } -DispatchResponse V8DOMAgentImpl::setAttributeValue(int in_nodeId, const String& in_name, const String& in_value) { +DispatchResponse DOMAgentImpl::setAttributeValue(int in_nodeId, const String& in_name, const String& in_value) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::setAttributesAsText(int in_nodeId, const String& in_text, Maybe in_name) { +DispatchResponse DOMAgentImpl::setAttributesAsText(int in_nodeId, const String& in_text, Maybe in_name) { // call modules' View class methods to modify view's attribute // TODO: Pete: Find a better way to get a hold of the isolate std::string setAttributeAsTextFunctionString = "setAttributeAsText"; @@ -209,23 +207,23 @@ DispatchResponse V8DOMAgentImpl::setAttributesAsText(int in_nodeId, const String return DispatchResponse::ServerError("Couldn't change selected DOM node's attribute. Global Inspector object not found."); } -DispatchResponse V8DOMAgentImpl::removeAttribute(int in_nodeId, const String& in_name) { +DispatchResponse DOMAgentImpl::removeAttribute(int in_nodeId, const String& in_name) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::performSearch(const String& in_query, Maybe in_includeUserAgentShadowDOM, String* out_searchId, int* out_resultCount) { +DispatchResponse DOMAgentImpl::performSearch(const String& in_query, Maybe in_includeUserAgentShadowDOM, String* out_searchId, int* out_resultCount) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getSearchResults(const String& in_searchId, int in_fromIndex, int in_toIndex, std::unique_ptr>* out_nodeIds) { +DispatchResponse DOMAgentImpl::getSearchResults(const String& in_searchId, int in_fromIndex, int in_toIndex, std::unique_ptr>* out_nodeIds) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::discardSearchResults(const String& in_searchId) { +DispatchResponse DOMAgentImpl::discardSearchResults(const String& in_searchId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::resolveNode(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectGroup, Maybe in_executionContextId, std::unique_ptr* out_object) { +DispatchResponse DOMAgentImpl::resolveNode(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectGroup, Maybe in_executionContextId, std::unique_ptr* out_object) { auto resolvedNode = protocol::Runtime::RemoteObject::create() .setType("View") .build(); @@ -235,115 +233,115 @@ DispatchResponse V8DOMAgentImpl::resolveNode(Maybe in_nodeId, Maybe in return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::collectClassNamesFromSubtree(int in_nodeId, std::unique_ptr>* out_classNames) { +DispatchResponse DOMAgentImpl::collectClassNamesFromSubtree(int in_nodeId, std::unique_ptr>* out_classNames) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::copyTo(int in_nodeId, int in_targetNodeId, Maybe in_insertBeforeNodeId, int* out_nodeId) { +DispatchResponse DOMAgentImpl::copyTo(int in_nodeId, int in_targetNodeId, Maybe in_insertBeforeNodeId, int* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::describeNode(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, Maybe in_depth, Maybe in_pierce, std::unique_ptr* out_node) { +DispatchResponse DOMAgentImpl::describeNode(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, Maybe in_depth, Maybe in_pierce, std::unique_ptr* out_node) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::focus(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId) { +DispatchResponse DOMAgentImpl::focus(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getAttributes(int in_nodeId, std::unique_ptr>* out_attributes) { +DispatchResponse DOMAgentImpl::getAttributes(int in_nodeId, std::unique_ptr>* out_attributes) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getBoxModel(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, std::unique_ptr* out_model) { +DispatchResponse DOMAgentImpl::getBoxModel(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, std::unique_ptr* out_model) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getFlattenedDocument(Maybe in_depth, Maybe in_pierce, std::unique_ptr>* out_nodes) { +DispatchResponse DOMAgentImpl::getFlattenedDocument(Maybe in_depth, Maybe in_pierce, std::unique_ptr>* out_nodes) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getNodeForLocation(int in_x, int in_y, Maybe in_includeUserAgentShadowDOM, int* out_backendNodeId, Maybe* out_nodeId) { +DispatchResponse DOMAgentImpl::getNodeForLocation(int in_x, int in_y, Maybe in_includeUserAgentShadowDOM, int* out_backendNodeId, Maybe* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getOuterHTML(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, String* out_outerHTML) { +DispatchResponse DOMAgentImpl::getOuterHTML(Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId, String* out_outerHTML) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getRelayoutBoundary(int in_nodeId, int* out_nodeId) { +DispatchResponse DOMAgentImpl::getRelayoutBoundary(int in_nodeId, int* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::markUndoableState() { +DispatchResponse DOMAgentImpl::markUndoableState() { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::moveTo(int in_nodeId, int in_targetNodeId, Maybe in_insertBeforeNodeId, int* out_nodeId) { +DispatchResponse DOMAgentImpl::moveTo(int in_nodeId, int in_targetNodeId, Maybe in_insertBeforeNodeId, int* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::pushNodeByPathToFrontend(const String& in_path, int* out_nodeId) { +DispatchResponse DOMAgentImpl::pushNodeByPathToFrontend(const String& in_path, int* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::pushNodesByBackendIdsToFrontend(std::unique_ptr> in_backendNodeIds, std::unique_ptr>* out_nodeIds) { +DispatchResponse DOMAgentImpl::pushNodesByBackendIdsToFrontend(std::unique_ptr> in_backendNodeIds, std::unique_ptr>* out_nodeIds) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::querySelector(int in_nodeId, const String& in_selector, int* out_nodeId) { +DispatchResponse DOMAgentImpl::querySelector(int in_nodeId, const String& in_selector, int* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::querySelectorAll(int in_nodeId, const String& in_selector, std::unique_ptr>* out_nodeIds) { +DispatchResponse DOMAgentImpl::querySelectorAll(int in_nodeId, const String& in_selector, std::unique_ptr>* out_nodeIds) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::redo() { +DispatchResponse DOMAgentImpl::redo() { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::requestChildNodes(int in_nodeId, Maybe in_depth, Maybe in_pierce) { +DispatchResponse DOMAgentImpl::requestChildNodes(int in_nodeId, Maybe in_depth, Maybe in_pierce) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::requestNode(const String& in_objectId, int* out_nodeId) { +DispatchResponse DOMAgentImpl::requestNode(const String& in_objectId, int* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::setFileInputFiles(std::unique_ptr> in_files, Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId) { +DispatchResponse DOMAgentImpl::setFileInputFiles(std::unique_ptr> in_files, Maybe in_nodeId, Maybe in_backendNodeId, Maybe in_objectId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getFileInfo(const String& in_objectId, String* out_path) { +DispatchResponse DOMAgentImpl::getFileInfo(const String& in_objectId, String* out_path) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::setInspectedNode(int in_nodeId) { +DispatchResponse DOMAgentImpl::setInspectedNode(int in_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::setNodeName(int in_nodeId, const String& in_name, int* out_nodeId) { +DispatchResponse DOMAgentImpl::setNodeName(int in_nodeId, const String& in_name, int* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::setNodeValue(int in_nodeId, const String& in_value) { +DispatchResponse DOMAgentImpl::setNodeValue(int in_nodeId, const String& in_value) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::setOuterHTML(int in_nodeId, const String& in_outerHTML) { +DispatchResponse DOMAgentImpl::setOuterHTML(int in_nodeId, const String& in_outerHTML) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::undo() { +DispatchResponse DOMAgentImpl::undo() { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -DispatchResponse V8DOMAgentImpl::getFrameOwner(const String& in_frameId, int* out_backendNodeId, Maybe* out_nodeId) { +DispatchResponse DOMAgentImpl::getFrameOwner(const String& in_frameId, int* out_backendNodeId, Maybe* out_nodeId) { return utils::Common::protocolCommandNotSupportedDispatchResponse(); } -std::u16string V8DOMAgentImpl::AddBackendNodeIdProperty(v8::Isolate* isolate, v8::Local jsonInput) { +std::u16string DOMAgentImpl::AddBackendNodeIdProperty(v8::Isolate* isolate, v8::Local jsonInput) { auto scriptSource = "(function () {" " function addBackendNodeId(node) {" @@ -384,5 +382,5 @@ std::u16string V8DOMAgentImpl::AddBackendNodeIdProperty(v8::Isolate* isolate, v8 return resultString; } -V8DOMAgentImpl* V8DOMAgentImpl::Instance = 0; -} +DOMAgentImpl* DOMAgentImpl::Instance = 0; +} // namespace tns diff --git a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.h b/test-app/runtime/src/main/cpp/DOMAgentImpl.h similarity index 91% rename from test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.h rename to test-app/runtime/src/main/cpp/DOMAgentImpl.h index 8d83a3e75..a09b591f0 100644 --- a/test-app/runtime/src/main/cpp/v8_inspector/src/inspector/v8-dom-agent-impl.h +++ b/test-app/runtime/src/main/cpp/DOMAgentImpl.h @@ -9,19 +9,23 @@ #include namespace v8_inspector { - class V8InspectorSessionImpl; +} + +namespace tns { using v8_inspector::protocol::Maybe; using String = v8_inspector::String16; using v8_inspector::protocol::DispatchResponse; +using v8_inspector::V8InspectorSessionImpl; +namespace protocol = v8_inspector::protocol; -class V8DOMAgentImpl : public protocol::DOM::Backend { +class DOMAgentImpl : public protocol::DOM::Backend { public: - V8DOMAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, - protocol::DictionaryValue* state); + DOMAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, + protocol::DictionaryValue* state); - ~V8DOMAgentImpl() override; + ~DOMAgentImpl() override; virtual DispatchResponse enable() override; virtual DispatchResponse disable() override; @@ -68,7 +72,7 @@ class V8DOMAgentImpl : public protocol::DOM::Backend { return m_enabled; }; - static V8DOMAgentImpl* Instance; + static DOMAgentImpl* Instance; protocol::DOM::Frontend m_frontend; static std::u16string AddBackendNodeIdProperty(v8::Isolate* isolate, v8::Local jsonInput); @@ -78,8 +82,9 @@ class V8DOMAgentImpl : public protocol::DOM::Backend { bool m_enabled; - DISALLOW_COPY_AND_ASSIGN(V8DOMAgentImpl); + DOMAgentImpl(const DOMAgentImpl&) = delete; + DOMAgentImpl& operator=(const DOMAgentImpl&) = delete; }; -} +} // namespace tns #endif //V8_DOM_AGENT_IMPL_H \ No newline at end of file diff --git a/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp b/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp index f77e86634..4f3234350 100644 --- a/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp +++ b/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.cpp @@ -2,179 +2,184 @@ // Created by pkanev on 5/10/2017. // -#include -#include -#include -#include +// #include +// #include +// #include + +// #include +// #include +// #include +// #include + #include "DOMDomainCallbackHandlers.h" using namespace tns; void DOMDomainCallbackHandlers::DocumentUpdatedCallback(const v8::FunctionCallbackInfo& args) { - auto domAgentInstance = V8DOMAgentImpl::Instance; + // auto domAgentInstance = DOMAgentImpl::Instance; - if (!domAgentInstance) { - return; - } + // if (!domAgentInstance) { + // return; + // } - domAgentInstance->m_frontend.documentUpdated(); + // domAgentInstance->m_frontend.documentUpdated(); } void DOMDomainCallbackHandlers::ChildNodeInsertedCallback(const v8::FunctionCallbackInfo& args) { - try { - auto domAgentInstance = V8DOMAgentImpl::Instance; - - if (!domAgentInstance) { - return; - } - - auto isolate = args.GetIsolate(); - - v8::HandleScope scope(isolate); - - if (args.Length() != 3 || !(args[0]->IsNumber() && args[1]->IsNumber() && args[2]->IsString())) { - throw NativeScriptException("Calling ChildNodeInserted with invalid arguments. Required params: parentId: number, lastId: number, node: JSON String"); - } - - auto context = isolate->GetCurrentContext(); - auto parentId = args[0]->ToNumber(context).ToLocalChecked(); - auto lastId = args[1]->ToNumber(context).ToLocalChecked(); - auto node = args[2]->ToString(context).ToLocalChecked(); - - auto resultString = V8DOMAgentImpl::AddBackendNodeIdProperty(isolate, node); - auto nodeUtf16Data = resultString.data(); - const String16& nodeString16 = String16((const uint16_t*) nodeUtf16Data); - std::vector cbor; - v8_crdtp::json::ConvertJSONToCBOR(v8_crdtp::span(nodeString16.characters16(), nodeString16.length()), &cbor); - std::unique_ptr protocolNodeJson = protocol::Value::parseBinary(cbor.data(), cbor.size()); - - protocol::ErrorSupport errorSupport; - auto domNode = protocol::DOM::Node::fromValue(protocolNodeJson.get(), &errorSupport); - - std::vector json; - v8_crdtp::json::ConvertCBORToJSON(errorSupport.Errors(), &json); - auto errorSupportString = String16(reinterpret_cast(json.data()), json.size()).utf8(); - if (!errorSupportString.empty()) { - auto errorMessage = "Error while parsing debug `DOM Node` object. "; - DEBUG_WRITE_FORCE("%s Error: %s", errorMessage, errorSupportString.c_str()); - return; - } - - domAgentInstance->m_frontend.childNodeInserted(parentId->Int32Value(context).ToChecked(), lastId->Int32Value(context).ToChecked(), std::move(domNode)); - } catch (NativeScriptException& e) { - e.ReThrowToV8(); - } catch (std::exception e) { - std::stringstream ss; - ss << "Error: c exception: " << e.what() << std::endl; - NativeScriptException nsEx(ss.str()); - nsEx.ReThrowToV8(); - } catch (...) { - NativeScriptException nsEx(std::string("Error: c exception!")); - nsEx.ReThrowToV8(); - } + // try { + // auto domAgentInstance = DOMAgentImpl::Instance; + + // if (!domAgentInstance) { + // return; + // } + + // auto isolate = args.GetIsolate(); + + // v8::HandleScope scope(isolate); + + // if (args.Length() != 3 || !(args[0]->IsNumber() && args[1]->IsNumber() && args[2]->IsString())) { + // throw NativeScriptException("Calling ChildNodeInserted with invalid arguments. Required params: parentId: number, lastId: number, node: JSON String"); + // } + + // auto context = isolate->GetCurrentContext(); + // auto parentId = args[0]->ToNumber(context).ToLocalChecked(); + // auto lastId = args[1]->ToNumber(context).ToLocalChecked(); + // auto node = args[2]->ToString(context).ToLocalChecked(); + + // auto resultString = DOMAgentImpl::AddBackendNodeIdProperty(isolate, node); + // auto nodeUtf16Data = resultString.data(); + // const v8_inspector::String16& nodeString16 = v8_inspector::String16((const uint16_t*) nodeUtf16Data); + // std::vector cbor; + // v8_crdtp::json::ConvertJSONToCBOR(v8_crdtp::span(nodeString16.characters16(), nodeString16.length()), &cbor); + // std::unique_ptr protocolNodeJson = protocol::Value::parseBinary(cbor.data(), cbor.size()); + + // v8_crdtp::ErrorSupport errorSupport; + // auto domNode = protocol::DOM::Node::fromValue(protocolNodeJson.get(), &errorSupport); + + // std::vector json; + // v8_crdtp::json::ConvertCBORToJSON(errorSupport.Errors(), &json); + // auto errorSupportString = String16(reinterpret_cast(json.data()), json.size()).utf8(); + // if (!errorSupportString.empty()) { + // auto errorMessage = "Error while parsing debug `DOM Node` object. "; + // DEBUG_WRITE_FORCE("%s Error: %s", errorMessage, errorSupportString.c_str()); + // return; + // } + + // domAgentInstance->m_frontend.childNodeInserted(parentId->Int32Value(context).ToChecked(), lastId->Int32Value(context).ToChecked(), std::move(domNode)); + // } catch (NativeScriptException& e) { + // e.ReThrowToV8(); + // } catch (std::exception e) { + // std::stringstream ss; + // ss << "Error: c exception: " << e.what() << std::endl; + // NativeScriptException nsEx(ss.str()); + // nsEx.ReThrowToV8(); + // } catch (...) { + // NativeScriptException nsEx(std::string("Error: c exception!")); + // nsEx.ReThrowToV8(); + // } } void DOMDomainCallbackHandlers::ChildNodeRemovedCallback(const v8::FunctionCallbackInfo& args) { - try { - auto domAgentInstance = V8DOMAgentImpl::Instance; - - if (!domAgentInstance) { - return; - } - - auto isolate = args.GetIsolate(); - - v8::HandleScope scope(isolate); - - if (args.Length() != 2 || !(args[0]->IsNumber() && args[1]->IsNumber())) { - throw NativeScriptException("Calling ChildNodeRemoved with invalid arguments. Required params: parentId: number, nodeId: number"); - } - - auto context = isolate->GetCurrentContext(); - auto parentId = args[0]->ToNumber(context).ToLocalChecked(); - auto nodeId = args[1]->ToNumber(context).ToLocalChecked(); - - domAgentInstance->m_frontend.childNodeRemoved(parentId->Int32Value(context).ToChecked(), nodeId->Int32Value(context).ToChecked()); - } catch (NativeScriptException& e) { - e.ReThrowToV8(); - } catch (std::exception e) { - std::stringstream ss; - ss << "Error: c exception: " << e.what() << std::endl; - NativeScriptException nsEx(ss.str()); - nsEx.ReThrowToV8(); - } catch (...) { - NativeScriptException nsEx(std::string("Error: c exception!")); - nsEx.ReThrowToV8(); - } + // try { + // auto domAgentInstance = DOMAgentImpl::Instance; + + // if (!domAgentInstance) { + // return; + // } + + // auto isolate = args.GetIsolate(); + + // v8::HandleScope scope(isolate); + + // if (args.Length() != 2 || !(args[0]->IsNumber() && args[1]->IsNumber())) { + // throw NativeScriptException("Calling ChildNodeRemoved with invalid arguments. Required params: parentId: number, nodeId: number"); + // } + + // auto context = isolate->GetCurrentContext(); + // auto parentId = args[0]->ToNumber(context).ToLocalChecked(); + // auto nodeId = args[1]->ToNumber(context).ToLocalChecked(); + + // domAgentInstance->m_frontend.childNodeRemoved(parentId->Int32Value(context).ToChecked(), nodeId->Int32Value(context).ToChecked()); + // } catch (NativeScriptException& e) { + // e.ReThrowToV8(); + // } catch (std::exception e) { + // std::stringstream ss; + // ss << "Error: c exception: " << e.what() << std::endl; + // NativeScriptException nsEx(ss.str()); + // nsEx.ReThrowToV8(); + // } catch (...) { + // NativeScriptException nsEx(std::string("Error: c exception!")); + // nsEx.ReThrowToV8(); + // } } void DOMDomainCallbackHandlers::AttributeModifiedCallback(const v8::FunctionCallbackInfo& args) { - try { - auto domAgentInstance = V8DOMAgentImpl::Instance; - - if (!domAgentInstance) { - return; - } - - auto isolate = args.GetIsolate(); - - v8::HandleScope scope(isolate); - - if (args.Length() != 3 || !(args[0]->IsNumber() && args[1]->IsString() && args[2]->IsString())) { - throw NativeScriptException("Calling AttributeModified with invalid arguments. Required params: nodeId: number, name: string, value: string"); - } - - auto context = isolate->GetCurrentContext(); - auto nodeId = args[0]->ToNumber(context).ToLocalChecked(); - auto attributeName = args[1]->ToString(context).ToLocalChecked(); - auto attributeValue = args[2]->ToString(context).ToLocalChecked(); - - domAgentInstance->m_frontend.attributeModified(nodeId->Int32Value(context).ToChecked(), - v8_inspector::toProtocolString(isolate, attributeName), - v8_inspector::toProtocolString(isolate, attributeValue)); - } catch (NativeScriptException& e) { - e.ReThrowToV8(); - } catch (std::exception e) { - std::stringstream ss; - ss << "Error: c exception: " << e.what() << std::endl; - NativeScriptException nsEx(ss.str()); - nsEx.ReThrowToV8(); - } catch (...) { - NativeScriptException nsEx(std::string("Error: c exception!")); - nsEx.ReThrowToV8(); - } + // try { + // auto domAgentInstance = DOMAgentImpl::Instance; + + // if (!domAgentInstance) { + // return; + // } + + // auto isolate = args.GetIsolate(); + + // v8::HandleScope scope(isolate); + + // if (args.Length() != 3 || !(args[0]->IsNumber() && args[1]->IsString() && args[2]->IsString())) { + // throw NativeScriptException("Calling AttributeModified with invalid arguments. Required params: nodeId: number, name: string, value: string"); + // } + + // auto context = isolate->GetCurrentContext(); + // auto nodeId = args[0]->ToNumber(context).ToLocalChecked(); + // auto attributeName = args[1]->ToString(context).ToLocalChecked(); + // auto attributeValue = args[2]->ToString(context).ToLocalChecked(); + + // domAgentInstance->m_frontend.attributeModified(nodeId->Int32Value(context).ToChecked(), + // v8_inspector::toProtocolString(isolate, attributeName), + // v8_inspector::toProtocolString(isolate, attributeValue)); + // } catch (NativeScriptException& e) { + // e.ReThrowToV8(); + // } catch (std::exception e) { + // std::stringstream ss; + // ss << "Error: c exception: " << e.what() << std::endl; + // NativeScriptException nsEx(ss.str()); + // nsEx.ReThrowToV8(); + // } catch (...) { + // NativeScriptException nsEx(std::string("Error: c exception!")); + // nsEx.ReThrowToV8(); + // } } void DOMDomainCallbackHandlers::AttributeRemovedCallback(const v8::FunctionCallbackInfo& args) { - try { - auto domAgentInstance = V8DOMAgentImpl::Instance; - - if (!domAgentInstance) { - return; - } - auto isolate = args.GetIsolate(); - - v8::HandleScope scope(isolate); - - if (args.Length() != 2 || !(args[0]->IsNumber() && args[1]->IsString())) { - throw NativeScriptException("Calling AttributeRemoved with invalid arguments. Required params: nodeId: number, name: string"); - } - - auto context = isolate->GetCurrentContext(); - auto nodeId = args[0]->ToNumber(context).ToLocalChecked(); - auto attributeName = args[1]->ToString(context).ToLocalChecked(); - - domAgentInstance->m_frontend.attributeRemoved(nodeId->Int32Value(context).ToChecked(), - v8_inspector::toProtocolString(isolate, attributeName)); - } catch (NativeScriptException& e) { - e.ReThrowToV8(); - } catch (std::exception e) { - std::stringstream ss; - ss << "Error: c exception: " << e.what() << std::endl; - NativeScriptException nsEx(ss.str()); - nsEx.ReThrowToV8(); - } catch (...) { - NativeScriptException nsEx(std::string("Error: c exception!")); - nsEx.ReThrowToV8(); - } + // try { + // auto domAgentInstance = DOMAgentImpl::Instance; + + // if (!domAgentInstance) { + // return; + // } + // auto isolate = args.GetIsolate(); + + // v8::HandleScope scope(isolate); + + // if (args.Length() != 2 || !(args[0]->IsNumber() && args[1]->IsString())) { + // throw NativeScriptException("Calling AttributeRemoved with invalid arguments. Required params: nodeId: number, name: string"); + // } + + // auto context = isolate->GetCurrentContext(); + // auto nodeId = args[0]->ToNumber(context).ToLocalChecked(); + // auto attributeName = args[1]->ToString(context).ToLocalChecked(); + + // domAgentInstance->m_frontend.attributeRemoved(nodeId->Int32Value(context).ToChecked(), + // v8_inspector::toProtocolString(isolate, attributeName)); + // } catch (NativeScriptException& e) { + // e.ReThrowToV8(); + // } catch (std::exception e) { + // std::stringstream ss; + // ss << "Error: c exception: " << e.what() << std::endl; + // NativeScriptException nsEx(ss.str()); + // nsEx.ReThrowToV8(); + // } catch (...) { + // NativeScriptException nsEx(std::string("Error: c exception!")); + // nsEx.ReThrowToV8(); + // } } diff --git a/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.h b/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.h index b4e2a50cb..b36a57759 100644 --- a/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.h +++ b/test-app/runtime/src/main/cpp/DOMDomainCallbackHandlers.h @@ -6,9 +6,9 @@ #define DOMDOMAINCALLBACKHANDLERS_H #include -#include -#include "JsV8InspectorClient.h" -#include "NativeScriptException.h" +// #include "DOMAgentImpl.h" +// #include "JsV8InspectorClient.h" +// #include "NativeScriptException.h" namespace tns { class DOMDomainCallbackHandlers { diff --git a/test-app/runtime/src/main/cpp/JsArgConverter.cpp b/test-app/runtime/src/main/cpp/JsArgConverter.cpp index 2b4d92936..5dfa72fbb 100644 --- a/test-app/runtime/src/main/cpp/JsArgConverter.cpp +++ b/test-app/runtime/src/main/cpp/JsArgConverter.cpp @@ -58,7 +58,6 @@ JsArgConverter::JsArgConverter(const v8::FunctionCallbackInfo &args, m_argsLen = !hasImplementationObject ? args.Length() : args.Length() - 1; if (m_argsLen > 0) { - m_storedObjects.reserve(m_argsLen); if ((entry != nullptr) && (entry->isResolved)) { if (entry->parsedSig.empty()) { JniSignatureParser parser(m_methodSignature); @@ -89,14 +88,9 @@ JsArgConverter::JsArgConverter(const v8::FunctionCallbackInfo &args, JniSignatureParser parser(m_methodSignature); m_tokens = parser.Parse(); - if (m_argsLen > 0) { - m_storedObjects.reserve(m_argsLen); - } - for (int i = 0; i < m_argsLen; i++) { m_isValid = ConvertArg(args[i], i); - if (!m_isValid) { break; } @@ -171,14 +165,6 @@ bool JsArgConverter::ConvertArg(const Local &arg, int index) { JEnv env; - - auto isSupportSig = typeSignature == "Ljava/nio/ByteBuffer;" || - typeSignature == "Ljava/nio/ShortBuffer;" || - typeSignature == "Ljava/nio/IntBuffer;" || - typeSignature == "Ljava/nio/LongBuffer;" || - typeSignature == "Ljava/nio/FloatBuffer;" || - typeSignature == "Ljava/nio/DoubleBuffer;"; - switch (castType) { case CastType::Char: castValue = NumericCasts::GetCastValue(jsObject); @@ -272,40 +258,20 @@ bool JsArgConverter::ConvertArg(const Local &arg, int index) { store = array->GetBackingStore(); length = array->ByteLength(); data = static_cast(store->Data()); - - if (data == nullptr) { - data = static_cast(array->GetContents().Data()); - } - - } else if (jsObject->IsArrayBufferView()) { auto array = jsObject.As(); offset = array->ByteOffset(); length = array->ByteLength(); store = array->Buffer()->GetBackingStore(); data = static_cast(store->Data()) + offset; - - if (data == nullptr) { - data = static_cast(array->Buffer()->GetContents().Data()) + - offset; - } - bufferCastType = JsArgConverter::GetCastType(array); } else { auto array = jsObject.As(); offset = array->ByteOffset(); store = array->Buffer()->GetBackingStore(); length = array->ByteLength(); - data = static_cast(store->Data()) + offset; - - if (data == nullptr) { - data = static_cast(array->Buffer()->GetContents().Data()) + - offset; - } - bufferCastType = JsArgConverter::GetCastType(array); - } auto directBuffer = env.NewDirectByteBuffer( @@ -411,7 +377,7 @@ bool JsArgConverter::ConvertArg(const Local &arg, int index) { void JsArgConverter::SetConvertedObject(int index, jobject obj, bool isGlobal) { m_args[index].l = obj; if ((obj != nullptr) && !isGlobal) { - m_storedObjects.push_back(index); + m_args_refs[m_args_refs_size++] = index; } } @@ -529,73 +495,110 @@ bool JsArgConverter::ConvertJavaScriptArray(const Local &jsArr, int index JEnv env; switch (elementTypePrefix) { - case 'Z': + case 'Z': { arr = env.NewBooleanArray(arrLength); + jboolean bools[arrLength]; for (jsize i = 0; i < arrLength; i++) { - jboolean value = jsArr->Get(context, i).ToLocalChecked()->BooleanValue(m_isolate); - env.SetBooleanArrayRegion((jbooleanArray) arr, i, 1, &value); + bools[i] = jsArr + ->Get(context, i) + .ToLocalChecked() + ->BooleanValue(m_isolate); } + env.SetBooleanArrayRegion((jbooleanArray) arr, 0, arrLength, bools); break; - case 'B': + } + case 'B': { arr = env.NewByteArray(arrLength); + jbyte bytes[arrLength]; for (jsize i = 0; i < arrLength; i++) { - jbyte value = jsArr->Get(context, i).ToLocalChecked()->Int32Value( - context).ToChecked(); - env.SetByteArrayRegion((jbyteArray) arr, i, 1, &value); + bytes[i] = jsArr + ->Get(context, i) + .ToLocalChecked() + ->Int32Value(context) + .ToChecked(); } + env.SetByteArrayRegion((jbyteArray) arr, 0, arrLength, bytes); break; - case 'C': + } + case 'C': { arr = env.NewCharArray(arrLength); + jchar chars[arrLength]; for (jsize i = 0; i < arrLength; i++) { String::Utf8Value utf8(m_isolate, jsArr->Get(context, i).ToLocalChecked()->ToString( context).ToLocalChecked()); JniLocalRef s(env.NewString((jchar *) *utf8, 1)); const char *singleChar = env.GetStringUTFChars(s, nullptr); - jchar value = *singleChar; + chars[i] = *singleChar; env.ReleaseStringUTFChars(s, singleChar); - env.SetCharArrayRegion((jcharArray) arr, i, 1, &value); } + env.SetCharArrayRegion((jcharArray) arr, 0, arrLength, chars); break; - case 'S': + } + case 'S': { arr = env.NewShortArray(arrLength); + jshort shorts[arrLength]; for (jsize i = 0; i < arrLength; i++) { - jshort value = jsArr->Get(context, i).ToLocalChecked()->Int32Value( - context).ToChecked(); - env.SetShortArrayRegion((jshortArray) arr, i, 1, &value); + shorts[i] = jsArr + ->Get(context, i) + .ToLocalChecked() + ->Int32Value(context) + .ToChecked(); } + env.SetShortArrayRegion((jshortArray) arr, 0, arrLength, shorts); break; - case 'I': + } + case 'I': { arr = env.NewIntArray(arrLength); + jint ints[arrLength]; for (jsize i = 0; i < arrLength; i++) { - jint value = jsArr->Get(context, i).ToLocalChecked()->Int32Value( - context).ToChecked(); - env.SetIntArrayRegion((jintArray) arr, i, 1, &value); + ints[i] = jsArr + ->Get(context, i) + .ToLocalChecked() + ->Int32Value(context) + .ToChecked(); } + env.SetIntArrayRegion((jintArray) arr, 0, arrLength, ints); break; - case 'J': + } + case 'J': { arr = env.NewLongArray(arrLength); + jlong longs[arrLength]; for (jsize i = 0; i < arrLength; i++) { - jlong value = jsArr->Get(context, i).ToLocalChecked()->NumberValue( - context).ToChecked(); - env.SetLongArrayRegion((jlongArray) arr, i, 1, &value); + longs[i] = jsArr + ->Get(context, i) + .ToLocalChecked() + ->NumberValue(context) + .ToChecked(); } + env.SetLongArrayRegion((jlongArray) arr, 0, arrLength, longs); break; - case 'F': + } + case 'F': { arr = env.NewFloatArray(arrLength); + jfloat floats[arrLength]; for (jsize i = 0; i < arrLength; i++) { - jfloat value = jsArr->Get(context, i).ToLocalChecked()->NumberValue( - context).ToChecked(); - env.SetFloatArrayRegion((jfloatArray) arr, i, 1, &value); + floats[i] = jsArr + ->Get(context, i) + .ToLocalChecked() + ->NumberValue(context) + .ToChecked(); } + env.SetFloatArrayRegion((jfloatArray) arr, 0, arrLength, floats); break; - case 'D': + } + case 'D': { arr = env.NewDoubleArray(arrLength); + jdouble doubles[arrLength]; for (jsize i = 0; i < arrLength; i++) { - jdouble value = jsArr->Get(context, i).ToLocalChecked()->NumberValue( - context).ToChecked(); - env.SetDoubleArrayRegion((jdoubleArray) arr, i, 1, &value); + doubles[i] = jsArr + ->Get(context, i) + .ToLocalChecked() + ->NumberValue(context) + .ToChecked(); } + env.SetDoubleArrayRegion((jdoubleArray) arr, 0, arrLength, doubles); break; + } case 'L': strippedClassName = elementType.substr(1, elementType.length() - 2); elementClass = env.FindClass(strippedClassName); @@ -685,10 +688,11 @@ JsArgConverter::Error JsArgConverter::GetError() const { JsArgConverter::~JsArgConverter() { if (m_argsLen > 0) { JEnv env; - int length = m_storedObjects.size(); - for (int i = 0; i < length; i++) { - int index = m_storedObjects[i]; - env.DeleteLocalRef(m_args[index].l); + for (int i = 0; i < m_args_refs_size; i++) { + int index = m_args_refs[i]; + if (index != -1) { + env.DeleteLocalRef(m_args[index].l); + } } } } diff --git a/test-app/runtime/src/main/cpp/JsArgConverter.h b/test-app/runtime/src/main/cpp/JsArgConverter.h index d3ec9d2a7..ba4678d88 100644 --- a/test-app/runtime/src/main/cpp/JsArgConverter.h +++ b/test-app/runtime/src/main/cpp/JsArgConverter.h @@ -9,16 +9,16 @@ namespace tns { -enum class BufferCastType { - Byte, - Short, - Int, - Long, - Float, - Double -}; - -class JsArgConverter { + enum class BufferCastType { + Byte, + Short, + Int, + Long, + Float, + Double + }; + + class JsArgConverter { public: JsArgConverter(const v8::Local& caller, const v8::FunctionCallbackInfo& args, const std::string& methodSignature, MetadataEntry* entry); @@ -41,14 +41,14 @@ class JsArgConverter { struct Error { Error() : - index(-1), msg(std::string()) { + index(-1), msg(std::string()) { } int index; std::string msg; }; - static BufferCastType GetCastType(const v8::Local& view); + static BufferCastType GetCastType(const v8::Local& view); private: @@ -74,15 +74,15 @@ class JsArgConverter { bool m_isValid; jvalue m_args[255]; + int m_args_refs[255]; + int m_args_refs_size = 0; std::string m_methodSignature; std::vector m_tokens; - std::vector m_storedObjects; - Error m_error; -}; + }; } #endif /* JSARGCONVERTER_H_ */ diff --git a/test-app/runtime/src/main/cpp/JsArgToArrayConverter.cpp b/test-app/runtime/src/main/cpp/JsArgToArrayConverter.cpp index 7872e63c5..485e5efac 100644 --- a/test-app/runtime/src/main/cpp/JsArgToArrayConverter.cpp +++ b/test-app/runtime/src/main/cpp/JsArgToArrayConverter.cpp @@ -17,8 +17,10 @@ using namespace tns; /* * Converts a single JavaScript (V8) object to its respective Java representation */ -JsArgToArrayConverter::JsArgToArrayConverter(Local context, const v8::Local& arg, bool isImplementationObject, int classReturnType) - : m_arr(nullptr), m_argsAsObject(nullptr), m_argsLen(0), m_isValid(false), m_error(Error()), m_return_type(classReturnType) { +JsArgToArrayConverter::JsArgToArrayConverter(Local context, const v8::Local &arg, + bool isImplementationObject, int classReturnType) + : m_arr(nullptr), m_argsAsObject(nullptr), m_argsLen(0), m_isValid(false), m_error(Error()), + m_return_type(classReturnType) { if (!isImplementationObject) { m_argsLen = 1; m_argsAsObject = new jobject[m_argsLen]; @@ -31,8 +33,10 @@ JsArgToArrayConverter::JsArgToArrayConverter(Local context, const v8::L /* * Converts an array of JavaScript (V8) objects to a Java array of objects */ -JsArgToArrayConverter::JsArgToArrayConverter(const v8::FunctionCallbackInfo& args, bool hasImplementationObject) - : m_arr(nullptr), m_argsAsObject(nullptr), m_argsLen(0), m_isValid(false), m_error(Error()), m_return_type(static_cast(Type::Null)) { +JsArgToArrayConverter::JsArgToArrayConverter(const v8::FunctionCallbackInfo &args, + bool hasImplementationObject) + : m_arr(nullptr), m_argsAsObject(nullptr), m_argsLen(0), m_isValid(false), m_error(Error()), + m_return_type(static_cast(Type::Null)) { m_argsLen = !hasImplementationObject ? args.Length() : args.Length() - 2; bool success = true; @@ -54,7 +58,7 @@ JsArgToArrayConverter::JsArgToArrayConverter(const v8::FunctionCallbackInfo context, const Local& arg, int index) { +bool JsArgToArrayConverter::ConvertArg(Local context, const Local &arg, int index) { bool success = false; stringstream s; @@ -66,7 +70,7 @@ bool JsArgToArrayConverter::ConvertArg(Local context, const LocalIsInt32() && (returnType == Type::Int || returnType == Type::Null)) { + } else if (arg->IsInt32() && (returnType == Type::Int || returnType == Type::Null)) { jint value = arg->Int32Value(context).ToChecked(); auto javaObject = JType::NewInt(env, value); SetConvertedObject(env, index, javaObject); @@ -85,7 +89,8 @@ bool JsArgToArrayConverter::ConvertArg(Local context, const Local context, const Local context, const LocalGetObjectManager(); switch (castType) { - case CastType::Char: - castValue = NumericCasts::GetCastValue(jsObj); - charValue = '\0'; - if (castValue->IsString()) { - string str = ArgConverter::ConvertToString(castValue->ToString(context).ToLocalChecked()); - charValue = (jchar) str[0]; - } - javaObject = JType::NewChar(env, charValue); - SetConvertedObject(env, index, javaObject); - success = true; - break; - - case CastType::Byte: - castValue = NumericCasts::GetCastValue(jsObj); - byteValue = 0; - if (castValue->IsString()) { - string value = ArgConverter::ConvertToString(castValue->ToString(context).ToLocalChecked()); - int byteArg = atoi(value.c_str()); - byteValue = (jbyte) byteArg; - } else if (castValue->IsInt32()) { - int byteArg = castValue->ToInt32(context).ToLocalChecked()->Int32Value(context).ToChecked(); - byteValue = (jbyte) byteArg; - } - javaObject = JType::NewByte(env, byteValue); - SetConvertedObject(env, index, javaObject); - success = true; - break; - - case CastType::Short: - castValue = NumericCasts::GetCastValue(jsObj); - shortValue = 0; - if (castValue->IsString()) { - string value = ArgConverter::ConvertToString(castValue->ToString(context).ToLocalChecked()); - int shortArg = atoi(value.c_str()); - shortValue = (jshort) shortArg; - } else if (castValue->IsInt32()) { - jlong shortArg = castValue->ToInt32(context).ToLocalChecked()->Int32Value(context).ToChecked(); - shortValue = (jshort) shortArg; - } - javaObject = JType::NewShort(env, shortValue); - SetConvertedObject(env, index, javaObject); - success = true; - break; - - case CastType::Long: - castValue = NumericCasts::GetCastValue(jsObj); - longValue = 0; - if (castValue->IsString()) { - auto strValue = ArgConverter::ConvertToString(castValue->ToString(context).ToLocalChecked()); - longValue = atoll(strValue.c_str()); - } else if (castValue->IsInt32()) { - longValue = castValue->ToInt32(context).ToLocalChecked()->Int32Value(context).ToChecked(); - } - javaObject = JType::NewLong(env, longValue); - SetConvertedObject(env, index, javaObject); - success = true; - break; - - case CastType::Float: - castValue = NumericCasts::GetCastValue(jsObj); - floatValue = 0; - if (castValue->IsNumber()) { - double floatArg = castValue->ToNumber(context).ToLocalChecked()->NumberValue(context).ToChecked(); - floatValue = (jfloat) floatArg; - } - javaObject = JType::NewFloat(env, floatValue); - SetConvertedObject(env, index, javaObject); - success = true; - break; - - case CastType::Double: - castValue = NumericCasts::GetCastValue(jsObj); - doubleValue = 0; - if (castValue->IsNumber()) { - double doubleArg = castValue->ToNumber(context).ToLocalChecked()->NumberValue(context).ToChecked(); - doubleValue = (jdouble) doubleArg; - } - javaObject = JType::NewDouble(env, doubleValue); - SetConvertedObject(env, index, javaObject); - success = true; - break; + case CastType::Char: + castValue = NumericCasts::GetCastValue(jsObj); + charValue = '\0'; + if (castValue->IsString()) { + string str = ArgConverter::ConvertToString( + castValue->ToString(context).ToLocalChecked()); + charValue = (jchar) str[0]; + } + javaObject = JType::NewChar(env, charValue); + SetConvertedObject(env, index, javaObject); + success = true; + break; + + case CastType::Byte: + castValue = NumericCasts::GetCastValue(jsObj); + byteValue = 0; + if (castValue->IsString()) { + string value = ArgConverter::ConvertToString( + castValue->ToString(context).ToLocalChecked()); + int byteArg = atoi(value.c_str()); + byteValue = (jbyte) byteArg; + } else if (castValue->IsInt32()) { + int byteArg = castValue->ToInt32(context).ToLocalChecked()->Int32Value( + context).ToChecked(); + byteValue = (jbyte) byteArg; + } + javaObject = JType::NewByte(env, byteValue); + SetConvertedObject(env, index, javaObject); + success = true; + break; + + case CastType::Short: + castValue = NumericCasts::GetCastValue(jsObj); + shortValue = 0; + if (castValue->IsString()) { + string value = ArgConverter::ConvertToString( + castValue->ToString(context).ToLocalChecked()); + int shortArg = atoi(value.c_str()); + shortValue = (jshort) shortArg; + } else if (castValue->IsInt32()) { + jlong shortArg = castValue->ToInt32(context).ToLocalChecked()->Int32Value( + context).ToChecked(); + shortValue = (jshort) shortArg; + } + javaObject = JType::NewShort(env, shortValue); + SetConvertedObject(env, index, javaObject); + success = true; + break; + + case CastType::Long: + castValue = NumericCasts::GetCastValue(jsObj); + longValue = 0; + if (castValue->IsString()) { + auto strValue = ArgConverter::ConvertToString( + castValue->ToString(context).ToLocalChecked()); + longValue = atoll(strValue.c_str()); + } else if (castValue->IsInt32()) { + longValue = castValue->ToInt32(context).ToLocalChecked()->Int32Value( + context).ToChecked(); + } + javaObject = JType::NewLong(env, longValue); + SetConvertedObject(env, index, javaObject); + success = true; + break; + + case CastType::Float: + castValue = NumericCasts::GetCastValue(jsObj); + floatValue = 0; + if (castValue->IsNumber()) { + double floatArg = castValue->ToNumber(context).ToLocalChecked()->NumberValue( + context).ToChecked(); + floatValue = (jfloat) floatArg; + } + javaObject = JType::NewFloat(env, floatValue); + SetConvertedObject(env, index, javaObject); + success = true; + break; + + case CastType::Double: + castValue = NumericCasts::GetCastValue(jsObj); + doubleValue = 0; + if (castValue->IsNumber()) { + double doubleArg = castValue->ToNumber(context).ToLocalChecked()->NumberValue( + context).ToChecked(); + doubleValue = (jdouble) doubleArg; + } + javaObject = JType::NewDouble(env, doubleValue); + SetConvertedObject(env, index, javaObject); + success = true; + break; + + case CastType::None: + obj = objectManager->GetJavaObjectByJsObject(jsObj); - case CastType::None: - obj = objectManager->GetJavaObjectByJsObject(jsObj); - if (obj.IsNull() && (jsObj->IsTypedArray() || jsObj->IsArrayBuffer() || jsObj->IsArrayBufferView())) - { + if (obj.IsNull() && (jsObj->IsTypedArray() || jsObj->IsArrayBuffer() || + jsObj->IsArrayBufferView())) { BufferCastType bufferCastType = tns::BufferCastType::Byte; shared_ptr store; size_t offset = 0; size_t length; uint8_t *data = nullptr; - if (jsObj->IsArrayBuffer()) - { + if (jsObj->IsArrayBuffer()) { auto array = jsObj.As(); store = array->GetBackingStore(); length = array->ByteLength(); data = static_cast(store->Data()); - - if (data == nullptr) { - data = static_cast(array->GetContents().Data()); - } - } - else if (jsObj->IsArrayBufferView()) - { + } else if (jsObj->IsArrayBufferView()) { auto array = jsObj.As(); + offset = array->ByteOffset(); length = array->ByteLength(); store = array->Buffer()->GetBackingStore(); bufferCastType = JsArgConverter::GetCastType(array); - data = static_cast(store->Data()) + offset; - - if (data == nullptr) { - data = static_cast(array->Buffer()->GetContents().Data()) + - offset; - } - } - else - { + } else { auto array = jsObj.As(); offset = array->ByteOffset(); store = array->Buffer()->GetBackingStore(); length = array->ByteLength(); bufferCastType = JsArgConverter::GetCastType(array); - data = static_cast(store->Data()) + offset; - - if (data == nullptr) { - data = static_cast(array->Buffer()->GetContents().Data()) + - offset; - } - } - auto directBuffer = env.NewDirectByteBuffer( data, length); @@ -295,52 +289,43 @@ bool JsArgToArrayConverter::ConvertArg(Local context, const Local context, const LocalGetOrCreateObjectId(buffer); auto clazz = env.GetObjectClass(buffer); objectManager->Link(jsObj, id, clazz); + obj = objectManager->GetJavaObjectByJsObject(jsObj); } - V8GetPrivateValue(isolate, jsObj, V8StringConstants::GetNullNodeName(isolate), castValue); - if (!castValue.IsEmpty()) { - auto node = reinterpret_cast(castValue.As()->Value()); + V8GetPrivateValue(isolate, jsObj, V8StringConstants::GetNullNodeName(isolate), + castValue); - if (node == nullptr) { - s << "Cannot get type of the null argument at index " << index; - success = false; - break; - } + if (!castValue.IsEmpty()) { + auto node = reinterpret_cast(castValue.As()->Value()); - auto type = node->GetName(); - auto nullObjName = "com/tns/NullObject"; - auto nullObjCtorSig = "(Ljava/lang/Class;)V"; + if (node == nullptr) { + s << "Cannot get type of the null argument at index " << index; + success = false; + break; + } - jclass nullClazz = env.FindClass(nullObjName); - jmethodID ctor = env.GetMethodID(nullClazz, "", nullObjCtorSig); - jclass clazzToNull = env.FindClass(type.c_str()); - jobject nullObjType = env.NewObject(nullClazz, ctor, clazzToNull); + auto type = node->GetName(); + auto nullObjName = "com/tns/NullObject"; + auto nullObjCtorSig = "(Ljava/lang/Class;)V"; - if (nullObjType != nullptr) { - SetConvertedObject(env, index, nullObjType, false); - } else { - SetConvertedObject(env, index, nullptr); - } + jclass nullClazz = env.FindClass(nullObjName); + jmethodID ctor = env.GetMethodID(nullClazz, "", nullObjCtorSig); + jclass clazzToNull = env.FindClass(type.c_str()); + jobject nullObjType = env.NewObject(nullClazz, ctor, clazzToNull); - success = true; - return success; - } + if (nullObjType != nullptr) { + SetConvertedObject(env, index, nullObjType, false); + } else { + SetConvertedObject(env, index, nullptr); + } - success = !obj.IsNull(); - if (success) { - SetConvertedObject(env, index, obj.Move(), obj.IsGlobal()); - } else { - String::Utf8Value jsObjStr(isolate, jsObj); - s << "Cannot marshal JavaScript argument " << (*jsObjStr ? *jsObjStr : "") << " at index " << index << " to Java type."; - } - break; + success = true; + return success; + } + + success = !obj.IsNull(); + if (success) { + SetConvertedObject(env, index, obj.Move(), obj.IsGlobal()); + } else { + String::Utf8Value jsObjStr(isolate, jsObj); + s << "Cannot marshal JavaScript argument " + << (*jsObjStr ? *jsObjStr : "") << " at index " << index + << " to Java type."; + } + break; - default: - throw NativeScriptException("Unsupported cast type"); + default: + throw NativeScriptException("Unsupported cast type"); } } else if (arg->IsUndefined() || arg->IsNull()) { SetConvertedObject(env, index, nullptr); @@ -414,7 +404,7 @@ jobject JsArgToArrayConverter::GetConvertedArg() { return (m_argsLen > 0) ? m_argsAsObject[0] : nullptr; } -void JsArgToArrayConverter::SetConvertedObject(JEnv& env, int index, jobject obj, bool isGlobal) { +void JsArgToArrayConverter::SetConvertedObject(JEnv &env, int index, jobject obj, bool isGlobal) { m_argsAsObject[index] = obj; if ((obj != nullptr) && !isGlobal) { m_storedIndexes.push_back(index); @@ -437,7 +427,8 @@ jobjectArray JsArgToArrayConverter::ToJavaArray() { if ((m_arr == nullptr) && (m_argsLen > 0)) { if (m_argsLen >= JsArgToArrayConverter::MAX_JAVA_PARAMS_COUNT) { stringstream ss; - ss << "You are trying to override more than the MAX_JAVA_PARAMS_COUNT: " << JsArgToArrayConverter::MAX_JAVA_PARAMS_COUNT; + ss << "You are trying to override more than the MAX_JAVA_PARAMS_COUNT: " + << JsArgToArrayConverter::MAX_JAVA_PARAMS_COUNT; throw NativeScriptException(ss.str()); } @@ -447,7 +438,9 @@ jobjectArray JsArgToArrayConverter::ToJavaArray() { JsArgToArrayConverter::JAVA_LANG_OBJECT_CLASS = env.FindClass("java/lang/Object"); } - JniLocalRef tmpArr(env.NewObjectArray(m_argsLen, JsArgToArrayConverter::JAVA_LANG_OBJECT_CLASS, nullptr)); + JniLocalRef tmpArr( + env.NewObjectArray(m_argsLen, JsArgToArrayConverter::JAVA_LANG_OBJECT_CLASS, + nullptr)); m_arr = (jobjectArray) env.NewGlobalRef(tmpArr); for (int i = 0; i < m_argsLen; i++) { diff --git a/test-app/runtime/src/main/cpp/JsV8InspectorClient.cpp b/test-app/runtime/src/main/cpp/JsV8InspectorClient.cpp index fb11caf80..4c356324c 100644 --- a/test-app/runtime/src/main/cpp/JsV8InspectorClient.cpp +++ b/test-app/runtime/src/main/cpp/JsV8InspectorClient.cpp @@ -1,10 +1,15 @@ #include "JsV8InspectorClient.h" #include #include +#include +#include +#include +#include +#include + #include "Runtime.h" #include "NativeScriptException.h" -#include #include "ArgConverter.h" #include "DOMDomainCallbackHandlers.h" #include "NetworkDomainCallbackHandlers.h" @@ -15,33 +20,55 @@ using namespace v8; using namespace v8_inspector; +// Utility functions for converting between inspector StringView and UTF8 string + +static inline v8_inspector::StringView stringToStringView(const std::string &str) { + auto* chars = reinterpret_cast(str.c_str()); + return { chars, str.length() }; +} + +static inline std::string stringViewToString(v8::Isolate* isolate, const v8_inspector::StringView& stringView) { + int length = static_cast(stringView.length()); + if (!length) { + return ""; + } + v8::Local message = ( + stringView.is8Bit() ? + v8::String::NewFromOneByte(isolate, reinterpret_cast(stringView.characters8()), v8::NewStringType::kNormal, length) : + v8::String::NewFromTwoByte(isolate, reinterpret_cast(stringView.characters16()), v8::NewStringType::kNormal, length) + ) .ToLocalChecked(); + v8::String::Utf8Value result(isolate, message); + return *result; +} + JsV8InspectorClient::JsV8InspectorClient(v8::Isolate* isolate) : isolate_(isolate), inspector_(nullptr), session_(nullptr), - connection(nullptr), + connection_(nullptr), context_(), + terminated_(true), running_nested_loop_(false), - isConnected(false) { + isConnected_(false) { JEnv env; - inspectorClass = env.FindClass("com/tns/AndroidJsV8Inspector"); - assert(inspectorClass != nullptr); + inspectorClass_ = env.FindClass("com/tns/AndroidJsV8Inspector"); + assert(inspectorClass_ != nullptr); - sendMethod = env.GetStaticMethodID(inspectorClass, "send", "(Ljava/lang/Object;Ljava/lang/String;)V"); - assert(sendMethod != nullptr); + sendMethod_ = env.GetStaticMethodID(inspectorClass_, "send", "(Ljava/lang/Object;Ljava/lang/String;)V"); + assert(sendMethod_ != nullptr); - sendToDevToolsConsoleMethod = env.GetStaticMethodID(inspectorClass, "sendToDevToolsConsole", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V"); - assert(sendToDevToolsConsoleMethod != nullptr); + sendToDevToolsConsoleMethod_ = env.GetStaticMethodID(inspectorClass_, "sendToDevToolsConsole", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)V"); + assert(sendToDevToolsConsoleMethod_ != nullptr); - getInspectorMessageMethod = env.GetStaticMethodID(inspectorClass, "getInspectorMessage", "(Ljava/lang/Object;)Ljava/lang/String;"); - assert(getInspectorMessageMethod != nullptr); + getInspectorMessageMethod_ = env.GetStaticMethodID(inspectorClass_, "getInspectorMessage", "(Ljava/lang/Object;)Ljava/lang/String;"); + assert(getInspectorMessageMethod_ != nullptr); } void JsV8InspectorClient::connect(jobject connection) { JEnv env; - this->connection = env.NewGlobalRef(connection); - this->isConnected = true; + connection_ = env.NewGlobalRef(connection); + isConnected_ = true; } void JsV8InspectorClient::scheduleBreak() { @@ -51,15 +78,15 @@ void JsV8InspectorClient::scheduleBreak() { auto context = Runtime::GetRuntime(isolate_)->GetContext(); Context::Scope context_scope(context); - this->session_->schedulePauseOnNextStatement(v8_inspector::StringView(), v8_inspector::StringView()); + session_->schedulePauseOnNextStatement({}, {}); } -void JsV8InspectorClient::createInspectorSession(v8::Isolate* isolate, const v8::Local& context) { - session_ = inspector_->connect(JsV8InspectorClient::contextGroupId, this, v8_inspector::StringView()); +void JsV8InspectorClient::createInspectorSession() { + session_ = inspector_->connect(JsV8InspectorClient::contextGroupId, this, {}); } void JsV8InspectorClient::disconnect() { - if (this->connection == nullptr) { + if (connection_ == nullptr) { return; } @@ -71,11 +98,11 @@ void JsV8InspectorClient::disconnect() { session_.reset(); JEnv env; - env.DeleteGlobalRef(this->connection); - this->connection = nullptr; - this->isConnected = false; + env.DeleteGlobalRef(connection_); + connection_ = nullptr; + isConnected_ = false; - this->createInspectorSession(isolate_, JsV8InspectorClient::PersistentToLocal(isolate_, context_)); + createInspectorSession(); } @@ -86,7 +113,9 @@ void JsV8InspectorClient::dispatchMessage(const std::string& message) { auto context = Runtime::GetRuntime(isolate_)->GetContext(); Context::Scope context_scope(context); - this->doDispatchMessage(isolate_, message); + doDispatchMessage(message); + // TODO: check why this is needed (it should trigger automatically when script depth is 0) + isolate_->PerformMicrotaskCheckpoint(); } void JsV8InspectorClient::runMessageLoopOnPause(int context_group_id) { @@ -99,10 +128,10 @@ void JsV8InspectorClient::runMessageLoopOnPause(int context_group_id) { terminated_ = false; running_nested_loop_ = true; while (!terminated_) { - JniLocalRef msg(env.CallStaticObjectMethod(inspectorClass, getInspectorMessageMethod, this->connection)); + JniLocalRef msg(env.CallStaticObjectMethod(inspectorClass_, getInspectorMessageMethod_, connection_)); if (!msg.IsNull()) { auto inspectorMessage = ArgConverter::jstringToString(msg); - this->doDispatchMessage(this->isolate_, inspectorMessage); + doDispatchMessage(inspectorMessage); } while (v8::platform::PumpMessageLoop(Runtime::platform, isolate_)) { @@ -117,17 +146,15 @@ void JsV8InspectorClient::quitMessageLoopOnPause() { } v8::Local JsV8InspectorClient::ensureDefaultContextInGroup(int contextGroupId) { - v8::Local context = PersistentToLocal(isolate_, context_); - return context; + return context_.Get(isolate_); } -void JsV8InspectorClient::doDispatchMessage(v8::Isolate* isolate, const std::string& message) { +void JsV8InspectorClient::doDispatchMessage(const std::string& message) { if (session_ == nullptr) { return; } - const v8_inspector::String16 msg = v8_inspector::String16::fromUTF8(message.c_str(), message.length()); - v8_inspector::StringView message_view = toStringView(msg); + v8_inspector::StringView message_view = stringToStringView(message); session_->dispatchProtocolMessage(message_view); } @@ -135,49 +162,22 @@ void JsV8InspectorClient::sendResponse(int callId, std::unique_ptr sendNotification(std::move(message)); } -static v8_inspector::String16 ToString16(const v8_inspector::StringView& string) { - if (string.is8Bit()) { - return v8_inspector::String16(reinterpret_cast(string.characters8()), string.length()); - } - - return v8_inspector::String16(reinterpret_cast(string.characters16()), string.length()); -} - void JsV8InspectorClient::sendNotification(std::unique_ptr message) { - if (inspectorClass == nullptr || this->connection == nullptr) { + if (connection_ == nullptr) { return; } - v8_inspector::String16 msg = ToString16(message->string()); + const std::string msg = stringViewToString(isolate_, message->string()); JEnv env; // TODO: Pete: Check if we can use a wide (utf 16) string here - JniLocalRef str(env.NewStringUTF(msg.utf8().c_str())); - env.CallStaticVoidMethod(inspectorClass, sendMethod, this->connection, (jstring) str); + JniLocalRef str(env.NewStringUTF(msg.c_str())); + env.CallStaticVoidMethod(inspectorClass_, sendMethod_, connection_, (jstring) str); } void JsV8InspectorClient::flushProtocolNotifications() { } -template -inline v8::Local StrongPersistentToLocal(const v8::Persistent& persistent) { - return *reinterpret_cast *>(const_cast *>(&persistent)); -} - -template -inline v8::Local WeakPersistentToLocal(v8::Isolate* isolate, const v8::Persistent& persistent) { - return v8::Local::New(isolate, persistent); -} - -template -inline v8::Local JsV8InspectorClient::PersistentToLocal(v8::Isolate* isolate, const v8::Persistent& persistent) { - if (persistent.IsWeak()) { - return WeakPersistentToLocal(isolate, persistent); - } else { - return StrongPersistentToLocal(persistent); - } -} - void JsV8InspectorClient::init() { if (inspector_ != nullptr) { return; @@ -190,12 +190,11 @@ void JsV8InspectorClient::init() { inspector_ = V8Inspector::create(isolate_, this); - inspector_->contextCreated(v8_inspector::V8ContextInfo(context, JsV8InspectorClient::contextGroupId, v8_inspector::StringView())); + inspector_->contextCreated(v8_inspector::V8ContextInfo(context, JsV8InspectorClient::contextGroupId, {})); - v8::Persistent persistentContext(context->GetIsolate(), JsV8InspectorClient::PersistentToLocal(isolate_, context_)); - context_.Reset(isolate_, persistentContext); + context_.Reset(isolate_, context); - this->createInspectorSession(isolate_, context); + createInspectorSession(); } JsV8InspectorClient* JsV8InspectorClient::GetInstance() { @@ -206,8 +205,27 @@ JsV8InspectorClient* JsV8InspectorClient::GetInstance() { return instance; } +void JsV8InspectorClient::inspectorSendEventCallback(const FunctionCallbackInfo& args) { + if ((instance == nullptr) || (instance->connection_ == nullptr)) { + return; + } + Isolate* isolate = args.GetIsolate(); + + Local arg = args[0].As(); + std::string message = ArgConverter::ConvertToString(arg); + + JEnv env; + // TODO: Pete: Check if we can use a wide (utf 16) string here + JniLocalRef str(env.NewStringUTF(message.c_str())); + env.CallStaticVoidMethod(instance->inspectorClass_, instance->sendMethod_, instance->connection_, (jstring) str); + + // TODO: ios uses this method, but doesn't work on android + // so I'm just sending directly to the socket (which seems to work) + //instance->dispatchMessage(message); +} + void JsV8InspectorClient::sendToFrontEndCallback(const v8::FunctionCallbackInfo& args) { - if ((instance == nullptr) || (instance->connection == nullptr)) { + if ((instance == nullptr) || (instance->connection_ == nullptr)) { return; } @@ -225,7 +243,7 @@ void JsV8InspectorClient::sendToFrontEndCallback(const v8::FunctionCallbackInfo< JEnv env; JniLocalRef str(env.NewStringUTF(message.c_str())); JniLocalRef lev(env.NewStringUTF(level.c_str())); - env.CallStaticVoidMethod(inspectorClass, sendToDevToolsConsoleMethod, instance->connection, (jstring) str, (jstring)lev); + env.CallStaticVoidMethod(instance->inspectorClass_, instance->sendToDevToolsConsoleMethod_, instance->connection_, (jstring) str, (jstring)lev); } } catch (NativeScriptException& e) { e.ReThrowToV8(); @@ -240,52 +258,26 @@ void JsV8InspectorClient::sendToFrontEndCallback(const v8::FunctionCallbackInfo< } } -void JsV8InspectorClient::consoleLogCallback(Isolate* isolate, const string& message, const string& logLevel) { +void JsV8InspectorClient::consoleLogCallback(Isolate* isolate, ConsoleAPIType method, const std::vector>& args) { if (!inspectorIsConnected()) { return; } - auto stack = v8::StackTrace::CurrentStackTrace(isolate, 1, v8::StackTrace::StackTraceOptions::kDetailed); + // Note, here we access private V8 API + auto* impl = reinterpret_cast(instance->inspector_.get()); + auto* session = reinterpret_cast(instance->session_.get()); - auto frame = stack->GetFrame(isolate, 0); + std::unique_ptr stack = impl->debugger()->captureStackTrace(false); - // will be no-op in non-debuggable builds - v8_inspector::V8LogAgentImpl::EntryAdded(message, logLevel, ArgConverter::ConvertToString(frame->GetScriptNameOrSourceURL()), frame->GetLineNumber()); -} + v8::Local context = instance->context_.Get(instance->isolate_); + const int contextId = V8ContextInfo::executionContextId(context); + + std::unique_ptr msg = + v8_inspector::V8ConsoleMessage::createForConsoleAPI( + context, contextId, contextGroupId, impl, instance->currentTimeMS(), + method, args, String16{}, std::move(stack)); -void MessageHandler(v8::Local message, v8::Local exception) { -// v8::Isolate *isolate = v8::Isolate::GetCurrent(); -// v8::Local context = isolate->GetEnteredContext(); -// if (context.IsEmpty()) return; -// v8_inspector::V8Inspector *inspector = InspectorClientImpl::InspectorFromContext(context); -// -// v8::Local stack = message->GetStackTrace(); -// int script_id = message->GetScriptOrigin().ScriptID()->Value(); -// if (!stack.IsEmpty() && stack->GetFrameCount() > 0) -// { -// int top_script_id = stack->GetFrame(0)->GetScriptId(); -// if (top_script_id == script_id) script_id = 0; -// } -// int line_number = message->GetLineNumber(context).FromMaybe(0); -// int column_number = 0; -// if (message->GetStartColumn(context).IsJust()) -// column_number = message->GetStartColumn(context).FromJust() + 1; -// -// v8_inspector::StringView detailed_message; -// v8_inspector::String16 message_text_string = ToString16(message->Get()); -// v8_inspector::StringView message_text(message_text_string.characters16(), -// message_text_string.length()); -// v8_inspector::String16 url_string; -// if (message->GetScriptOrigin().ResourceName()->IsString()) -// { -// url_string = -// ToString16(message->GetScriptOrigin().ResourceName().As()); -// } -// v8_inspector::StringView url(url_string.characters16(), url_string.length()); -// -// inspector->exceptionThrown(context, message_text, exception, detailed_message, -// url, line_number, column_number, -// inspector->createStackTrace(stack), script_id); + session->runtimeAgent()->messageAdded(msg.get()); } void JsV8InspectorClient::attachInspectorCallbacks(Isolate* isolate, @@ -307,15 +299,11 @@ void JsV8InspectorClient::attachInspectorCallbacks(Isolate* isolate, inspectorJSObject->Set(ArgConverter::ConvertToV8String(isolate, "attributeRemoved"), FunctionTemplate::New(isolate, DOMDomainCallbackHandlers::AttributeRemovedCallback)); globalObjectTemplate->Set(ArgConverter::ConvertToV8String(isolate, "__inspector"), inspectorJSObject); + globalObjectTemplate->Set(ArgConverter::ConvertToV8String(isolate, "__inspectorSendEvent"), FunctionTemplate::New(isolate, JsV8InspectorClient::inspectorSendEventCallback)); } void JsV8InspectorClient::InspectorIsConnectedGetterCallback(v8::Local property, const v8::PropertyCallbackInfo& info) { - info.GetReturnValue().Set(JsV8InspectorClient::GetInstance()->isConnected); + info.GetReturnValue().Set(JsV8InspectorClient::GetInstance()->isConnected_); } JsV8InspectorClient* JsV8InspectorClient::instance = nullptr; -jclass JsV8InspectorClient::inspectorClass = nullptr; -jmethodID JsV8InspectorClient::sendMethod = nullptr; -jmethodID JsV8InspectorClient::sendToDevToolsConsoleMethod = nullptr; -jmethodID JsV8InspectorClient::getInspectorMessageMethod = nullptr; -int JsV8InspectorClient::contextGroupId = 1; diff --git a/test-app/runtime/src/main/cpp/JsV8InspectorClient.h b/test-app/runtime/src/main/cpp/JsV8InspectorClient.h index fd774fbbd..53d5c2f28 100644 --- a/test-app/runtime/src/main/cpp/JsV8InspectorClient.h +++ b/test-app/runtime/src/main/cpp/JsV8InspectorClient.h @@ -2,13 +2,11 @@ #define JSV8INSPECTORCLIENT_H_ #include +#include +#include #include "v8.h" #include "JEnv.h" -#include "src/inspector/v8-inspector-impl.h" -#include "src/inspector/v8-inspector-session-impl.h" #include "v8-inspector.h" -#include "src/inspector/protocol/Forward.h" -#include "src/inspector/string-16.h" using namespace v8_inspector; @@ -17,53 +15,56 @@ class JsV8InspectorClient : V8InspectorClient, v8_inspector::V8Inspector::Channe public: static JsV8InspectorClient* GetInstance(); - template - static v8::Local PersistentToLocal(v8::Isolate* isolate, const v8::Persistent& persistent); - void init(); void connect(jobject connection); void scheduleBreak(); - void createInspectorSession(v8::Isolate* isolate, const v8::Local& context); void disconnect(); void dispatchMessage(const std::string& message); - void doDispatchMessage(v8::Isolate* isolate, const std::string& message); + // Overrides of V8Inspector::Channel void sendResponse(int callId, std::unique_ptr message) override; void sendNotification(const std::unique_ptr message) override; void flushProtocolNotifications() override; static void sendToFrontEndCallback(const v8::FunctionCallbackInfo& args); - static void consoleLogCallback(v8::Isolate* isolate, const std::string& message, const std::string& logLevel); + static void consoleLogCallback(v8::Isolate* isolate, ConsoleAPIType method, const std::vector>& args); + static void inspectorSendEventCallback(const v8::FunctionCallbackInfo& args); + // Overrides of V8InspectorClient void runMessageLoopOnPause(int context_group_id) override; void quitMessageLoopOnPause() override; - v8::Local ensureDefaultContextInGroup(int contextGroupId) override; static void attachInspectorCallbacks(v8::Isolate* isolate, v8::Local& globalObjectTemplate); - static void InspectorIsConnectedGetterCallback(v8::Local property, const v8::PropertyCallbackInfo& info); static bool inspectorIsConnected() { - return JsV8InspectorClient::GetInstance()->isConnected; + return JsV8InspectorClient::GetInstance()->isConnected_; } - std::unique_ptr inspector_; - v8::Isolate* isolate_; - bool isConnected; - private: JsV8InspectorClient(v8::Isolate* isolate); + // Override of V8InspectorClient + v8::Local ensureDefaultContextInGroup(int contextGroupId) override; + + void createInspectorSession(); + void doDispatchMessage(const std::string& message); + + static void InspectorIsConnectedGetterCallback(v8::Local property, const v8::PropertyCallbackInfo& info); + static JsV8InspectorClient* instance; - static jclass inspectorClass; - static jmethodID sendMethod; - static jmethodID getInspectorMessageMethod; - static jmethodID sendToDevToolsConsoleMethod; - static int contextGroupId; + static constexpr int contextGroupId = 1; + v8::Isolate* isolate_; + std::unique_ptr inspector_; v8::Persistent context_; std::unique_ptr session_; - jobject connection; - bool running_nested_loop_; - bool terminated_; + jclass inspectorClass_; + jmethodID sendMethod_; + jmethodID getInspectorMessageMethod_; + jmethodID sendToDevToolsConsoleMethod_; + jobject connection_; + bool running_nested_loop_ : 1; + bool terminated_ : 1; + bool isConnected_ : 1; }; } diff --git a/test-app/runtime/src/main/cpp/MessageLoopTimer.cpp b/test-app/runtime/src/main/cpp/MessageLoopTimer.cpp index 2169fe77f..7d8b975f7 100644 --- a/test-app/runtime/src/main/cpp/MessageLoopTimer.cpp +++ b/test-app/runtime/src/main/cpp/MessageLoopTimer.cpp @@ -129,7 +129,8 @@ int MessageLoopTimer::PumpMessageLoopCallback(int fd, int events, void* data) { v8::HandleScope handleScope(isolate); while (v8::platform::PumpMessageLoop(Runtime::platform, isolate)) { - isolate->RunMicrotasks(); +// isolate->RunMicrotasks(); + isolate->PerformMicrotaskCheckpoint(); } return msg; diff --git a/test-app/runtime/src/main/cpp/MetadataNode.cpp b/test-app/runtime/src/main/cpp/MetadataNode.cpp index 4b31f067e..d1b2f818f 100644 --- a/test-app/runtime/src/main/cpp/MetadataNode.cpp +++ b/test-app/runtime/src/main/cpp/MetadataNode.cpp @@ -922,7 +922,6 @@ Local MetadataNode::GetConstructorFunctionTemplate(Isolate* is auto node = GetOrCreateInternal(treeNode); - JEnv env; // if we already have an exception (which will be rethrown later) // then we don't want to ignore the next exception @@ -998,10 +997,10 @@ Local MetadataNode::GetConstructorFunctionTemplate(Isolate* is wrappedCtorFunc->SetPrototype(context, baseCtorFunc); } - //cache "ctorFuncTemplate" - auto pft = new Persistent(isolate, ctorFuncTemplate); - CtorCacheData ctorCacheItem(pft, instanceMethodsCallbackData); - cache->CtorFuncCache.insert(make_pair(treeNode, ctorCacheItem)); + //cache "ctorFuncTemplate" + auto pft = new Persistent(isolate, ctorFuncTemplate); + CtorCacheData ctorCacheItem(pft, instanceMethodsCallbackData); + cache->CtorFuncCache.insert(make_pair(treeNode, ctorCacheItem)); SetInnerTypes(isolate, wrappedCtorFunc, treeNode); @@ -2027,7 +2026,7 @@ Local MetadataNode::Wrap(Isolate* isolate, const Local& func TryCatch tc(isolate); Local