Unverified Commit 7d15187d authored by Oleksandr Karpovich's avatar Oleksandr Karpovich Committed by GitHub

Fix svg npe (#274)

* Test for the crash:

```
java.lang.NullPointerException
	at org.jetbrains.skia.svg.SVGSVG.setViewBox(SVGSVG.kt:108)
	at org.jetbrains.skia.SvgTest.svg smoke(SvgTest.kt:45)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:176)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
```

* fix SVGSVG set viewBox
Co-authored-by: 's avatarIgor Demin <igordmn@gmail.com>
Co-authored-by: 's avatarOleksandr Karpovich <oleksandr.karpovich@jetbrains.com>
parent 2cc6a787
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="test" type="GradleRunConfiguration" factoryName="Gradle">
<configuration default="false" name="jvmTest" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="-Dskiko.test.window.test.enabled=true" />
<option name="scriptParameters" value="jvmTest -Dskiko.test.window.test.enabled=true" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="jvmTest" />
</list>
<list />
</option>
<option name="vmOptions" value="" />
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
......
......@@ -42,7 +42,7 @@ class SVGSVG internal constructor(ptr: NativePointer) : SVGContainer(ptr) {
set(value) {
setY(value)
}
fun setY(length: SVGLength): SVGSVG {
return try {
Stats.onNativeCall()
......@@ -105,7 +105,7 @@ class SVGSVG internal constructor(ptr: NativePointer) : SVGContainer(ptr) {
}
set(value) = try {
Stats.onNativeCall()
SVGSVG_nSetViewBox(_ptr, value!!.left, value.top, value.right, viewBox!!.bottom)
SVGSVG_nSetViewBox(_ptr, value!!.left, value.top, value.right, value.bottom)
} finally {
reachabilityBarrier(this)
}
......
package org.jetbrains.skia
import org.jetbrains.skia.svg.SVGDOM
import org.jetbrains.skia.svg.SVGLengthContext
import org.jetbrains.skia.svg.SVGLengthUnit
import org.jetbrains.skia.svg.SVGTag
import org.jetbrains.skiko.KotlinBackend
import org.jetbrains.skiko.kotlinBackend
import kotlin.test.Test
class SvgTest {
@Test
fun svg_smoke() {
val svgText = """
<svg version="1.1"
width="300" height="200"
xmlns="http://www.w3.org/2000/svg">
<rect width="100%" height="100%" fill="red" />
<circle cx="150" cy="100" r="80" fill="green" />
<text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>
</svg>
""".trimIndent()
val data = Data.makeFromBytes(svgText.encodeToByteArray())
val dom = SVGDOM(data)
require(!dom.isClosed)
dom.setContainerSize(Point(100f, 100f))
dom.setContainerSize(101f, 101f)
require(dom.root != null)
val e = dom.root!!
require(e.x.unit == SVGLengthUnit.NUMBER)
require(e.y.unit == SVGLengthUnit.NUMBER)
if (kotlinBackend == KotlinBackend.JVM) {
// TODO: disabled for other platforms until all methods implemented in JS/Native.
require(e.width.unit == SVGLengthUnit.NUMBER)
require(e.height.unit == SVGLengthUnit.NUMBER)
require(e.viewBox == null)
require(e.tag == SVGTag.SVG)
// e.viewBox = Rect(0f, 1f, 100f, 200f)
// assert(e.viewBox!!.top == 1f)
require(e.getIntrinsicSize(SVGLengthContext(100f, 100f)).x == 300f)
e.viewBox = Rect.makeXYWH(0f, 1f, 2f, 3f)
require(e.viewBox == Rect.makeXYWH(0f, 1f, 2f, 3f))
}
}
}
package org.jetbrains.skiko
import org.jetbrains.skia.*
import org.jetbrains.skia.Color4f
import org.jetbrains.skia.ColorFilter
import org.jetbrains.skia.ColorSpace
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.svg.SVGDOM
import org.jetbrains.skia.svg.SVGLengthContext
import org.jetbrains.skia.svg.SVGLengthUnit
import org.jetbrains.skia.svg.SVGTag
import kotlin.test.Test
class SkiaTest {
......@@ -22,40 +20,4 @@ class SkiaTest {
val table = ColorFilter.makeTableARGB(array, array, array, array)
require(table._ptr != Native.NullPointer)
}
@Test
fun `svg_smoke`() {
val svgText = """
<svg version="1.1"
width="300" height="200"
xmlns="http://www.w3.org/2000/svg">
<rect width="100%" height="100%" fill="red" />
<circle cx="150" cy="100" r="80" fill="green" />
<text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>
</svg>
""".trimIndent()
val data = Data.makeFromBytes(svgText.encodeToByteArray())
val dom = SVGDOM(data)
require(!dom.isClosed)
dom.setContainerSize(Point(100f, 100f))
dom.setContainerSize(101f, 101f)
require(dom.root != null)
val e = dom.root!!
require(e.x.unit == SVGLengthUnit.NUMBER)
require(e.y.unit == SVGLengthUnit.NUMBER)
if (false) {
// TODO: disabled until all methods implemented in JS/Native.
require(e.width.unit == SVGLengthUnit.NUMBER)
require(e.height.unit == SVGLengthUnit.NUMBER)
require(e.viewBox == null)
require(e.tag == SVGTag.SVG)
// e.viewBox = Rect(0f, 1f, 100f, 200f)
// assert(e.viewBox!!.top == 1f)
require(e.getIntrinsicSize(SVGLengthContext(100f, 100f)).x == 300f)
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment