chore(jcef): 更新缓存数据库日志文件
- 更新 shared_proto_db/metadata/000003.log 文件内容 - 更新 Site Characteristics Database/00003.log 文件内容 - 添加新的数据库条目和元数据记录 - 保持数据库文件格式的一致性 - 删除Vivid2D的内容 - 重写启动加载界面
This commit is contained in:
7
.idea/jsLibraryMappings.xml
generated
7
.idea/jsLibraryMappings.xml
generated
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="JavaScriptLibraryMappings">
|
|
||||||
<file url="file://$PROJECT_DIR$" libraries="{codemirror, font-awesome, monaco-editor}" />
|
|
||||||
<file url="file://$PROJECT_DIR$/src/main" libraries="{highlight.js, katex, marked, mathjax}" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
BIN
CrashReport.dmp
Normal file
BIN
CrashReport.dmp
Normal file
Binary file not shown.
263
build.gradle
263
build.gradle
@@ -1,36 +1,26 @@
|
|||||||
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
|
import org.gradle.internal.os.OperatingSystem
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id 'java'
|
id 'java'
|
||||||
id 'application'
|
id 'application'
|
||||||
id 'edu.sc.seis.launch4j' version '2.5.4'
|
|
||||||
id 'org.openjfx.javafxplugin' version '0.1.0'
|
id 'org.openjfx.javafxplugin' version '0.1.0'
|
||||||
id 'org.springframework.boot' version '3.2.0'
|
id 'org.springframework.boot' version '3.2.0'
|
||||||
id 'io.spring.dependency-management' version '1.1.4'
|
id 'io.spring.dependency-management' version '1.1.4'
|
||||||
id 'com.github.johnrengelman.shadow' version '8.1.1' apply false // 关闭 shadow
|
id 'edu.sc.seis.launch4j' version '2.5.4'
|
||||||
}
|
|
||||||
|
|
||||||
configurations {
|
|
||||||
all*.exclude group: 'org.openjfx', module: 'javafx'
|
|
||||||
proguardLib
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
javafx {
|
|
||||||
version = "21"
|
|
||||||
modules = [ 'javafx.controls', 'javafx.graphics', 'javafx.web' ]
|
|
||||||
}
|
|
||||||
|
|
||||||
// JDK 版本检查
|
|
||||||
def requiredJavaVersion = 20
|
|
||||||
def currentJavaVersion = JavaVersion.current().majorVersion.toInteger()
|
|
||||||
if (currentJavaVersion != requiredJavaVersion) {
|
|
||||||
throw new GradleException("构建需要 JDK ${requiredJavaVersion},但当前是 JDK ${currentJavaVersion}。请更换 JDK 环境。")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
group = 'com.axis.innovators.box'
|
group = 'com.axis.innovators.box'
|
||||||
version = '0.0.1'
|
version = '0.0.1'
|
||||||
|
|
||||||
|
// JDK 版本检查
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion = JavaLanguageVersion.of(20)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
maven { url 'https://maven.aliyun.com/repository/public' }
|
maven { url 'https://maven.aliyun.com/repository/public' }
|
||||||
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
|
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
|
||||||
@@ -38,10 +28,28 @@ repositories {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
// 操作系统 Native 标识符
|
||||||
// === 构建工具 ===
|
def lwjglNatives = ""
|
||||||
proguardLib files('libs/proguard.jar')
|
if (OperatingSystem.current().isWindows()) {
|
||||||
|
lwjglNatives = "natives-windows"
|
||||||
|
} else if (OperatingSystem.current().isLinux()) {
|
||||||
|
lwjglNatives = "natives-linux"
|
||||||
|
} else if (OperatingSystem.current().isMacOsX()) {
|
||||||
|
lwjglNatives = System.getProperty("os.arch") == "aarch64" ? "natives-macos-arm64" : "natives-macos"
|
||||||
|
}
|
||||||
|
|
||||||
|
javafx {
|
||||||
|
version = "21"
|
||||||
|
modules = [ 'javafx.controls', 'javafx.graphics', 'javafx.web', 'javafx.swing' ]
|
||||||
|
}
|
||||||
|
|
||||||
|
// 排除冲突的日志和旧版 FX
|
||||||
|
configurations {
|
||||||
|
all*.exclude group: 'org.openjfx', module: 'javafx'
|
||||||
|
all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
// === 测试框架 ===
|
// === 测试框架 ===
|
||||||
testImplementation platform('org.junit:junit-bom:5.10.0')
|
testImplementation platform('org.junit:junit-bom:5.10.0')
|
||||||
testImplementation 'org.junit.jupiter:junit-jupiter'
|
testImplementation 'org.junit.jupiter:junit-jupiter'
|
||||||
@@ -51,19 +59,15 @@ dependencies {
|
|||||||
// === 开发工具 ===
|
// === 开发工具 ===
|
||||||
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
||||||
|
|
||||||
// === JnaFileChooser 库 ===
|
// === JnaFileChooser & Swing ===
|
||||||
implementation 'com.github.steos.jnafilechooser:jnafilechooser-api:1.1.2'
|
implementation 'com.github.steos.jnafilechooser:jnafilechooser-api:1.1.2'
|
||||||
implementation 'com.github.steos.jnafilechooser:jnafilechooser-win32:1.1.2'
|
implementation 'com.github.steos.jnafilechooser:jnafilechooser-win32:1.1.2'
|
||||||
|
|
||||||
// === Swing 组件 ===
|
|
||||||
implementation 'org.swinglabs:swingx:1.6.1'
|
implementation 'org.swinglabs:swingx:1.6.1'
|
||||||
|
|
||||||
// === 本地库文件 ===
|
// === 本地库文件 ===
|
||||||
implementation files('libs/JNC-1.0-jnc.jar')
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
implementation files('libs/dog api 1.3.jar')
|
|
||||||
implementation files('libs/DesktopWallpaperSdk-1.0-SNAPSHOT.jar')
|
|
||||||
|
|
||||||
// === DJL API ===
|
// === AI (DJL) ===
|
||||||
implementation platform('ai.djl:bom:0.35.0')
|
implementation platform('ai.djl:bom:0.35.0')
|
||||||
implementation 'ai.djl:api'
|
implementation 'ai.djl:api'
|
||||||
implementation 'ai.djl:model-zoo'
|
implementation 'ai.djl:model-zoo'
|
||||||
@@ -73,12 +77,13 @@ dependencies {
|
|||||||
implementation 'ai.djl.onnxruntime:onnxruntime-engine'
|
implementation 'ai.djl.onnxruntime:onnxruntime-engine'
|
||||||
runtimeOnly 'ai.djl.pytorch:pytorch-native-cpu:2.7.1'
|
runtimeOnly 'ai.djl.pytorch:pytorch-native-cpu:2.7.1'
|
||||||
runtimeOnly 'ai.djl.onnxruntime:onnxruntime-native-cpu:1.3.0'
|
runtimeOnly 'ai.djl.onnxruntime:onnxruntime-native-cpu:1.3.0'
|
||||||
|
|
||||||
// === 核心工具库 ===
|
// === 核心工具库 ===
|
||||||
implementation 'com.google.code.gson:gson:2.10.1' // 统一版本
|
implementation 'com.google.code.gson:gson:2.10.1'
|
||||||
implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
|
implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
|
||||||
implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
|
implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
|
||||||
implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.20.0'
|
implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0'
|
||||||
implementation 'commons-io:commons-io:2.18.0' // 统一版本
|
implementation 'commons-io:commons-io:2.18.0'
|
||||||
implementation 'com.google.guava:guava:31.1-jre'
|
implementation 'com.google.guava:guava:31.1-jre'
|
||||||
implementation 'net.java.dev.jna:jna:5.13.0'
|
implementation 'net.java.dev.jna:jna:5.13.0'
|
||||||
implementation 'net.java.dev.jna:jna-platform:5.13.0'
|
implementation 'net.java.dev.jna:jna-platform:5.13.0'
|
||||||
@@ -95,8 +100,8 @@ dependencies {
|
|||||||
implementation 'net.bytebuddy:byte-buddy:1.17.6'
|
implementation 'net.bytebuddy:byte-buddy:1.17.6'
|
||||||
|
|
||||||
// === 反编译工具 ===
|
// === 反编译工具 ===
|
||||||
implementation 'org.bitbucket.mstrobel:procyon-core:0.6.0' // 统一版本
|
implementation 'org.bitbucket.mstrobel:procyon-core:0.6.0'
|
||||||
implementation 'org.bitbucket.mstrobel:procyon-compilertools:0.6.0' // 统一版本
|
implementation 'org.bitbucket.mstrobel:procyon-compilertools:0.6.0'
|
||||||
implementation 'org.benf:cfr:0.152'
|
implementation 'org.benf:cfr:0.152'
|
||||||
|
|
||||||
// === Java 解析与分析 ===
|
// === Java 解析与分析 ===
|
||||||
@@ -110,18 +115,14 @@ dependencies {
|
|||||||
|
|
||||||
// === Web 和网络 ===
|
// === Web 和网络 ===
|
||||||
implementation 'org.jsoup:jsoup:1.17.2'
|
implementation 'org.jsoup:jsoup:1.17.2'
|
||||||
implementation 'org.json:json:20231013' // 统一版本
|
implementation 'org.json:json:20231013'
|
||||||
implementation 'org.openjfx:javafx-web:17'
|
implementation 'org.openjfx:javafx-web:21'
|
||||||
|
|
||||||
// === UI 框架 ===
|
// === UI 框架 ===
|
||||||
implementation 'com.formdev:flatlaf:3.2.1'
|
implementation 'com.formdev:flatlaf:3.2.1'
|
||||||
implementation 'com.formdev:flatlaf-extras:3.2.1'
|
implementation 'com.formdev:flatlaf-extras:3.2.1'
|
||||||
implementation 'com.formdev:flatlaf-intellij-themes:3.2.1'
|
implementation 'com.formdev:flatlaf-intellij-themes:3.2.1'
|
||||||
implementation 'io.github.vincenzopalazzo:material-ui-swing:1.1.2'
|
implementation 'io.github.vincenzopalazzo:material-ui-swing:1.1.2'
|
||||||
|
|
||||||
// JavaFX
|
|
||||||
implementation 'org.openjfx:javafx-controls:21'
|
|
||||||
implementation 'org.openjfx:javafx-graphics:21'
|
|
||||||
implementation 'org.fxmisc.richtext:richtextfx:0.11.0'
|
implementation 'org.fxmisc.richtext:richtextfx:0.11.0'
|
||||||
implementation 'org.controlsfx:controlsfx:11.1.2'
|
implementation 'org.controlsfx:controlsfx:11.1.2'
|
||||||
implementation 'com.dlsc.formsfx:formsfx-core:11.6.0'
|
implementation 'com.dlsc.formsfx:formsfx-core:11.6.0'
|
||||||
@@ -133,32 +134,24 @@ dependencies {
|
|||||||
implementation 'com.fifesoft:languagesupport:3.3.0'
|
implementation 'com.fifesoft:languagesupport:3.3.0'
|
||||||
implementation 'com.fifesoft:autocomplete:3.3.2'
|
implementation 'com.fifesoft:autocomplete:3.3.2'
|
||||||
|
|
||||||
// === 图形和游戏引擎 ===
|
// === LWJGL 图形引擎 ===
|
||||||
// LWJGL
|
def lwjglVersion = "3.3.6"
|
||||||
implementation 'org.lwjgl:lwjgl:3.3.6'
|
implementation "org.lwjgl:lwjgl:$lwjglVersion"
|
||||||
implementation 'org.lwjgl:lwjgl-stb:3.3.6'
|
implementation "org.lwjgl:lwjgl-stb:$lwjglVersion"
|
||||||
implementation 'org.lwjgl:lwjgl-glfw:3.3.6'
|
implementation "org.lwjgl:lwjgl-glfw:$lwjglVersion"
|
||||||
implementation 'org.lwjgl:lwjgl-opengl:3.3.6'
|
implementation "org.lwjgl:lwjgl-opengl:$lwjglVersion"
|
||||||
implementation 'org.lwjgl:lwjgl-jawt:3.3.5'
|
implementation "org.lwjgl:lwjgl-jawt:$lwjglVersion"
|
||||||
|
|
||||||
// Lwjgl natives
|
implementation("com.github.LWJGLX:lwjgl3-awt:bc8daf521a") {
|
||||||
if (DefaultNativePlatform.currentOperatingSystem.isWindows()) {
|
exclude group: "org.lwjgl"
|
||||||
runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-windows'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-windows'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-windows'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-windows'
|
|
||||||
} else if (DefaultNativePlatform.currentOperatingSystem.isLinux()) {
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-linux'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-linux'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-linux'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-linux'
|
|
||||||
} else if (DefaultNativePlatform.currentOperatingSystem.isMacOsX()) {
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl:3.3.6:natives-macos'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-glfw:3.3.6:natives-macos'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-opengl:3.3.6:natives-macos'
|
|
||||||
runtimeOnly 'org.lwjgl:lwjgl-stb:3.3.6:natives-macos'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LWJGL Natives
|
||||||
|
runtimeOnly "org.lwjgl:lwjgl:$lwjglVersion:$lwjglNatives"
|
||||||
|
runtimeOnly "org.lwjgl:lwjgl-glfw:$lwjglVersion:$lwjglNatives"
|
||||||
|
runtimeOnly "org.lwjgl:lwjgl-opengl:$lwjglVersion:$lwjglNatives"
|
||||||
|
runtimeOnly "org.lwjgl:lwjgl-stb:$lwjglVersion:$lwjglNatives"
|
||||||
|
|
||||||
// 其他图形库
|
// 其他图形库
|
||||||
implementation 'com.badlogicgames.gdx:gdx:1.12.1'
|
implementation 'com.badlogicgames.gdx:gdx:1.12.1'
|
||||||
implementation 'org.joml:joml:1.10.7'
|
implementation 'org.joml:joml:1.10.7'
|
||||||
@@ -186,6 +179,10 @@ dependencies {
|
|||||||
implementation 'org.xerial:sqlite-jdbc:3.41.2.1'
|
implementation 'org.xerial:sqlite-jdbc:3.41.2.1'
|
||||||
implementation 'org.postgresql:postgresql:42.6.0'
|
implementation 'org.postgresql:postgresql:42.6.0'
|
||||||
|
|
||||||
|
// === 伪终端与测试容器 ===
|
||||||
|
implementation 'org.jetbrains.pty4j:pty4j:0.12.13'
|
||||||
|
implementation 'org.testcontainers:testcontainers:1.19.0'
|
||||||
|
|
||||||
// === 音频处理 ===
|
// === 音频处理 ===
|
||||||
implementation 'jflac:jflac:1.3'
|
implementation 'jflac:jflac:1.3'
|
||||||
implementation 'com.github.axet:TarsosDSP:2.4'
|
implementation 'com.github.axet:TarsosDSP:2.4'
|
||||||
@@ -207,52 +204,39 @@ dependencies {
|
|||||||
implementation 'org.casbin:casdoor-java-sdk:1.37.0'
|
implementation 'org.casbin:casdoor-java-sdk:1.37.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations.configureEach {
|
// 自动生成构建信息文件
|
||||||
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
|
tasks.register('generateBuildProperties') {
|
||||||
|
group = 'build'
|
||||||
|
doLast {
|
||||||
|
def resDir = file("src/main/resources/build")
|
||||||
|
resDir.mkdirs()
|
||||||
|
def propertiesFile = new File(resDir, 'build.properties')
|
||||||
|
propertiesFile.text = """# Auto-generated build information
|
||||||
|
version=${project.version}
|
||||||
|
buildTimestamp=${LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)}
|
||||||
|
buildSystem=${OperatingSystem.current().isWindows() ? "WINDOWS" : "UNIX"}
|
||||||
|
"""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制依赖到 libs 目录
|
compileJava.dependsOn generateBuildProperties
|
||||||
task copyDependencies(type: Copy) {
|
|
||||||
|
// 复制依赖包到构建目录
|
||||||
|
tasks.register('copyDependencies', Copy) {
|
||||||
|
group = "build"
|
||||||
from configurations.runtimeClasspath
|
from configurations.runtimeClasspath
|
||||||
into "$buildDir/libs/libs"
|
into "$buildDir/libs/libs"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 原始 jar 打包(不含依赖)
|
|
||||||
tasks.jar {
|
tasks.jar {
|
||||||
dependsOn copyDependencies
|
dependsOn copyDependencies
|
||||||
archiveBaseName.set("${rootProject.name}")
|
archiveBaseName.set("${rootProject.name}")
|
||||||
archiveVersion.set("${version}")
|
manifest {
|
||||||
}
|
attributes(
|
||||||
|
'Main-Class': 'com.axis.innovators.box.Main',
|
||||||
// ProGuard 混淆任务
|
'Class-Path': configurations.runtimeClasspath.files.collect { "libs/${it.name}" }.join(' ')
|
||||||
task obfuscateJar(type: JavaExec) {
|
)
|
||||||
dependsOn jar
|
}
|
||||||
group = "build"
|
|
||||||
description = "使用 ProGuard 混淆并生成映射表"
|
|
||||||
|
|
||||||
mainClass = 'proguard.ProGuard'
|
|
||||||
classpath = configurations.proguardLib
|
|
||||||
|
|
||||||
args = [
|
|
||||||
'-injars', "$buildDir/libs/${rootProject.name}-${version}.jar",
|
|
||||||
'-outjars', "$buildDir/libs/${rootProject.name}-${version}-obf.jar",
|
|
||||||
'-libraryjars', "${System.getProperty('java.home')}/jmods/java.base.jmod",
|
|
||||||
'-printmapping', "$buildDir/libs/output.srg",
|
|
||||||
'-keep class com.axis.innovators.box.plugins.**',
|
|
||||||
'-keep class com.axis.innovators.box.plugins.BoxClassLoader{*;}',
|
|
||||||
'-keeppackagenames', 'com.axis.innovators.box',
|
|
||||||
'-keeppackagenames', 'com.axis.innovators.box.plugins',
|
|
||||||
'-keepnames', 'class com.axis.innovators.box.**',
|
|
||||||
'-keepnames', 'class com.axis.innovators.box.plugins.**',
|
|
||||||
'-dontwarn',
|
|
||||||
'-dontoptimize',
|
|
||||||
'-dontshrink',
|
|
||||||
'-keepattributes', 'Signature,InnerClasses,EnclosingMethod,RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations,Deprecated,SourceFile,LineNumberTable,LocalVariableTable,LocalVariableTypeTable'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
build {
|
|
||||||
dependsOn obfuscateJar
|
|
||||||
}
|
}
|
||||||
|
|
||||||
application {
|
application {
|
||||||
@@ -260,8 +244,7 @@ application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('runBoxClient', JavaExec) {
|
tasks.register('runBoxClient', JavaExec) {
|
||||||
group = "run-toolboxProgram"
|
group = "run"
|
||||||
description = "执行工具箱程序"
|
|
||||||
classpath = sourceSets.main.runtimeClasspath
|
classpath = sourceSets.main.runtimeClasspath
|
||||||
mainClass = "com.axis.innovators.box.Main"
|
mainClass = "com.axis.innovators.box.Main"
|
||||||
jvmArgs = [
|
jvmArgs = [
|
||||||
@@ -269,75 +252,3 @@ tasks.register('runBoxClient', JavaExec) {
|
|||||||
"-Djava.system.class.loader=com.axis.innovators.box.plugins.BoxClassLoader"
|
"-Djava.system.class.loader=com.axis.innovators.box.plugins.BoxClassLoader"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('runVivid2DClient', JavaExec) {
|
|
||||||
group = "run-vivid2D"
|
|
||||||
description = "执行工具箱程序"
|
|
||||||
classpath = sourceSets.main.runtimeClasspath
|
|
||||||
mainClass = "com.chuangzhou.vivid2D.Main"
|
|
||||||
jvmArgs = [
|
|
||||||
"-Dfile.encoding=UTF-8"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register('test2DModelLayerPanel', JavaExec) {
|
|
||||||
group = "test-model"
|
|
||||||
description = "运行 2D Model Layer Panel 测试"
|
|
||||||
classpath = sourceSets.main.runtimeClasspath
|
|
||||||
mainClass = "com.chuangzhou.vivid2D.test.ModelLayerPanelTest"
|
|
||||||
jvmArgs = [
|
|
||||||
"-Dfile.encoding=UTF-8"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register('testModelRenderLightingTest', JavaExec) {
|
|
||||||
group = "test-model"
|
|
||||||
description = "运行 2D Model 高亮灯光测试"
|
|
||||||
classpath = sourceSets.main.runtimeClasspath
|
|
||||||
mainClass = "com.chuangzhou.vivid2D.test.ModelRenderLightingTest"
|
|
||||||
jvmArgs = [
|
|
||||||
"-Dfile.encoding=UTF-8"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register('testModelTest', JavaExec) {
|
|
||||||
group = "test-model"
|
|
||||||
description = "运行 2D Model 保存和完整性测试"
|
|
||||||
classpath = sourceSets.main.runtimeClasspath
|
|
||||||
mainClass = "com.chuangzhou.vivid2D.test.ModelTest"
|
|
||||||
jvmArgs = [
|
|
||||||
"-Dfile.encoding=UTF-8"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register('testModelTest2', JavaExec) {
|
|
||||||
group = "test-model"
|
|
||||||
description = "运行 2D Model 物理基准测试"
|
|
||||||
classpath = sourceSets.main.runtimeClasspath
|
|
||||||
mainClass = "com.chuangzhou.vivid2D.test.ModelTest2"
|
|
||||||
jvmArgs = [
|
|
||||||
"-Dfile.encoding=UTF-8"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
task printFxPath {
|
|
||||||
doLast {
|
|
||||||
// 1. 获取所有运行时依赖文件
|
|
||||||
def runtimeClasspath = configurations.runtimeClasspath.files
|
|
||||||
|
|
||||||
// 2. 筛选出所有名字包含 "javafx" 的 jar 包
|
|
||||||
def javafxJars = runtimeClasspath.findAll { file ->
|
|
||||||
file.name.contains("javafx")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. 获取这些 jar 包的绝对路径
|
|
||||||
def javafxPaths = javafxJars.collect { it.absolutePath }
|
|
||||||
|
|
||||||
// 4. 使用系统的路径分隔符 (Windows是';', Linux/macOS是':') 将它们连接起来
|
|
||||||
def modulePath = javafxPaths.join(System.getProperty("path.separator"))
|
|
||||||
|
|
||||||
println "========================================================================"
|
|
||||||
println "COPY THIS JavaFX Module Path: " + modulePath
|
|
||||||
println "========================================================================"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
1216
javascript/HtmlJarViewer.html
Normal file
1216
javascript/HtmlJarViewer.html
Normal file
File diff suppressed because it is too large
Load Diff
117
javascript/LinuxTerminal.html
Normal file
117
javascript/LinuxTerminal.html
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Real Linux Terminal</title>
|
||||||
|
<!-- 引入 Xterm.js 的样式 -->
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css" />
|
||||||
|
<style>
|
||||||
|
body, html {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
background-color: #000;
|
||||||
|
overflow: hidden;
|
||||||
|
height: 100%; /* 确保 html 和 body 占满全屏 */
|
||||||
|
}
|
||||||
|
#terminal-container {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="terminal-container"></div>
|
||||||
|
|
||||||
|
<!-- 引入 Xterm.js 核心库 -->
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.js"></script>
|
||||||
|
<!-- 引入自适应插件,让终端随窗口缩放 -->
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// 1. 初始化终端
|
||||||
|
const term = new Terminal({
|
||||||
|
cursorBlink: true,
|
||||||
|
fontSize: 14,
|
||||||
|
fontFamily: 'Consolas, "Ubuntu Mono", monospace',
|
||||||
|
theme: {
|
||||||
|
background: '#1e1e1e',
|
||||||
|
foreground: '#ffffff'
|
||||||
|
},
|
||||||
|
// 增加右键菜单功能:粘贴
|
||||||
|
allowProposedApi: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const fitAddon = new FitAddon.FitAddon();
|
||||||
|
term.loadAddon(fitAddon);
|
||||||
|
term.open(document.getElementById('terminal-container'));
|
||||||
|
|
||||||
|
// --- 修复点 1: 自动获取焦点 ---
|
||||||
|
// 确保用户打开窗口后可以直接输入
|
||||||
|
term.focus();
|
||||||
|
|
||||||
|
// --- 修复点 2: 延迟并可靠地适应窗口大小 ---
|
||||||
|
// 使用 setTimeout 将 fit() 推迟到下一个事件循环
|
||||||
|
// 这可以确保在DOM元素完全渲染并获得其最终尺寸后才进行计算
|
||||||
|
function fitTerminal() {
|
||||||
|
try {
|
||||||
|
fitAddon.fit();
|
||||||
|
// 你还可以在这里将新的尺寸发送给后端 PTY
|
||||||
|
// term.cols 和 term.rows 包含了新的行列数
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Fit addon failed:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setTimeout(fitTerminal, 1); // 1ms 延迟足以确保渲染完成
|
||||||
|
|
||||||
|
// 窗口大小改变时自动调整
|
||||||
|
window.addEventListener('resize', fitTerminal);
|
||||||
|
|
||||||
|
// 2. 监听用户输入 (键盘按键)
|
||||||
|
term.onData(data => {
|
||||||
|
if (window.cefQuery) {
|
||||||
|
window.cefQuery({
|
||||||
|
request: JSON.stringify({
|
||||||
|
type: 'terminalInput',
|
||||||
|
data: data
|
||||||
|
}),
|
||||||
|
onSuccess: function() {},
|
||||||
|
onFailure: function(errorCode, errorMessage) {
|
||||||
|
console.error("CEF query failed:", errorCode, errorMessage);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.warn("cefQuery is not available. Input ignored.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// --- 修复点 3: 使用 TextDecoder 优化解码逻辑 ---
|
||||||
|
// 这是更现代、更可靠的将字节流解码为UTF-8字符串的方法
|
||||||
|
const decoder = new TextDecoder('utf-8');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 供 Java 调用的接口:写入数据到终端
|
||||||
|
* @param {string} base64Data - Base64 编码的原始字节流字符串
|
||||||
|
*/
|
||||||
|
function writeToTerminal(base64Data) {
|
||||||
|
try {
|
||||||
|
// 将 Base64 字符串转换为 Uint8Array 字节数组
|
||||||
|
const binaryString = window.atob(base64Data);
|
||||||
|
const len = binaryString.length;
|
||||||
|
const bytes = new Uint8Array(len);
|
||||||
|
for (let i = 0; i < len; i++) {
|
||||||
|
bytes[i] = binaryString.charCodeAt(i);
|
||||||
|
}
|
||||||
|
// 使用 TextDecoder 解码为字符串并写入终端
|
||||||
|
term.write(decoder.decode(bytes));
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Failed to decode or write Base64 data:", e);
|
||||||
|
// 可以在终端显示错误信息
|
||||||
|
term.write("\r\n[Front-end Error: Failed to process data from back-end]\r\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化通知
|
||||||
|
term.write('\x1B[1;3;32mConnected to Local Shell via PTY4J...\x1B[0m\r\n');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
481
javascript/SQLTerminal.html
Normal file
481
javascript/SQLTerminal.html
Normal file
@@ -0,0 +1,481 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>SQL Command Line</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg-color: #0c0c0c;
|
||||||
|
--text-color: #cccccc;
|
||||||
|
--caret-color: #ffffff;
|
||||||
|
--selection-bg: #264f78;
|
||||||
|
--menu-bg: #2b2d30;
|
||||||
|
--highlight-active: #0d293e;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
color: var(--text-color);
|
||||||
|
font-family: 'Consolas', 'Courier New', monospace;
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 10px;
|
||||||
|
height: 100vh;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow-y: auto;
|
||||||
|
word-break: break-all;
|
||||||
|
}
|
||||||
|
|
||||||
|
::selection { background: var(--selection-bg); color: white; }
|
||||||
|
|
||||||
|
#terminal { width: 100%; min-height: 100%; display: flex; flex-direction: column; padding-bottom: 50px; }
|
||||||
|
#output-area { white-space: pre-wrap; cursor: text; }
|
||||||
|
|
||||||
|
.input-line { display: flex; margin-top: 5px; position: relative; }
|
||||||
|
.prompt { color: #cccccc; margin-right: 8px; font-weight: bold; user-select: none; white-space: pre; }
|
||||||
|
.continuation-prompt { color: #cccccc; margin-right: 8px; user-select: none; white-space: pre; }
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
background: transparent; border: none; color: #ffffff;
|
||||||
|
font-family: inherit; font-size: inherit; flex: 1;
|
||||||
|
outline: none; padding: 0; margin: 0; caret-color: var(--caret-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.welcome-msg { margin-bottom: 20px; color: #888; }
|
||||||
|
.error-text { color: #ff5555; }
|
||||||
|
|
||||||
|
/* --- 自动补全样式 --- */
|
||||||
|
#suggestion-box {
|
||||||
|
position: absolute; display: none; background-color: #2b2d30;
|
||||||
|
border: 1px solid #5f6165; box-shadow: 0 5px 15px rgba(0,0,0,0.6);
|
||||||
|
z-index: 999; max-height: 200px; overflow-y: auto; min-width: 250px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.suggestion-item {
|
||||||
|
padding: 5px 10px; cursor: pointer; font-size: 14px;
|
||||||
|
color: #a9b7c6; display: flex; align-items: center;
|
||||||
|
}
|
||||||
|
.suggestion-item.active { background-color: var(--highlight-active); color: #ffffff; }
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
display: inline-block; width: 16px; height: 16px; margin-right: 8px;
|
||||||
|
font-size: 10px; text-align: center; line-height: 16px; border-radius: 2px;
|
||||||
|
font-weight: bold; color: #000;
|
||||||
|
}
|
||||||
|
.icon-k { background-color: #ffc66d; } /* Keyword */
|
||||||
|
.icon-t { background-color: #4a88c7; color: #fff; } /* Table */
|
||||||
|
.icon-c { background-color: #9876aa; color: #fff; } /* Column */
|
||||||
|
|
||||||
|
.detail-text { margin-left: auto; color: #666; font-size: 12px; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="terminal">
|
||||||
|
<div class="welcome-msg">
|
||||||
|
Axis SQL Client [Version 2.0.0]<br>
|
||||||
|
(c) 2024 Axis Innovators.<br>
|
||||||
|
Loaded local database mode.<br>
|
||||||
|
<br>
|
||||||
|
Commands end with ; <br>
|
||||||
|
Type 'help' for help. 'cls' to clear.<br>
|
||||||
|
</div>
|
||||||
|
<div id="output-area"></div>
|
||||||
|
<div class="input-line">
|
||||||
|
<span id="prompt-span" class="prompt">SQL></span>
|
||||||
|
<input type="text" id="cmd-input" autocomplete="off" spellcheck="false" autofocus>
|
||||||
|
<div id="suggestion-box"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// --- 核心状态 ---
|
||||||
|
const outputArea = document.getElementById('output-area');
|
||||||
|
const input = document.getElementById('cmd-input');
|
||||||
|
const promptSpan = document.getElementById('prompt-span');
|
||||||
|
const suggestionBox = document.getElementById('suggestion-box');
|
||||||
|
|
||||||
|
let history = [];
|
||||||
|
let historyIndex = -1;
|
||||||
|
|
||||||
|
// 多行命令缓冲区
|
||||||
|
let commandBuffer = "";
|
||||||
|
let isMultiLineMode = false;
|
||||||
|
|
||||||
|
// 数据库元数据 (由 Java 填充)
|
||||||
|
let dbSchema = {
|
||||||
|
tables: [], // ["student", "logs"]
|
||||||
|
columns: {}, // {"student": ["id", "name"], "logs": ["id", "msg"]}
|
||||||
|
allColumns: [] // flat list of all columns for quick search
|
||||||
|
};
|
||||||
|
|
||||||
|
// 静态关键字库
|
||||||
|
const keywords = [
|
||||||
|
"SELECT", "FROM", "WHERE", "INSERT", "INTO", "VALUES", "UPDATE", "SET",
|
||||||
|
"DELETE", "CREATE", "TABLE", "DROP", "ALTER", "ORDER", "BY", "GROUP",
|
||||||
|
"LIMIT", "JOIN", "LEFT", "RIGHT", "INNER", "OUTER", "ON", "AND", "OR",
|
||||||
|
"NOT", "NULL", "AS", "DISTINCT", "COUNT", "MAX", "MIN", "AVG", "SUM"
|
||||||
|
];
|
||||||
|
|
||||||
|
// --- 1. 初始化: 加载表结构 ---
|
||||||
|
window.onload = function() {
|
||||||
|
if (window.cefQuery) {
|
||||||
|
window.cefQuery({
|
||||||
|
request: JSON.stringify({ type: "initSchema" }),
|
||||||
|
onSuccess: function(response) {
|
||||||
|
const res = JSON.parse(response);
|
||||||
|
if (res.status === "success") {
|
||||||
|
dbSchema.tables = res.tables || [];
|
||||||
|
dbSchema.columns = res.columns || {};
|
||||||
|
// 扁平化所有列名,方便通用提示
|
||||||
|
let colSet = new Set();
|
||||||
|
for (let t in dbSchema.columns) {
|
||||||
|
dbSchema.columns[t].forEach(c => colSet.add(c));
|
||||||
|
}
|
||||||
|
dbSchema.allColumns = Array.from(colSet);
|
||||||
|
console.log("Schema loaded:", dbSchema);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onFailure: function() {}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 测试模式数据
|
||||||
|
dbSchema.tables = ["student", "course"];
|
||||||
|
dbSchema.columns = { "student": ["id", "name", "age"], "course": ["id", "title"] };
|
||||||
|
dbSchema.allColumns = ["id", "name", "age", "title"];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- 2. 输入与键盘事件 ---
|
||||||
|
input.addEventListener('keydown', function(e) {
|
||||||
|
// 如果补全框打开,接管按键
|
||||||
|
if (suggestionBox.style.display === 'block') {
|
||||||
|
if (handleSuggestionKeys(e)) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
handleEnterKey();
|
||||||
|
}
|
||||||
|
else if (e.key === 'ArrowUp') {
|
||||||
|
handleHistory(true, e);
|
||||||
|
}
|
||||||
|
else if (e.key === 'ArrowDown') {
|
||||||
|
handleHistory(false, e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// --- 3. 多行命令处理逻辑 (核心升级) ---
|
||||||
|
function handleEnterKey() {
|
||||||
|
const rawLine = input.value;
|
||||||
|
|
||||||
|
// 1. 如果输入为空,只是换行
|
||||||
|
if (!rawLine.trim() && !commandBuffer.trim()) {
|
||||||
|
input.value = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 显示当前行
|
||||||
|
const promptText = isMultiLineMode ? " -> " : "SQL> ";
|
||||||
|
appendLine(promptText + rawLine);
|
||||||
|
|
||||||
|
// 3. 处理历史记录 (每次回车都存,方便找回片段)
|
||||||
|
if (rawLine.trim()) {
|
||||||
|
history.push(rawLine);
|
||||||
|
historyIndex = history.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 判断特殊前端命令
|
||||||
|
const upperLine = rawLine.trim().toUpperCase();
|
||||||
|
if (upperLine === 'CLS' || upperLine === 'CLEAR') {
|
||||||
|
outputArea.innerHTML = '';
|
||||||
|
resetInput();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (upperLine === 'EXIT') {
|
||||||
|
// 这里可以调用关闭窗口
|
||||||
|
appendLine("Bye.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 拼接到缓冲区
|
||||||
|
commandBuffer += rawLine + " "; // 加空格防止粘连
|
||||||
|
|
||||||
|
// 6. 检查是否以分号结尾 (真正的执行触发器)
|
||||||
|
if (rawLine.trim().endsWith(';')) {
|
||||||
|
// 移除分号并执行
|
||||||
|
const finalCmd = commandBuffer.trim().replace(/;$/, '');
|
||||||
|
processCommand(finalCmd);
|
||||||
|
resetInput(); // 重置为单行模式
|
||||||
|
} else {
|
||||||
|
// 进入多行模式
|
||||||
|
isMultiLineMode = true;
|
||||||
|
promptSpan.textContent = " -> ";
|
||||||
|
input.value = '';
|
||||||
|
// 滚动到底部
|
||||||
|
window.scrollTo(0, document.body.scrollHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetInput() {
|
||||||
|
commandBuffer = "";
|
||||||
|
isMultiLineMode = false;
|
||||||
|
promptSpan.textContent = "SQL> ";
|
||||||
|
input.value = '';
|
||||||
|
window.scrollTo(0, document.body.scrollHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleHistory(isUp, e) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (isUp && historyIndex > 0) {
|
||||||
|
historyIndex--;
|
||||||
|
input.value = history[historyIndex];
|
||||||
|
} else if (!isUp && historyIndex < history.length - 1) {
|
||||||
|
historyIndex++;
|
||||||
|
input.value = history[historyIndex];
|
||||||
|
} else if (!isUp) {
|
||||||
|
historyIndex = history.length;
|
||||||
|
input.value = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 4. 智能感知自动补全 (Context Aware) ---
|
||||||
|
let currentSuggestions = [];
|
||||||
|
let activeIndex = -1;
|
||||||
|
|
||||||
|
input.addEventListener('input', function() {
|
||||||
|
const val = this.value;
|
||||||
|
const cursorPos = this.selectionStart;
|
||||||
|
|
||||||
|
// 获取正在输入的单词
|
||||||
|
const wordInfo = getCurrentWord(val, cursorPos);
|
||||||
|
if (!wordInfo) {
|
||||||
|
hideSuggestions();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分析上下文 (Context Analysis)
|
||||||
|
const contextType = analyzeContext(val, wordInfo.startPos);
|
||||||
|
|
||||||
|
// 获取建议列表
|
||||||
|
const list = getFilteredSuggestions(wordInfo.word, contextType);
|
||||||
|
|
||||||
|
if (list.length > 0) {
|
||||||
|
showSuggestions(list, wordInfo.startPos);
|
||||||
|
} else {
|
||||||
|
hideSuggestions();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简单的上下文分析器
|
||||||
|
* 返回: 'TABLE' | 'COLUMN' | 'KEYWORD' (默认)
|
||||||
|
*/
|
||||||
|
function analyzeContext(text, cursorIndex) {
|
||||||
|
// 取光标前的文本,转大写,分割成 Token
|
||||||
|
const prefix = text.substring(0, cursorIndex).toUpperCase();
|
||||||
|
const tokens = prefix.split(/\s+/).filter(t => t.length > 0);
|
||||||
|
|
||||||
|
if (tokens.length === 0) return 'KEYWORD';
|
||||||
|
|
||||||
|
const lastToken = tokens[tokens.length - 1];
|
||||||
|
|
||||||
|
// 如果上一个词是这些,通常后面接表名
|
||||||
|
const tableTriggers = ["FROM", "JOIN", "UPDATE", "INTO", "TABLE"];
|
||||||
|
if (tableTriggers.includes(lastToken)) return 'TABLE';
|
||||||
|
|
||||||
|
// 如果上一个词是这些,通常后面接列名
|
||||||
|
const columnTriggers = ["SELECT", "WHERE", "ORDER", "BY", "GROUP", "HAVING", "SET", "ON", "AND", "OR"];
|
||||||
|
if (columnTriggers.includes(lastToken) || lastToken.endsWith(',')) return 'COLUMN';
|
||||||
|
|
||||||
|
return 'KEYWORD';
|
||||||
|
}
|
||||||
|
|
||||||
|
function getFilteredSuggestions(query, type) {
|
||||||
|
const q = query.toUpperCase();
|
||||||
|
let results = [];
|
||||||
|
|
||||||
|
// 1. 优先根据上下文添加
|
||||||
|
if (type === 'TABLE') {
|
||||||
|
dbSchema.tables.forEach(t => {
|
||||||
|
if (t.toUpperCase().startsWith(q)) results.push({ text: t, type: 't', detail: 'Table' });
|
||||||
|
});
|
||||||
|
} else if (type === 'COLUMN') {
|
||||||
|
dbSchema.allColumns.forEach(c => {
|
||||||
|
if (c.toUpperCase().startsWith(q)) results.push({ text: c, type: 'c', detail: 'Column' });
|
||||||
|
});
|
||||||
|
// 列名场景下也可能输入表名(例如 table.col)
|
||||||
|
dbSchema.tables.forEach(t => {
|
||||||
|
if (t.toUpperCase().startsWith(q)) results.push({ text: t, type: 't', detail: 'Table' });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 总是添加匹配的关键字 (但在特定上下文排在后面)
|
||||||
|
keywords.forEach(k => {
|
||||||
|
if (k.startsWith(q)) results.push({ text: k, type: 'k', detail: 'Keyword' });
|
||||||
|
});
|
||||||
|
|
||||||
|
return results.slice(0, 15); // 限制显示数量
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 补全 UI 渲染逻辑 --- (复用之前的基础,增加了类型判断)
|
||||||
|
function showSuggestions(list, wordStartPos) {
|
||||||
|
currentSuggestions = list;
|
||||||
|
activeIndex = 0;
|
||||||
|
|
||||||
|
// 计算 UI 位置
|
||||||
|
const promptWidth = getTextWidth(promptSpan.textContent, "bold 16px Consolas");
|
||||||
|
const inputBefore = input.value.substring(0, wordStartPos);
|
||||||
|
const inputWidth = getTextWidth(inputBefore, "16px Consolas");
|
||||||
|
|
||||||
|
suggestionBox.style.left = (promptWidth + inputWidth) + "px";
|
||||||
|
suggestionBox.style.top = "26px";
|
||||||
|
suggestionBox.style.display = "block";
|
||||||
|
|
||||||
|
renderList();
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderList() {
|
||||||
|
suggestionBox.innerHTML = '';
|
||||||
|
currentSuggestions.forEach((item, idx) => {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.className = 'suggestion-item' + (idx === activeIndex ? ' active' : '');
|
||||||
|
|
||||||
|
let iconChar = 'K';
|
||||||
|
if (item.type === 't') iconChar = 'T';
|
||||||
|
if (item.type === 'c') iconChar = 'C';
|
||||||
|
|
||||||
|
div.innerHTML = `
|
||||||
|
<span class="icon icon-${item.type}">${iconChar}</span>
|
||||||
|
<span class="text">${item.text}</span>
|
||||||
|
<span class="detail-text">${item.detail}</span>
|
||||||
|
`;
|
||||||
|
|
||||||
|
div.onmousedown = (e) => { e.preventDefault(); applySuggestion(idx); }; // prevent blur
|
||||||
|
suggestionBox.appendChild(div);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 自动滚动
|
||||||
|
const activeEl = suggestionBox.children[activeIndex];
|
||||||
|
if (activeEl) {
|
||||||
|
const boxTop = suggestionBox.scrollTop;
|
||||||
|
const boxBottom = boxTop + suggestionBox.clientHeight;
|
||||||
|
const elTop = activeEl.offsetTop;
|
||||||
|
const elBottom = elTop + activeEl.clientHeight;
|
||||||
|
|
||||||
|
if (elTop < boxTop) suggestionBox.scrollTop = elTop;
|
||||||
|
if (elBottom > boxBottom) suggestionBox.scrollTop = elBottom - suggestionBox.clientHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSuggestionKeys(e) {
|
||||||
|
if (e.key === 'ArrowDown') {
|
||||||
|
e.preventDefault();
|
||||||
|
activeIndex = (activeIndex + 1) % currentSuggestions.length;
|
||||||
|
renderList();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (e.key === 'ArrowUp') {
|
||||||
|
e.preventDefault();
|
||||||
|
activeIndex = (activeIndex - 1 + currentSuggestions.length) % currentSuggestions.length;
|
||||||
|
renderList();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (e.key === 'Tab' || e.key === 'Enter') {
|
||||||
|
e.preventDefault();
|
||||||
|
applySuggestion(activeIndex);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (e.key === 'Escape') {
|
||||||
|
hideSuggestions();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function applySuggestion(index) {
|
||||||
|
const item = currentSuggestions[index];
|
||||||
|
const val = input.value;
|
||||||
|
const wordInfo = getCurrentWord(val, input.selectionStart);
|
||||||
|
|
||||||
|
if (wordInfo) {
|
||||||
|
const prefix = val.substring(0, wordInfo.startPos);
|
||||||
|
const suffix = val.substring(input.selectionStart);
|
||||||
|
const newText = prefix + item.text + " " + suffix; // 自动加个空格
|
||||||
|
input.value = newText;
|
||||||
|
const newPos = prefix.length + item.text.length + 1;
|
||||||
|
input.setSelectionRange(newPos, newPos);
|
||||||
|
}
|
||||||
|
hideSuggestions();
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideSuggestions() {
|
||||||
|
suggestionBox.style.display = 'none';
|
||||||
|
activeIndex = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 工具函数 ---
|
||||||
|
function getCurrentWord(text, cursorIndex) {
|
||||||
|
const left = text.substring(0, cursorIndex);
|
||||||
|
const match = left.match(/([a-zA-Z0-9_]+)$/);
|
||||||
|
if (match) {
|
||||||
|
return { word: match[1], startPos: match.index };
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTextWidth(text, font) {
|
||||||
|
const canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas"));
|
||||||
|
const ctx = canvas.getContext("2d");
|
||||||
|
ctx.font = font;
|
||||||
|
return ctx.measureText(text).width;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 后端通信与显示 (复用) ---
|
||||||
|
function processCommand(cmd) {
|
||||||
|
if (window.cefQuery) {
|
||||||
|
window.cefQuery({
|
||||||
|
request: JSON.stringify({ type: "executeCommand", command: cmd }),
|
||||||
|
onSuccess: (res) => renderResponse(JSON.parse(res)),
|
||||||
|
onFailure: (c, msg) => appendLine("Error: " + msg, true)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderResponse(res) {
|
||||||
|
if (res.status === 'error') {
|
||||||
|
appendLine(res.output, true);
|
||||||
|
} else if (res.type === 'table') {
|
||||||
|
appendLine(generateAsciiTable(res.headers, res.rows));
|
||||||
|
if (res.info) appendLine(res.info);
|
||||||
|
} else {
|
||||||
|
appendLine(res.output);
|
||||||
|
}
|
||||||
|
appendLine(""); // 空行分割
|
||||||
|
}
|
||||||
|
|
||||||
|
function appendLine(text, isError = false) {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.textContent = text;
|
||||||
|
if (isError) div.className = 'error-text';
|
||||||
|
outputArea.appendChild(div);
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateAsciiTable(headers, rows) {
|
||||||
|
if (!headers || !headers.length) return "";
|
||||||
|
const colWidths = headers.map(h => h.length);
|
||||||
|
rows.forEach(row => row.forEach((c, i) => colWidths[i] = Math.max(colWidths[i], String(c).length)));
|
||||||
|
|
||||||
|
const border = "+" + colWidths.map(w => "-".repeat(w + 2)).join("+") + "+";
|
||||||
|
const makeRow = (arr) => "|" + arr.map((c, i) => " " + String(c).padEnd(colWidths[i]) + " ").join("|") + "|";
|
||||||
|
|
||||||
|
return [border, makeRow(headers), border, ...rows.map(makeRow), border].join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 点击聚焦 (不影响选中文本)
|
||||||
|
document.addEventListener('click', (e) => {
|
||||||
|
if (!window.getSelection().toString() && !suggestionBox.contains(e.target)) input.focus();
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
#Current Loaded Language
|
#Current Loaded Language
|
||||||
#Sun Oct 05 18:45:33 CST 2025
|
#Fri Jan 02 17:08:53 CST 2026
|
||||||
loadedLanguage=system\:zh_CN
|
loadedLanguage=system\:zh_CN
|
||||||
|
|||||||
7713
library/jcef/cache/Crowd Deny/2025.10.6.61/Preload Data
vendored
7713
library/jcef/cache/Crowd Deny/2025.10.6.61/Preload Data
vendored
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
|||||||
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJQcmVsb2FkIERhdGEiLCJyb290X2hhc2giOiIySkY0bjlJektLVmJCMExMQ2VRMXd0N09LN1Nlem1oaV9MenBEVjhnWEdnIn0seyJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6IjZ5RUlpWmVBWnNlM0g3bWNEYjg5N2hfcXFfWTUtOEo2WW1MNXpLdVJZLWcifV0sImZvcm1hdCI6InRyZWVoYXNoIiwiaGFzaF9ibG9ja19zaXplIjo0MDk2fV0sIml0ZW1faWQiOiJnZ2trZWhnYm5manBlZ2dmcGxlZWFrcGlkYmtpYmJtbiIsIml0ZW1fdmVyc2lvbiI6IjIwMjUuMTAuNi42MSIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"MXBnWArmfHUkDQ_zR8fPtKClY4Z6Meb5w8vBR2s1tT8kDF9VXr45al_o5klckYyEBHEEHtyG5TTUQKi6zMHNvjKF8dhVsgqNDoVQUKeLMqsWcBW3gEw3gQiFLlwloO1_UCPWNmp7nZe1WjMSL1Wia60550kjAafsYveG1rqAJOmD6pl-WvW5JKWeqiUjN0jNG2gPkIzxv143Sk4pfchvZUBKxVW9YR61lW9CiKmlguEbiOnhY2BHj3PYUdQUMefbJCVJKI4TpOe67AjKpynoBTaKZLuW21PAUHMiWPaBR_tOTjDB9pbq3AesUh_U5OnRA8lF_9nwX9cfNg-zRoHR2NMtmhVlUXrIsDWwh-FNA32LnwOzbNH_4FmuWPWXzu6IjNSLGxpda5GUg65rhMWgCW2-YJVjIbO0p-Y27eU7JDVeIOmodZ358uTDCFz-0ChMUoffA1ej8flGyX_HXqUdYZRzuaJosqwUP9mPXErIgUJbgHNlgO1dRvNyGGTsCe0Xn7UPVfCeuPYoX3yZekKeqlOGcTcXu5mqsg8icr6YP-H_vZR0tBjPmcnmM-Dp08Ix0AY1Pm7wK-7F8sExn7sWTNf3XMQzF1QHIfYLHjnHTmg78fF2kjQxhHd8zqZ121J2o2dhslZdIsH3F44EuEIFQfYHFbKhr93ODq93p2L0cEM"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"i9XSMHRDp-syAOvlFsrJ4swarl0gHdQH5xdhimD2bsj0dxnyNXUZszt97BJfZKmHqPvzJENKAnakE0Q6b_AB2W50xjGfuRZbMJAMdjp8nB_rftgth_KwkO9mbhaBXC_jzP4QYUUFOrwqTTTmNU33wTF9XcjAZ8W8nd7D_-tocxjrT56FpvbKx34Prha1u8VtwGt1raCCI73B_mIXHy9O1PQN6l8umNo12KcTcGt1R2htB-BxWpHLVLHkir4o4ABzjpXfbK3ecEQNTFNZYJs3dvDvmqkEBWCOL17GWn37_GFV78abmUdM3lAcQp1lzavg5VZSBcIcmsoCO4-XUL63Jw"}]}}]
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
1.0bd17169e41bf80771e71e625ed9469c4006d08a33caa457e184caa55174f67b
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"manifest_version": 2,
|
|
||||||
"name": "Crowd Deny",
|
|
||||||
"preload_data_format": 1,
|
|
||||||
"version": "2025.10.6.61"
|
|
||||||
}
|
|
||||||
18
library/jcef/cache/Default/BrowsingTopicsState
vendored
18
library/jcef/cache/Default/BrowsingTopicsState
vendored
@@ -1,6 +1,20 @@
|
|||||||
{
|
{
|
||||||
"epochs": [ {
|
"epochs": [ {
|
||||||
"calculation_time": "13407745316672915",
|
"calculation_time": "13409970184368503",
|
||||||
|
"config_version": 0,
|
||||||
|
"model_version": "0",
|
||||||
|
"padded_top_topics_start_index": 0,
|
||||||
|
"taxonomy_version": 0,
|
||||||
|
"top_topics_and_observing_domains": [ ]
|
||||||
|
}, {
|
||||||
|
"calculation_time": "13410596642026995",
|
||||||
|
"config_version": 0,
|
||||||
|
"model_version": "0",
|
||||||
|
"padded_top_topics_start_index": 0,
|
||||||
|
"taxonomy_version": 0,
|
||||||
|
"top_topics_and_observing_domains": [ ]
|
||||||
|
}, {
|
||||||
|
"calculation_time": "13411376394291911",
|
||||||
"config_version": 0,
|
"config_version": 0,
|
||||||
"model_version": "0",
|
"model_version": "0",
|
||||||
"padded_top_topics_start_index": 0,
|
"padded_top_topics_start_index": 0,
|
||||||
@@ -8,5 +22,5 @@
|
|||||||
"top_topics_and_observing_domains": [ ]
|
"top_topics_and_observing_domains": [ ]
|
||||||
} ],
|
} ],
|
||||||
"hex_encoded_hmac_key": "4E642EB949A7AB49761C11DC02ABA0FB1E46EECC80D17CFFE210EF757D5AF3DF",
|
"hex_encoded_hmac_key": "4E642EB949A7AB49761C11DC02ABA0FB1E46EECC80D17CFFE210EF757D5AF3DF",
|
||||||
"next_scheduled_calculation_time": "13408350116672979"
|
"next_scheduled_calculation_time": "13411981194292267"
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_0
vendored
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_0
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_1
vendored
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_1
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_2
vendored
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_2
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_3
vendored
BIN
library/jcef/cache/Default/Cache/Cache_Data/data_3
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/DIPS
vendored
BIN
library/jcef/cache/Default/DIPS
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/DawnGraphiteCache/data_1
vendored
BIN
library/jcef/cache/Default/DawnGraphiteCache/data_1
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/DawnWebGPUCache/data_1
vendored
BIN
library/jcef/cache/Default/DawnWebGPUCache/data_1
vendored
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-15:36:13.162 1b78 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
|
2025/12/28-14:50:54.309 d58 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
|
||||||
2025/11/16-15:36:13.163 1b78 Recovering log #3
|
2025/12/28-14:50:54.309 d58 Recovering log #3
|
||||||
2025/11/16-15:36:13.163 1b78 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log
|
2025/12/28-14:50:54.312 d58 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:14:54.664 ec0 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
|
2025/12/28-14:19:49.868 bcc Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/MANIFEST-000001
|
||||||
2025/11/16-14:14:54.667 ec0 Recovering log #3
|
2025/12/28-14:19:49.869 bcc Recovering log #3
|
||||||
2025/11/16-14:14:54.668 ec0 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log
|
2025/12/28-14:19:49.881 bcc Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Extension State/000003.log
|
||||||
|
|||||||
BIN
library/jcef/cache/Default/Favicons
vendored
BIN
library/jcef/cache/Default/Favicons
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/Favicons-journal
vendored
BIN
library/jcef/cache/Default/Favicons-journal
vendored
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:12:44.573 94 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
|
2025/12/28-14:50:57.787 24fc Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
|
||||||
2025/11/16-14:12:44.574 94 Recovering log #3
|
2025/12/28-14:50:57.787 24fc Recovering log #3
|
||||||
2025/11/16-14:12:44.574 94 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log
|
2025/12/28-14:50:57.788 24fc Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:11:32.786 6108 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
|
2025/12/28-14:19:54.454 4760 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/MANIFEST-000001
|
||||||
2025/11/16-14:11:32.787 6108 Recovering log #3
|
2025/12/28-14:19:54.457 4760 Recovering log #3
|
||||||
2025/11/16-14:11:32.787 6108 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log
|
2025/12/28-14:19:54.458 4760 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\GCM Store\Encryption/000003.log
|
||||||
|
|||||||
BIN
library/jcef/cache/Default/GPUCache/data_1
vendored
BIN
library/jcef/cache/Default/GPUCache/data_1
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/History
vendored
BIN
library/jcef/cache/Default/History
vendored
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-15:36:13.418 14a4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
|
2025/12/28-14:50:54.386 2b54 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
|
||||||
2025/11/16-15:36:13.433 14a4 Recovering log #44
|
2025/12/28-14:50:54.399 2b54 Recovering log #44
|
||||||
2025/11/16-15:36:13.440 14a4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log
|
2025/12/28-14:50:54.404 2b54 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:14:54.674 3450 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
|
2025/12/28-14:19:49.965 2d90 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/MANIFEST-000001
|
||||||
2025/11/16-14:14:54.685 3450 Recovering log #44
|
2025/12/28-14:19:49.981 2d90 Recovering log #44
|
||||||
2025/11/16-14:14:54.689 3450 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log
|
2025/12/28-14:19:49.986 2d90 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Local Storage\leveldb/000044.log
|
||||||
|
|||||||
BIN
library/jcef/cache/Default/Network/Cookies
vendored
BIN
library/jcef/cache/Default/Network/Cookies
vendored
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
library/jcef/cache/Default/Network/Reporting and NEL
vendored
BIN
library/jcef/cache/Default/Network/Reporting and NEL
vendored
Binary file not shown.
@@ -1 +1 @@
|
|||||||
{"sts":[{"expiry":1786970571.324373,"host":"CKgWF8Pt6+y0hclDrtEluIjL2FYgseRxvC7MGqrhWRI=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434571.324375},{"expiry":1786970748.345876,"host":"Fkw+OD9Mt6EPvdYMfEpOeOh5YtJfdmo+tIpYmrw/aHw=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434748.345878},{"expiry":1786952672.907422,"host":"F8CDsiT0h6lTN4Nqwoyb2wNyqqjWSTsRj/gzlYU3NfY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416672.907424},{"expiry":1787020707.436438,"host":"Ifty0kmGtBkqpzyRNEJ2iccvLpOffAEtEf72UjNCr0U=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484707.43644},{"expiry":1787020704.592068,"host":"M4bfUnCmQAi4PNb3B8aI/2+SVJhHKsMfMMT7fzi6ij4=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484704.592071},{"expiry":1771158958.946775,"host":"ODQpkumdnBklhBhFYjplmPIGUqnaPXWWo+CnFJ0/t6Q=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.946777},{"expiry":1786952673.49577,"host":"PKqosHGXLFTwexcsjC+UXTkKV3GWWHwtzKz/ULb9ssM=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755416673.495773},{"expiry":1787020905.689562,"host":"RzJ4U8oc5hFtdWWgqHrmedzdy4/1lFbezoh2vuM2sag=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484905.689566},{"expiry":1786970158.787767,"host":"TYKBX4bj7STJmdsAJf/AXVV5wkijZuQeyADuWpRjtV8=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.787769},{"expiry":1770986558.135948,"host":"ZYjgsmqK1UttB4LVvFgUJHAviltZMIazfUdho0vgoHQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434558.13595},{"expiry":1786970158.716881,"host":"cZAeyWA3fHA2TUtpNDfMvYMZuYmsyq5vod7XbsSSYrQ=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.716883},{"expiry":1794814574.257027,"host":"e3SziuwfuO2UvuBno+qkR1ObHAzZmSUoJhrc7dbP1Uo=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1763278574.257038},{"expiry":1786952041.049301,"host":"glefLLBZdcPMe88hNYSyH7izPjRoDmxZt9QhbJ5f3Yw=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416041.049304},{"expiry":1791358496.65612,"host":"nAuqgR4iEWti7SOdT3UHPl6rmZU/DeaIm38P2O2OkgA=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1759822496.656122},{"expiry":1771158958.82246,"host":"n/JnTog5u4dqIfqFFLydo6nGO69ZdnM1JYifZdoi7ss=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.822462},{"expiry":1789382403.778989,"host":"qaDeFdT1UTirY0OQe+c5LKw+zjx6vF/+3vFh7CgrAOY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1757846403.778991},{"expiry":1786952671.323698,"host":"ybtrRgz/Tr6DpPFcMRWkxm21VXSNujk8GGrWr9ew7/g=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416671.3237},{"expiry":1786970158.131997,"host":"5saCdK9MYjX/Itn8+aAtA/tRPNpaGBN3I3fjBzZOecQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.132},{"expiry":1789952777.339869,"host":"8/RrMmQlCD2Gsp14wUCE1P8r7B2C5+yE0+g79IPyRsc=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758416777.339871}],"version":2}
|
{"sts":[{"expiry":1786970571.324373,"host":"CKgWF8Pt6+y0hclDrtEluIjL2FYgseRxvC7MGqrhWRI=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434571.324375},{"expiry":1781472734.002118,"host":"E10e7Gwg5+phsYD4E8qNYFsQySXnIHPAfo4zloUPESc=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1765692734.002119},{"expiry":1786970748.345876,"host":"Fkw+OD9Mt6EPvdYMfEpOeOh5YtJfdmo+tIpYmrw/aHw=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434748.345878},{"expiry":1786952672.907422,"host":"F8CDsiT0h6lTN4Nqwoyb2wNyqqjWSTsRj/gzlYU3NfY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416672.907424},{"expiry":1787020707.436438,"host":"Ifty0kmGtBkqpzyRNEJ2iccvLpOffAEtEf72UjNCr0U=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484707.43644},{"expiry":1787020704.592068,"host":"M4bfUnCmQAi4PNb3B8aI/2+SVJhHKsMfMMT7fzi6ij4=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484704.592071},{"expiry":1771158958.946775,"host":"ODQpkumdnBklhBhFYjplmPIGUqnaPXWWo+CnFJ0/t6Q=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.946777},{"expiry":1786952673.49577,"host":"PKqosHGXLFTwexcsjC+UXTkKV3GWWHwtzKz/ULb9ssM=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755416673.495773},{"expiry":1787020905.689562,"host":"RzJ4U8oc5hFtdWWgqHrmedzdy4/1lFbezoh2vuM2sag=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755484905.689566},{"expiry":1786970158.787767,"host":"TYKBX4bj7STJmdsAJf/AXVV5wkijZuQeyADuWpRjtV8=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.787769},{"expiry":1770986558.135948,"host":"ZYjgsmqK1UttB4LVvFgUJHAviltZMIazfUdho0vgoHQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434558.13595},{"expiry":1786970158.716881,"host":"cZAeyWA3fHA2TUtpNDfMvYMZuYmsyq5vod7XbsSSYrQ=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1755434158.716883},{"expiry":1795327998.306247,"host":"e3SziuwfuO2UvuBno+qkR1ObHAzZmSUoJhrc7dbP1Uo=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1763791998.306249},{"expiry":1786952041.049301,"host":"glefLLBZdcPMe88hNYSyH7izPjRoDmxZt9QhbJ5f3Yw=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416041.049304},{"expiry":1798440655.010661,"host":"nAuqgR4iEWti7SOdT3UHPl6rmZU/DeaIm38P2O2OkgA=","mode":"force-https","sts_include_subdomains":false,"sts_observed":1766904655.010663},{"expiry":1771158958.82246,"host":"n/JnTog5u4dqIfqFFLydo6nGO69ZdnM1JYifZdoi7ss=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.822462},{"expiry":1797227932.989249,"host":"qaDeFdT1UTirY0OQe+c5LKw+zjx6vF/+3vFh7CgrAOY=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1765691932.989252},{"expiry":1786952671.323698,"host":"ybtrRgz/Tr6DpPFcMRWkxm21VXSNujk8GGrWr9ew7/g=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755416671.3237},{"expiry":1786970158.131997,"host":"5saCdK9MYjX/Itn8+aAtA/tRPNpaGBN3I3fjBzZOecQ=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1755434158.132},{"expiry":1789952777.339869,"host":"8/RrMmQlCD2Gsp14wUCE1P8r7B2C5+yE0+g79IPyRsc=","mode":"force-https","sts_include_subdomains":true,"sts_observed":1758416777.339871}],"version":2}
|
||||||
2
library/jcef/cache/Default/Preferences
vendored
2
library/jcef/cache/Default/Preferences
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-15:36:31.538 14a4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
|
2025/12/28-14:51:01.393 2160 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
|
||||||
2025/11/16-15:36:31.539 14a4 Recovering log #12
|
2025/12/28-14:51:01.395 2160 Recovering log #12
|
||||||
2025/11/16-15:36:31.542 14a4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log
|
2025/12/28-14:51:01.401 2160 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:15:05.342 200 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
|
2025/12/20-18:28:04.218 294 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/MANIFEST-000001
|
||||||
2025/11/16-14:15:05.344 200 Recovering log #12
|
2025/12/20-18:28:04.219 294 Recovering log #12
|
||||||
2025/11/16-14:15:05.347 200 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log
|
2025/12/20-18:28:04.222 294 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Session Storage/000012.log
|
||||||
|
|||||||
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-15:36:13.152 5138 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
|
2025/12/28-14:50:54.257 186c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
|
||||||
2025/11/16-15:36:13.154 5138 Recovering log #3
|
2025/12/28-14:50:54.263 186c Recovering log #3
|
||||||
2025/11/16-15:36:13.168 5138 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log
|
2025/12/28-14:50:54.264 186c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:14:54.588 27c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
|
2025/12/28-14:19:49.782 193c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/MANIFEST-000001
|
||||||
2025/11/16-14:14:54.588 27c Recovering log #3
|
2025/12/28-14:19:49.813 193c Recovering log #3
|
||||||
2025/11/16-14:14:54.590 27c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log
|
2025/12/28-14:19:49.814 193c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Site Characteristics Database/000003.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-15:36:13.093 4714 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
|
2025/12/28-14:50:54.253 37d4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
|
||||||
2025/11/16-15:36:13.104 4714 Recovering log #3
|
2025/12/28-14:50:54.263 37d4 Recovering log #3
|
||||||
2025/11/16-15:36:13.105 4714 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log
|
2025/12/28-14:50:54.264 37d4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:14:54.568 ec0 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
|
2025/12/28-14:19:49.766 bcc Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/MANIFEST-000001
|
||||||
2025/11/16-14:14:54.578 ec0 Recovering log #3
|
2025/12/28-14:19:49.813 bcc Recovering log #3
|
||||||
2025/11/16-14:14:54.578 ec0 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log
|
2025/12/28-14:19:49.814 bcc Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\Sync Data\LevelDB/000003.log
|
||||||
|
|||||||
BIN
library/jcef/cache/Default/Top Sites
vendored
BIN
library/jcef/cache/Default/Top Sites
vendored
Binary file not shown.
BIN
library/jcef/cache/Default/Visited Links
vendored
BIN
library/jcef/cache/Default/Visited Links
vendored
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-15:36:13.167 9a8 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
|
2025/12/28-14:50:54.299 22b4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
|
||||||
2025/11/16-15:36:13.168 9a8 Recovering log #13
|
2025/12/28-14:50:54.299 22b4 Recovering log #19
|
||||||
2025/11/16-15:36:13.169 9a8 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000013.log
|
2025/12/28-14:50:54.301 22b4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000019.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:14:54.657 27c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
|
2025/12/28-14:19:49.860 6ac Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/MANIFEST-000001
|
||||||
2025/11/16-14:14:54.658 27c Recovering log #13
|
2025/12/28-14:19:49.861 6ac Recovering log #19
|
||||||
2025/11/16-14:14:54.658 27c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000013.log
|
2025/12/28-14:19:49.866 6ac Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db/000019.log
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-15:36:13.140 9a8 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
|
2025/12/28-14:50:54.290 22b4 Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
|
||||||
2025/11/16-15:36:13.141 9a8 Recovering log #3
|
2025/12/28-14:50:54.291 22b4 Recovering log #3
|
||||||
2025/11/16-15:36:13.143 9a8 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log
|
2025/12/28-14:50:54.291 22b4 Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
2025/11/16-14:14:54.614 27c Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
|
2025/12/28-14:19:49.851 6ac Reusing MANIFEST C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/MANIFEST-000001
|
||||||
2025/11/16-14:14:54.615 27c Recovering log #3
|
2025/12/28-14:19:49.852 6ac Recovering log #3
|
||||||
2025/11/16-14:14:54.619 27c Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log
|
2025/12/28-14:19:49.854 6ac Reusing old log C:\Users\Administrator\MCreatorWorkspaces\AxisInnovatorsBox\library\jcef\cache\Default\shared_proto_db\metadata/000003.log
|
||||||
|
|||||||
BIN
library/jcef/cache/GrShaderCache/data_0
vendored
BIN
library/jcef/cache/GrShaderCache/data_0
vendored
Binary file not shown.
BIN
library/jcef/cache/GrShaderCache/data_1
vendored
BIN
library/jcef/cache/GrShaderCache/data_1
vendored
Binary file not shown.
BIN
library/jcef/cache/GrShaderCache/data_3
vendored
BIN
library/jcef/cache/GrShaderCache/data_3
vendored
Binary file not shown.
BIN
library/jcef/cache/GraphiteDawnCache/data_1
vendored
BIN
library/jcef/cache/GraphiteDawnCache/data_1
vendored
Binary file not shown.
BIN
library/jcef/cache/Last Browser
vendored
BIN
library/jcef/cache/Last Browser
vendored
Binary file not shown.
2
library/jcef/cache/Local State
vendored
2
library/jcef/cache/Local State
vendored
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJtYW5pZmVzdC5qc29uIiwicm9vdF9oYXNoIjoieGs1RjVGekZ2WktUWWl5ek8xblpPYkdWLTkyMzNHelZrclNKLUZjOFRFbyJ9XSwiZm9ybWF0IjoidHJlZWhhc2giLCJoYXNoX2Jsb2NrX3NpemUiOjQwOTZ9XSwiaXRlbV9pZCI6Imxsa2dqZmZjZHBmZm1oaWFrbWZjZGNibG9oY2NwZm1vIiwiaXRlbV92ZXJzaW9uIjoiMS4wLjAuMTgiLCJwcm90b2NvbF92ZXJzaW9uIjoxfQ","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"QRaGELghjHv0t2GYRo6Eu7XbIzH-3hdNOy0iSCD1qEb1Pp4F0d3VbyP5bTgERZ2AzMb3TAvVZMK_sE_ts18EAdXwltdTXYeZHmroN2B_ixdQ-nFYH5KrsvCdmsjjTf19uocT3IlfAIcaf7dhqLX1tPV0pnJ2EXw3Iwb0FJl08MCtab9y1_WUwXKLqt_5aNppkB2X1ytWwgBWOfKFDvuiRi3ri5NwPPSJXeNal0Pr-d0e6mBg6PyM5C2_ZC8jtkDUam8IyxtTynjwy1oG52FD7zuV2091xxDzdRen12zMdxtuGakMsHRgBVYxXJBNJ3Z4DYqHVTCYSKS-3eo9jPUTcQ"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"YQLDrVMllSZ2igdaPuiES_SDUFw5DuzQ-q_f405BYJflKZOSHpisX0ngu1j0_MKJtw2o6kM-LiIgvDodJRARG6hbtnJavtpdo1bxXbKTZxWZ6wg4LsT-9fqYYwbeytHmJ0spSEzu4Mu2zW7fjDHdDh7IxRfj_1JLo2nizsFDz9pFwA-z7w_Rw_az7o2wWJ_m7JA5f4V7cd3nUWe3dbrGVSA0akUSR2J2AcEwBwDZhWESCuyKD1ZlefARS451M3dUOsMUsz0U88wONFMnMQ89jorHLJi3EWB8f_Z83NRSjZ6L3cjrFPl_0MT0Inr8wcEP0E4MEYeswR_jsWSVVou9-g"}]}}]
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
1.ee4b855eb4e00f150fe268baead4f478bf3f5a6b9b8b89026d71e09c368876f8
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"description" : "Origin Trials public key updates and disabled features list",
|
|
||||||
"manifest_version" : 3,
|
|
||||||
"minimum_chrome_version" : "88",
|
|
||||||
"name" : "Origin Trials Updates",
|
|
||||||
"origin-trials" :
|
|
||||||
{
|
|
||||||
"disabled-features" :
|
|
||||||
[
|
|
||||||
"CanvasTextNg"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"update_url" : "https://clients2.google.com/service/update2/crx",
|
|
||||||
"version" : "1.0.0.18"
|
|
||||||
}
|
|
||||||
BIN
library/jcef/cache/ShaderCache/data_1
vendored
BIN
library/jcef/cache/ShaderCache/data_1
vendored
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJtYW5pZmVzdC5qc29uIiwicm9vdF9oYXNoIjoiT29iUUNZTVdTSFVnN2IzdjAtSDBXNmVrTEVManlJeGpwOXQ5b1o5d0pNcyJ9LHsicGF0aCI6Im1ldGFkYXRhLnBiIiwicm9vdF9oYXNoIjoicjF3cHgtMy04Q1AzaFR1cTJrRXhDLXJwcDZJWk9iZXJDUXFMdjladVVxOCJ9XSwiZm9ybWF0IjoidHJlZWhhc2giLCJoYXNoX2Jsb2NrX3NpemUiOjQwOTZ9XSwiaXRlbV9pZCI6ImpmbGhjaGNjbXBwa2ZlYmtpYW1pbmFnZWVobWNoaWttIiwiaXRlbV92ZXJzaW9uIjoiMjAyNS4xMC41LjEiLCJwcm90b2NvbF92ZXJzaW9uIjoxfQ","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"E53SrBTj8Fh4ZE0lHaOqjNsKfWHegDLUCH2fDmNFg7wJqJo-XFqeq480MzuzAMkADwy4abj-ll06YUH0Vy2DJjqOm_0YBe8pLoCmpX_kgGCRNS-GynWOrnXOoDq-r7YdMEJiwqtpz-RhcLB0i3mMI-OdSvX3TFeRMCkHlovJF_FEUVnLZgus3ITP5X8thlzVR6phXshphjmMm3tyWX3yOuFYqvCJ1qaXbVPdIntQ1fe7ShBY8ZX0OZS4acpmNsPnCTVpd4_gEPKPldf5VwblxHu1hdI8c9TGs0l2tlmVDY7am4Bf0S3q4_M7tY5TIyVSdhqtk_H2QJEgcxz6Xe6WQkUhjHQOFSpRTCjGbjA42tf-uieLr2g8mnXqWxUcCoUVRe2Ni-1DYhuQt6fgXdVm4numTnnXhTm8bozjJLLBkfitHC_1tsVVb-Sj5X0KFYedFihlX1PAkZrf7HMmAfpeN_6DiWR1-o5dErTecv1fM5c1MTtYvYRWeUz4pQe6wNfD4KPsl8FWV5Qc60ddr86dbNPmHqWvucWCvQa7kXCyXKkq_lwNqXsSQxNy62ENmUmVWNtBGrox2QGSbx0lkrv7rExRdnhw_MXpEHUHNMAjB9D89RbhAsJCq8JMdNqFPyI-NwwcSSRlR3fhV62I6Ljg_lgtUIm1-6OLc3eOFFX0abU"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"MRD_RWRfn2WMAVlkUdOAympEslgx1sjomkqS_HwJkYjSCLfZFSEGyveDGkVKenylFuV8Sg4cyPwnk_z9XQoWmQsG2nASBLC85Pu1IkKdMOiGx8H3DFS68-bGIhxkjuEkvnXfDwWS_UiMmp-uERSlbKNaEFk5jm780gpoi_SmZqu9dWPzWqvX1Xle3xhpkLf6Es-6HlcVNNbBKaGKwqhHPn859MzJoDIWL7WGSiz5J8cxZoPN0SbzxU28wwTyzw6wZejdvC6FPvT7ESud8x8wsEKkI552fnMxDvs38s1iNWaGzHPVm2xC3EtToIAK75F27qt5Ijh1OK55C6dP4OY78Q"}]}}]
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
1.b911063da66cd283f0cd92d5b40fa36d891e285ffd0b67e7af79219db69ee5c7
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"manifest_version": 2,
|
|
||||||
"name": "Third-Party Cookie Deprecation Metadata",
|
|
||||||
"version": "2025.10.5.1"
|
|
||||||
}
|
|
||||||
Binary file not shown.
2
library/jcef/cache/Variations
vendored
2
library/jcef/cache/Variations
vendored
@@ -1 +1 @@
|
|||||||
{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":386}
|
{"user_experience_metrics.stability.exited_cleanly":false,"variations_crash_streak":594}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
Google LLC and its affiliates ("Google") own all legal right, title and
|
|
||||||
interest in and to the content decryption module software ("Software") and
|
|
||||||
related documentation, including any intellectual property rights in the
|
|
||||||
Software. You may not use, modify, sell, or otherwise distribute the Software
|
|
||||||
without a separate license agreement with Google. The Software is not open
|
|
||||||
source software.
|
|
||||||
|
|
||||||
If you are interested in licensing the Software, please contact
|
|
||||||
www.widevine.com
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJMSUNFTlNFIiwicm9vdF9oYXNoIjoicjdVVTVDYVZsQ05MTXNoenVpelR6SWlTNkRhR0VUZTFNYVFLRWpLQ0RGayJ9LHsicGF0aCI6Il9wbGF0Zm9ybV9zcGVjaWZpYy93aW5feDY0L3dpZGV2aW5lY2RtLmRsbCIsInJvb3RfaGFzaCI6IjN2S2p0YmhOVEh1THVWZGdCQjZmbmxCcWZvUkQ3cjB1a3E0S0kzdEhSOE0ifSx7InBhdGgiOiJfcGxhdGZvcm1fc3BlY2lmaWMvd2luX3g2NC93aWRldmluZWNkbS5kbGwuc2lnIiwicm9vdF9oYXNoIjoidmE1N2JDM2pXSEtDZ0o4dTRiQjlzTEtYYWQ0czZhN0FiME9aYUZ4M0tiYyJ9LHsicGF0aCI6Im1hbmlmZXN0Lmpzb24iLCJyb290X2hhc2giOiJUdFBHT0o5dmZObE50YzBQaHd3MG9wYjhEZU94NXdmOHp3RmtXMFZYa000In1dLCJmb3JtYXQiOiJ0cmVlaGFzaCIsImhhc2hfYmxvY2tfc2l6ZSI6NDA5Nn1dLCJpdGVtX2lkIjoib2ltb21wZWNhZ25hamRlamdubmppam9iZWJhZWlnZWsiLCJpdGVtX3ZlcnNpb24iOiI0LjEwLjI4OTEuMCIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"l6vfhExGU7tsRAr-IwvL55nkUuou1seQjI2-S7bAMkOIk9q4kBgJgjOWZHzIzt3HNaAvyrdz6LQiYBJl4wRtHLPfNUxbC5IC6CBD9S7teWVzZCFOjCHIhxFldn9lRKf0SXuYcc9aHkIEj6mbbouTzBBUZ-pNDri0TKQ1vGvM7OM"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"AqEnL9Iqt_GjxwZruiCa5pTUNX5SB1IachQtE86LWb7n2FpVzeP32wcmqro2DZT_oZvmVAR6PVndi4BAuH2a8IC3m0EQFNPzpUv5w7dXRpjVklia3KygW7cDZLZP0WdqGhsHWHqLV4AHIbjnvgvTwAUjrEfqQW1h2_fTu2dIyg2lr7MUrrmNWkoJT2ewbA7xMXsfvnH_eI89IJbDwVX1EOdKSKlbiHrN2CtI-ZsFQ9z59l56pSUyA6lrFKTlkgVzq0f9cRtDFOtQDc0ILWa-vuBj-OxmFON_ShB1B4Ye0PXJgfULfuYaO6EtJs-D4oImI8Ti4H5Ie-61mIg1AyFmVA"}]}}]
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
1.a6af95a209b2e652ed6766804b9b8ad6b6a68f2c610b8f14713cd40df0d62bf9
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"manifest_version": 2,
|
|
||||||
"update_url": "https://clients2.google.com/service/update2/crx",
|
|
||||||
"name": "WidevineCdm",
|
|
||||||
"description": "Widevine Content Decryption Module",
|
|
||||||
"version": "4.10.2891.0",
|
|
||||||
"minimum_chrome_version": "68.0.3430.0",
|
|
||||||
"x-cdm-module-versions": "4",
|
|
||||||
"x-cdm-interface-versions": "10",
|
|
||||||
"x-cdm-host-versions": "10",
|
|
||||||
"x-cdm-codecs": "vp8,vp09,avc1,av01",
|
|
||||||
"x-cdm-persistent-license-support": true,
|
|
||||||
"x-cdm-supported-encryption-schemes": [
|
|
||||||
"cenc",
|
|
||||||
"cbcs"
|
|
||||||
],
|
|
||||||
"icons": {
|
|
||||||
"16": "imgs/icon-128x128.png",
|
|
||||||
"128": "imgs/icon-128x128.png"
|
|
||||||
},
|
|
||||||
"platforms": [
|
|
||||||
{
|
|
||||||
"os": "win",
|
|
||||||
"arch": "x64",
|
|
||||||
"sub_package_path": "_platform_specific/win_x64/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"os": "win",
|
|
||||||
"arch": "x86",
|
|
||||||
"sub_package_path": "_platform_specific/win_x86/"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"os": "win",
|
|
||||||
"arch": "arm64",
|
|
||||||
"sub_package_path": "_platform_specific/win_arm64/"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"accept_arch": [
|
|
||||||
"x64",
|
|
||||||
"x86_64",
|
|
||||||
"x86_64h"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
78
library/jcef/cache/chrome_debug.log
vendored
78
library/jcef/cache/chrome_debug.log
vendored
@@ -1,72 +1,6 @@
|
|||||||
[25176:20700:1116/134535.058:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
[12284:16860:1228/145054.244:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
||||||
[25176:20700:1116/134535.093:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
[12284:16860:1228/145054.280:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
||||||
[24656:20712:1116/134535.315:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
[8880:16484:1228/145054.563:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
||||||
[6424:3776:1116/134735.388:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
[13676:18520:1228/145254.442:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
||||||
[25116:23752:1116/134835.102:ERROR:gpu_blocklist.cc(71)] Unable to get gpu adapter
|
[14320:9004:1228/145354.607:ERROR:gpu_blocklist.cc(71)] Unable to get gpu adapter
|
||||||
[25176:20700:1116/134835.103:ERROR:service_client.cc(36)] Unexpected on_device_model service disconnect: The device's GPU is not supported.
|
[12284:16860:1228/145354.607:ERROR:service_client.cc(36)] Unexpected on_device_model service disconnect: The device's GPU is not supported.
|
||||||
[25012:3556:1116/135030.390:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[25012:3556:1116/135030.422:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[25416:22984:1116/135030.626:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[22104:4432:1116/135101.126:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[22104:4432:1116/135101.158:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[4292:15180:1116/135101.362:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[8940:2448:1116/135102.484:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
|
|
||||||
[24120:23064:1116/135131.279:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[24120:23064:1116/135131.313:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[3128:22532:1116/135131.526:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[24680:4656:1116/135334.771:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[24680:4656:1116/135334.802:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[18180:2464:1116/135335.025:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[22568:8176:1116/135603.988:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[22568:8176:1116/135604.019:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[1740:19120:1116/135604.262:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[24072:24800:1116/135804.268:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[24628:17756:1116/135904.034:ERROR:gpu_blocklist.cc(71)] Unable to get gpu adapter
|
|
||||||
[22568:8176:1116/135904.034:ERROR:service_client.cc(36)] Unexpected on_device_model service disconnect: The device's GPU is not supported.
|
|
||||||
[22968:14560:1116/140111.527:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[22968:14560:1116/140111.574:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[15972:3044:1116/140111.769:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[23484:25224:1116/140142.940:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[23484:25224:1116/140142.970:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[9076:18484:1116/140143.178:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[13380:24952:1116/140143.506:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
|
|
||||||
[13380:24952:1116/140143.521:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
|
|
||||||
[13380:24952:1116/140143.522:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
|
|
||||||
[13380:24952:1116/140143.522:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
|
|
||||||
[22408:24528:1116/140324.353:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[22408:24528:1116/140324.387:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[4316:23620:1116/140324.585:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[20956:24116:1116/140524.561:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[2332:23256:1116/140529.242:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[2332:23256:1116/140529.277:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[21212:22652:1116/140529.475:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[24336:23236:1116/140612.851:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[24336:23236:1116/140612.890:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[22856:13480:1116/140613.091:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[23048:12868:1116/140707.334:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[23048:12868:1116/140707.371:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[20416:10836:1116/140707.573:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[9900:24972:1116/140708.787:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
|
|
||||||
[9900:24972:1116/140708.788:WARNING:backend_impl.cc(1757)] Destroying invalid entry.
|
|
||||||
[24012:8024:1116/140818.429:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[24012:8024:1116/140818.460:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[12504:7372:1116/140818.650:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[20088:24612:1116/140921.658:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[20088:24612:1116/140921.690:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[17892:22072:1116/140921.900:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[23516:10028:1116/141013.800:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[23516:10028:1116/141013.833:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[15276:23988:1116/141014.056:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[21372:25472:1116/141108.344:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[21372:25472:1116/141108.378:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[9164:25548:1116/141108.569:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[19976:8024:1116/141220.067:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[19976:8024:1116/141220.104:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[20268:19948:1116/141220.294:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[22624:21192:1116/141420.243:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[13532:6284:1116/141454.556:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[13532:6284:1116/141454.590:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[25364:4332:1116/141454.798:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
[3564:24164:1116/153613.078:WARNING:account_consistency_mode_manager.cc(77)] Desktop Identity Consistency cannot be enabled as no OAuth client ID and client secret have been configured.
|
|
||||||
[3564:24164:1116/153613.112:WARNING:extension_service.cc(2065)] Found external version of extension ncennffkjdiamlpmcbajkmaiiiddgioothat is older than current version. Current version is: 3.52.14. New version is: 3.52.5. Keeping current version.
|
|
||||||
[10268:6444:1116/153613.586:WARNING:viz_main_impl.cc(85)] VizNullHypothesis is disabled (not a warning)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
library/jcef/cache/first_party_sets.db
vendored
BIN
library/jcef/cache/first_party_sets.db
vendored
Binary file not shown.
BIN
library/jcef/cache/segmentation_platform/ukm_db
vendored
BIN
library/jcef/cache/segmentation_platform/ukm_db
vendored
Binary file not shown.
Binary file not shown.
BIN
sql_learning.db
Normal file
BIN
sql_learning.db
Normal file
Binary file not shown.
6
sql_learning.lock.db
Normal file
6
sql_learning.lock.db
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#FileLock
|
||||||
|
#Sun Dec 28 14:52:28 CST 2025
|
||||||
|
hostName=192.168.116.1
|
||||||
|
id=19b63bad12a8483d76995f9c5100715a8b474ee84cc
|
||||||
|
method=file
|
||||||
|
server=192.168.116.1\:64976
|
||||||
200
sql_learning.trace.db
Normal file
200
sql_learning.trace.db
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
2025-12-12 17:22:54 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]ues students"; expected "UPDATE, USE"; SQL statement:
|
||||||
|
ues students [42001-220]
|
||||||
|
2025-12-12 17:23:23 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "STUDENTS" not found; SQL statement:
|
||||||
|
SELECT students [42122-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
|
||||||
|
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
|
||||||
|
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
|
||||||
|
at org.h2.command.query.Select.optimizeExpressionsAndPreserveAliases(Select.java:1285)
|
||||||
|
at org.h2.command.query.Select.prepareExpressions(Select.java:1167)
|
||||||
|
at org.h2.command.query.Query.prepare(Query.java:218)
|
||||||
|
at org.h2.command.Parser.prepareCommand(Parser.java:583)
|
||||||
|
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
|
||||||
|
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
|
||||||
|
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-12 17:24:37 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "STUDENTS" not found; SQL statement:
|
||||||
|
SET SCHEMA students [90079-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.engine.Database.getSchema(Database.java:1548)
|
||||||
|
at org.h2.command.dml.Set.update(Set.java:397)
|
||||||
|
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
|
||||||
|
at org.h2.command.Command.executeUpdate(Command.java:252)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-12 21:13:44 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]mysql"; expected "MERGE"; SQL statement:
|
||||||
|
mysql [42001-220]
|
||||||
|
2025-12-12 21:13:50 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "?[*]"; expected "="; SQL statement:
|
||||||
|
? [42001-220]
|
||||||
|
2025-12-12 21:14:03 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]EXIT"; expected "EXPLAIN, EXECUTE"; SQL statement:
|
||||||
|
EXIT [42001-220]
|
||||||
|
2025-12-12 21:14:07 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]exit"; expected "EXPLAIN, EXECUTE"; SQL statement:
|
||||||
|
exit [42001-220]
|
||||||
|
2025-12-12 21:14:21 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]cls"; expected "COMMIT, CREATE, CALL, CHECKPOINT, COMMENT"; SQL statement:
|
||||||
|
cls [42001-220]
|
||||||
|
2025-12-12 21:14:31 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "[*]quit"; SQL statement:
|
||||||
|
quit [42000-220]
|
||||||
|
2025-12-12 21:15:15 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "DATABASE" not found; SQL statement:
|
||||||
|
SELECT * FROM database() [90022-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.command.Parser.getFunctionAliasWithinPath(Parser.java:2576)
|
||||||
|
at org.h2.command.Parser.readTableFunction(Parser.java:2060)
|
||||||
|
at org.h2.command.Parser.readTablePrimary(Parser.java:1908)
|
||||||
|
at org.h2.command.Parser.readTableReference(Parser.java:2391)
|
||||||
|
at org.h2.command.Parser.parseSelectFromPart(Parser.java:2844)
|
||||||
|
at org.h2.command.Parser.parseSelect(Parser.java:2950)
|
||||||
|
at org.h2.command.Parser.parseQueryPrimary(Parser.java:2834)
|
||||||
|
at org.h2.command.Parser.parseQueryTerm(Parser.java:2690)
|
||||||
|
at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2669)
|
||||||
|
at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2662)
|
||||||
|
at org.h2.command.Parser.parseQueryExpression(Parser.java:2655)
|
||||||
|
at org.h2.command.Parser.parseQuery(Parser.java:2624)
|
||||||
|
at org.h2.command.Parser.parsePrepared(Parser.java:732)
|
||||||
|
at org.h2.command.Parser.parse(Parser.java:697)
|
||||||
|
at org.h2.command.Parser.parse(Parser.java:669)
|
||||||
|
at org.h2.command.Parser.prepareCommand(Parser.java:577)
|
||||||
|
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
|
||||||
|
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
|
||||||
|
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-12 21:15:26 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "DATABASES" not found; SQL statement:
|
||||||
|
SELECT * FROM databases() [90022-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.command.Parser.getFunctionAliasWithinPath(Parser.java:2576)
|
||||||
|
at org.h2.command.Parser.readTableFunction(Parser.java:2060)
|
||||||
|
at org.h2.command.Parser.readTablePrimary(Parser.java:1908)
|
||||||
|
at org.h2.command.Parser.readTableReference(Parser.java:2391)
|
||||||
|
at org.h2.command.Parser.parseSelectFromPart(Parser.java:2844)
|
||||||
|
at org.h2.command.Parser.parseSelect(Parser.java:2950)
|
||||||
|
at org.h2.command.Parser.parseQueryPrimary(Parser.java:2834)
|
||||||
|
at org.h2.command.Parser.parseQueryTerm(Parser.java:2690)
|
||||||
|
at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2669)
|
||||||
|
at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2662)
|
||||||
|
at org.h2.command.Parser.parseQueryExpression(Parser.java:2655)
|
||||||
|
at org.h2.command.Parser.parseQuery(Parser.java:2624)
|
||||||
|
at org.h2.command.Parser.parsePrepared(Parser.java:732)
|
||||||
|
at org.h2.command.Parser.parse(Parser.java:697)
|
||||||
|
at org.h2.command.Parser.parse(Parser.java:669)
|
||||||
|
at org.h2.command.Parser.prepareCommand(Parser.java:577)
|
||||||
|
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
|
||||||
|
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
|
||||||
|
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-12 21:16:23 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "ADS" not found; SQL statement:
|
||||||
|
SET SCHEMA ads [90079-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.engine.Database.getSchema(Database.java:1548)
|
||||||
|
at org.h2.command.dml.Set.update(Set.java:397)
|
||||||
|
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
|
||||||
|
at org.h2.command.Command.executeUpdate(Command.java:252)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-12 21:16:37 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema "ADS" not found; SQL statement:
|
||||||
|
SET SCHEMA ads [90079-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:644)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.engine.Database.getSchema(Database.java:1548)
|
||||||
|
at org.h2.command.dml.Set.update(Set.java:397)
|
||||||
|
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
|
||||||
|
at org.h2.command.Command.executeUpdate(Command.java:252)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-12 21:17:05 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "10ada" not found; SQL statement:
|
||||||
|
SELECT "10ada"*100 [42122-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
|
||||||
|
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
|
||||||
|
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
|
||||||
|
at org.h2.expression.BinaryOperation.optimize(BinaryOperation.java:131)
|
||||||
|
at org.h2.command.query.Select.optimizeExpressionsAndPreserveAliases(Select.java:1285)
|
||||||
|
at org.h2.command.query.Select.prepareExpressions(Select.java:1167)
|
||||||
|
at org.h2.command.query.Query.prepare(Query.java:218)
|
||||||
|
at org.h2.command.Parser.prepareCommand(Parser.java:583)
|
||||||
|
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
|
||||||
|
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
|
||||||
|
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-12 21:17:09 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "10ada" not found; SQL statement:
|
||||||
|
SELECT "10ada" * 100 [42122-220]
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)
|
||||||
|
at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:223)
|
||||||
|
at org.h2.message.DbException.get(DbException.java:199)
|
||||||
|
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
|
||||||
|
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
|
||||||
|
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
|
||||||
|
at org.h2.expression.BinaryOperation.optimize(BinaryOperation.java:131)
|
||||||
|
at org.h2.command.query.Select.optimizeExpressionsAndPreserveAliases(Select.java:1285)
|
||||||
|
at org.h2.command.query.Select.prepareExpressions(Select.java:1167)
|
||||||
|
at org.h2.command.query.Query.prepare(Query.java:218)
|
||||||
|
at org.h2.command.Parser.prepareCommand(Parser.java:583)
|
||||||
|
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:634)
|
||||||
|
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:557)
|
||||||
|
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||||
|
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237)
|
||||||
|
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication.executeRealSQL(MainApplication.java:136)
|
||||||
|
at com.axis.innovators.box.browser.MainApplication$1.onQuery(MainApplication.java:265)
|
||||||
|
2025-12-15 10:39:15 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "DELETE add[*]"; expected "., FROM"; SQL statement:
|
||||||
|
DELETE add [42001-220]
|
||||||
|
2025-12-15 10:39:23 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "DELETE [*]TABLE add"; expected "identifier"; SQL statement:
|
||||||
|
DELETE TABLE add [42001-220]
|
||||||
|
2025-12-15 10:39:48 jdbc[3]: exception
|
||||||
|
org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "DELETE [*]/?"; expected "identifier"; SQL statement:
|
||||||
|
DELETE /? [42001-220]
|
||||||
@@ -96,8 +96,6 @@ public class AxisInnovatorsBox {
|
|||||||
private final boolean isDebug;
|
private final boolean isDebug;
|
||||||
private static DebugWindow debugWindow;
|
private static DebugWindow debugWindow;
|
||||||
|
|
||||||
private static LoginData loginData;
|
|
||||||
|
|
||||||
public AxisInnovatorsBox(String[] args, boolean isDebug, boolean quickStart) {
|
public AxisInnovatorsBox(String[] args, boolean isDebug, boolean quickStart) {
|
||||||
this.args = args;
|
this.args = args;
|
||||||
this.isDebug = isDebug;
|
this.isDebug = isDebug;
|
||||||
@@ -145,6 +143,7 @@ public class AxisInnovatorsBox {
|
|||||||
token = null;
|
token = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
LoginData loginData;
|
||||||
if (token == null || token.isEmpty()) {
|
if (token == null || token.isEmpty()) {
|
||||||
LoginResult loginResult = CasdoorLoginWindow.showLoginDialogAndGetLoginResult();
|
LoginResult loginResult = CasdoorLoginWindow.showLoginDialogAndGetLoginResult();
|
||||||
if (loginResult == null) {
|
if (loginResult == null) {
|
||||||
@@ -1073,20 +1072,12 @@ public class AxisInnovatorsBox {
|
|||||||
// Set the exception handler for EDT(event dispatcher thread)
|
// Set the exception handler for EDT(event dispatcher thread)
|
||||||
System.setProperty("sun.awt.exception.handler", EDTCrashHandler.class.getName());
|
System.setProperty("sun.awt.exception.handler", EDTCrashHandler.class.getName());
|
||||||
|
|
||||||
// Check if AxisInnovatorsBox is started
|
main = new AxisInnovatorsBox(args,isDebug,quickStart);
|
||||||
// If it's started, and it's not a quick start, don't allow it
|
|
||||||
// because it's already started
|
if (quickStart) {
|
||||||
// Stop loading if the current running context is the quickStart context
|
|
||||||
if (AxisInnovatorsBox.getMain() != null
|
|
||||||
&& !AxisInnovatorsBox.getMain().getQuickStart() || quickStart) {
|
|
||||||
// Manually created if it is a quickStart context and the AxisInnovatorsBox instance in the context is empty
|
|
||||||
if (AxisInnovatorsBox.getMain() == null && quickStart) {
|
|
||||||
new AxisInnovatorsBox(args,isDebug,true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
main = new AxisInnovatorsBox(args,isDebug,false);
|
|
||||||
try {
|
try {
|
||||||
main.initLog4j2();
|
main.initLog4j2();
|
||||||
main.setTopic();
|
main.setTopic();
|
||||||
|
|||||||
@@ -74,11 +74,7 @@ public class Main {
|
|||||||
String path = fileInfo.get("path");
|
String path = fileInfo.get("path");
|
||||||
if (".jar".equals(extension)) {
|
if (".jar".equals(extension)) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
try {
|
ModernJarViewer.popupSimulatingWindow(null,path);
|
||||||
UIManager.setLookAndFeel(new com.formdev.flatlaf.FlatDarculaLaf());
|
|
||||||
} catch (Exception ignored) {}
|
|
||||||
ModernJarViewer viewer = new ModernJarViewer(null, path);
|
|
||||||
viewer.setVisible(true);
|
|
||||||
});
|
});
|
||||||
releaseLock(); // 释放锁(窗口模式)
|
releaseLock(); // 释放锁(窗口模式)
|
||||||
quickStart = true;
|
quickStart = true;
|
||||||
@@ -139,7 +135,6 @@ public class Main {
|
|||||||
if (lockFile != null) {
|
if (lockFile != null) {
|
||||||
lockFile.close();
|
lockFile.close();
|
||||||
}
|
}
|
||||||
// 可选:删除锁文件
|
|
||||||
new File(LOCK_FILE).delete();
|
new File(LOCK_FILE).delete();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -10,10 +10,7 @@ import org.cef.CefSettings;
|
|||||||
import org.cef.browser.CefBrowser;
|
import org.cef.browser.CefBrowser;
|
||||||
import org.cef.browser.CefFrame;
|
import org.cef.browser.CefFrame;
|
||||||
import org.cef.browser.CefMessageRouter;
|
import org.cef.browser.CefMessageRouter;
|
||||||
import org.cef.callback.CefContextMenuParams;
|
import org.cef.callback.*;
|
||||||
import org.cef.callback.CefJSDialogCallback;
|
|
||||||
import org.cef.callback.CefMenuModel;
|
|
||||||
import org.cef.callback.CefQueryCallback;
|
|
||||||
import org.cef.handler.*;
|
import org.cef.handler.*;
|
||||||
import org.cef.misc.BoolRef;
|
import org.cef.misc.BoolRef;
|
||||||
import org.cef.network.CefRequest;
|
import org.cef.network.CefRequest;
|
||||||
@@ -307,44 +304,30 @@ public class BrowserWindow extends JFrame {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
client.addLifeSpanHandler(new CefLifeSpanHandlerAdapter() {
|
|
||||||
@Override
|
|
||||||
public boolean onBeforePopup(CefBrowser browser, CefFrame frame,
|
|
||||||
String targetUrl, String targetFrameName) {
|
|
||||||
// 处理弹出窗口:根据配置决定打开方式
|
|
||||||
if (builder.openLinksInExternalBrowser) {
|
|
||||||
// 使用默认浏览器打开
|
|
||||||
try {
|
|
||||||
Desktop.getDesktop().browse(new URI(targetUrl));
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.out.println("Failed to open external browser: " + e.getMessage());
|
|
||||||
}
|
|
||||||
return true; // 拦截弹窗
|
|
||||||
} else {
|
|
||||||
// 在当前浏览器中打开
|
|
||||||
browser.loadURL(targetUrl);
|
|
||||||
return true; // 拦截弹窗并在当前窗口打开
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
client.addRequestHandler(new CefRequestHandlerAdapter() {
|
client.addRequestHandler(new CefRequestHandlerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame,
|
public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame,
|
||||||
CefRequest request, boolean userGesture, boolean isRedirect) {
|
CefRequest request, boolean userGesture, boolean isRedirect) {
|
||||||
// 处理主窗口导航
|
|
||||||
|
String url = request.getURL();
|
||||||
|
|
||||||
|
// 【关键判断】如果是 data: 协议,绝对禁止调用 Desktop.browse
|
||||||
|
// 返回 false 让 CEF 内核自己渲染这个 Base64 内容
|
||||||
|
if (url != null && url.toLowerCase().startsWith("data:")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理其他普通链接 (http/https/file)
|
||||||
if (userGesture) {
|
if (userGesture) {
|
||||||
if (builder.openLinksInExternalBrowser) {
|
if (builder.openLinksInExternalBrowser) {
|
||||||
// 使用默认浏览器打开
|
|
||||||
try {
|
try {
|
||||||
Desktop.getDesktop().browse(new URI(request.getURL()));
|
Desktop.getDesktop().browse(new URI(url));
|
||||||
return true; // 取消内置浏览器导航
|
return true; // 拦截,交给系统
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.out.println("Failed to open external browser: " + e.getMessage());
|
System.out.println("外部浏览器打开失败: " + e.getMessage());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 允许在当前浏览器中打开
|
return false; // 允许内部跳转
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -426,10 +409,26 @@ public class BrowserWindow extends JFrame {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
client.addDownloadHandler(new org.cef.handler.CefDownloadHandler() {
|
||||||
|
@Override
|
||||||
|
public void onBeforeDownload(org.cef.browser.CefBrowser browser,
|
||||||
|
org.cef.callback.CefDownloadItem downloadItem,
|
||||||
|
String suggestedName,
|
||||||
|
org.cef.callback.CefBeforeDownloadCallback callback) {
|
||||||
|
callback.Continue(suggestedName, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDownloadUpdated(org.cef.browser.CefBrowser browser,
|
||||||
|
org.cef.callback.CefDownloadItem downloadItem,
|
||||||
|
org.cef.callback.CefDownloadItemCallback callback) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
client.addJSDialogHandler(new CefJSDialogHandlerAdapter() {
|
client.addJSDialogHandler(new CefJSDialogHandlerAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onJSDialog(CefBrowser browser, String origin_url, CefJSDialogHandler.JSDialogType dialog_type, String message_text, String default_prompt_text, CefJSDialogCallback callback, BoolRef suppress_message) {
|
public boolean onJSDialog(CefBrowser browser, String origin_url, JSDialogType dialog_type, String message_text, String default_prompt_text, CefJSDialogCallback callback, BoolRef suppress_message) {
|
||||||
if (dialog_type == CefJSDialogHandler.JSDialogType.JSDIALOGTYPE_ALERT) {
|
if (dialog_type == JSDialogType.JSDIALOGTYPE_ALERT) {
|
||||||
SwingUtilities.invokeLater(() -> {
|
SwingUtilities.invokeLater(() -> {
|
||||||
JOptionPane.showMessageDialog(
|
JOptionPane.showMessageDialog(
|
||||||
BrowserWindow.this,
|
BrowserWindow.this,
|
||||||
@@ -437,23 +436,81 @@ public class BrowserWindow extends JFrame {
|
|||||||
"警告",
|
"警告",
|
||||||
JOptionPane.INFORMATION_MESSAGE
|
JOptionPane.INFORMATION_MESSAGE
|
||||||
);
|
);
|
||||||
|
callback.Continue(true, "");
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
} else if (dialog_type == JSDialogType.JSDIALOGTYPE_CONFIRM) { // 处理 confirm()
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
int result = JOptionPane.showConfirmDialog(
|
||||||
|
BrowserWindow.this,
|
||||||
|
message_text,
|
||||||
|
"确认",
|
||||||
|
JOptionPane.YES_NO_OPTION,
|
||||||
|
JOptionPane.QUESTION_MESSAGE
|
||||||
|
);
|
||||||
|
|
||||||
|
// 如果用户点击 YES (确定),则传回 true
|
||||||
|
boolean confirmed = (result == JOptionPane.YES_OPTION);
|
||||||
|
callback.Continue(confirmed, "");
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
} else if (dialog_type == JSDialogType.JSDIALOGTYPE_PROMPT) {
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
Object result = JOptionPane.showInputDialog(
|
||||||
|
BrowserWindow.this,
|
||||||
|
message_text,
|
||||||
|
"输入",
|
||||||
|
JOptionPane.QUESTION_MESSAGE,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
default_prompt_text
|
||||||
|
);
|
||||||
|
String input = (result != null) ? result.toString() : null;
|
||||||
|
if (input != null) {
|
||||||
|
callback.Continue(true, input);
|
||||||
|
} else {
|
||||||
|
callback.Continue(false, "");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
callback.Continue(true, "");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// 默认行为:如果不是以上三种类型,交给 CEF 默认处理
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// 3. 拦截所有新窗口(关键修复点!)
|
// 3. 拦截所有新窗口(关键修复点!)
|
||||||
//client.addLifeSpanHandler(new CefLifeSpanHandlerAdapter() {
|
client.addLifeSpanHandler(new CefLifeSpanHandlerAdapter() {
|
||||||
// @Override
|
@Override
|
||||||
// public boolean onBeforePopup(CefBrowser browser,
|
public boolean onBeforePopup(CefBrowser browser, CefFrame frame,
|
||||||
// CefFrame frame, String target_url, String target_frame_name) {
|
String targetUrl, String targetFrameName) {
|
||||||
// return true; // 返回true表示拦截弹窗
|
boolean isDataProtocol = targetUrl != null && targetUrl.toLowerCase().startsWith("data:");
|
||||||
// }
|
if (builder.openLinksInExternalBrowser && !isDataProtocol) {
|
||||||
//});
|
try {
|
||||||
|
Desktop.getDesktop().browse(new URI(targetUrl));
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("外部浏览器打开失败: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return true; // 拦截默认行为
|
||||||
|
}
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
String popupWindowId = windowId + "_popup_" + System.currentTimeMillis();
|
||||||
|
WindowRegistry.getInstance().createNewWindow(popupWindowId, popupBuilder -> {
|
||||||
|
popupBuilder.title(getTitle()) // 继承标题
|
||||||
|
.size(getWidth(), getHeight()) // 继承大小
|
||||||
|
.htmlUrl(targetUrl) // 传入 data: URL
|
||||||
|
.icon(builder.icon) // 继承图标
|
||||||
|
.openLinksInBrowser(true); // 新窗口内链接强制内部打开
|
||||||
|
if (builder.operationHandler != null) {
|
||||||
|
popupBuilder.operationHandler(builder.operationHandler);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return true; // 拦截 CEF 默认弹窗,由 Java Swing 窗口接管
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
Thread.currentThread().setName("BrowserRenderThread");
|
Thread.currentThread().setName("BrowserRenderThread");
|
||||||
@@ -582,8 +639,10 @@ public class BrowserWindow extends JFrame {
|
|||||||
public void updateTheme() {
|
public void updateTheme() {
|
||||||
// 1. 获取Java字体信息
|
// 1. 获取Java字体信息
|
||||||
String fontInfo = getSystemFontsInfo();
|
String fontInfo = getSystemFontsInfo();
|
||||||
boolean isDarkTheme = AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode();
|
if (AxisInnovatorsBox.getMain() != null) {
|
||||||
injectFontInfoToPage(browser, fontInfo, isDarkTheme);
|
boolean isDarkTheme = AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode();
|
||||||
|
injectFontInfoToPage(browser, fontInfo, isDarkTheme);
|
||||||
|
}
|
||||||
|
|
||||||
// 2. 注入主题信息
|
// 2. 注入主题信息
|
||||||
//injectThemeInfoToPage(browser, isDarkTheme);
|
//injectThemeInfoToPage(browser, isDarkTheme);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.axis.innovators.box.browser;
|
|||||||
import com.axis.innovators.box.AxisInnovatorsBox;
|
import com.axis.innovators.box.AxisInnovatorsBox;
|
||||||
import com.axis.innovators.box.browser.util.CodeExecutor;
|
import com.axis.innovators.box.browser.util.CodeExecutor;
|
||||||
import com.axis.innovators.box.browser.util.DatabaseConnectionManager;
|
import com.axis.innovators.box.browser.util.DatabaseConnectionManager;
|
||||||
|
import com.axis.innovators.box.browser.util.TerminalManager;
|
||||||
import com.axis.innovators.box.tools.FolderCreator;
|
import com.axis.innovators.box.tools.FolderCreator;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
@@ -36,19 +37,254 @@ import java.util.concurrent.atomic.AtomicReference;
|
|||||||
|
|
||||||
public class MainApplication {
|
public class MainApplication {
|
||||||
private static final ExecutorService executor = Executors.newCachedThreadPool();
|
private static final ExecutorService executor = Executors.newCachedThreadPool();
|
||||||
|
private static Connection dbConnection = null;
|
||||||
private static long modelHandle;
|
private static long modelHandle;
|
||||||
private static long ctxHandle;
|
private static long ctxHandle;
|
||||||
private static boolean isSystem = true;
|
private static boolean isSystem = true;
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
AtomicReference<BrowserWindow> window = new AtomicReference<>();
|
TerminalManager.popupRealLinuxWindow();
|
||||||
WindowRegistry.getInstance().createNewWindow("main", builder ->
|
}
|
||||||
window.set(builder.title("Axis Innovators Box AI 工具箱")
|
|
||||||
.size(1280, 720)
|
public static void popupSimulatingLinuxWindow(JFrame parent){
|
||||||
.htmlUrl("https://www.bilibili.com/")
|
|
||||||
.openLinksInBrowser(true)
|
}
|
||||||
.operationHandler(createOperationHandler())
|
/**
|
||||||
.build())
|
* 初始化数据库连接
|
||||||
);
|
*/
|
||||||
|
private static void initDatabase() {
|
||||||
|
try {
|
||||||
|
if (dbConnection != null && !dbConnection.isClosed()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载 H2 驱动
|
||||||
|
Class.forName("org.h2.Driver");
|
||||||
|
|
||||||
|
// 核心配置:
|
||||||
|
// 1. MODE=MySQL : 开启 MySQL 语法兼容 (支持 AUTO_INCREMENT, ENUM 等)
|
||||||
|
// 2. IGNORE_UNKNOWN_SETTINGS=TRUE : 忽略 ENGINE=InnoDB, CHARSET=utf8 等 H2 不懂的配置,不报错
|
||||||
|
// 3. CASE_INSENSITIVE_IDENTIFIERS=TRUE : 忽略大小写
|
||||||
|
// 4. ~ : 代表用户主目录,数据库文件名为 sql_learning.mv.db
|
||||||
|
String url = "jdbc:h2:./sql_learning;" +
|
||||||
|
"MODE=MySQL;" +
|
||||||
|
"IGNORE_UNKNOWN_SETTINGS=TRUE;" +
|
||||||
|
"CASE_INSENSITIVE_IDENTIFIERS=TRUE;" +
|
||||||
|
"AUTO_SERVER=TRUE"; // 允许自动混合模式
|
||||||
|
|
||||||
|
dbConnection = DriverManager.getConnection(url, "sa", "");
|
||||||
|
|
||||||
|
System.out.println("Connected to H2 Database in MySQL Mode");
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 真实的 SQL 执行逻辑
|
||||||
|
* 替换了之前的 executeMockSQL
|
||||||
|
*/
|
||||||
|
private static JSONObject executeRealSQL(String sql) {
|
||||||
|
JSONObject response = new JSONObject();
|
||||||
|
String originSql = sql.trim();
|
||||||
|
// 移除末尾分号,防止 JDBC 报错
|
||||||
|
if (originSql.endsWith(";")) {
|
||||||
|
originSql = originSql.substring(0, originSql.length() - 1);
|
||||||
|
}
|
||||||
|
String upperSql = originSql.toUpperCase();
|
||||||
|
|
||||||
|
// 1. 拦截 HELP (前端功能)
|
||||||
|
if (upperSql.equals("HELP")) {
|
||||||
|
response.put("status", "success");
|
||||||
|
response.put("type", "text");
|
||||||
|
response.put("output", "Available commands:\n" +
|
||||||
|
" Any valid MySQL SQL syntax\n" +
|
||||||
|
" CLS / CLEAR : Clear screen\n" +
|
||||||
|
" EXIT : Close connection");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 语义映射:将 MySQL 的【库】概念映射为 H2 的【模式(Schema)】
|
||||||
|
// H2 是单数据库文件模式,为了模拟多库,我们用 Schema 代替。
|
||||||
|
// CREATE DATABASE xxx -> CREATE SCHEMA xxx
|
||||||
|
if (upperSql.startsWith("CREATE DATABASE ")) {
|
||||||
|
originSql = "CREATE SCHEMA " + originSql.substring(16);
|
||||||
|
} else if (upperSql.startsWith("USE ")) {
|
||||||
|
// USE xxx -> SET SCHEMA xxx
|
||||||
|
originSql = "SET SCHEMA " + originSql.substring(4);
|
||||||
|
} else if (upperSql.startsWith("DROP DATABASE ")) {
|
||||||
|
originSql = "DROP SCHEMA " + originSql.substring(14);
|
||||||
|
} else if (upperSql.equals("SHOW DATABASES")) {
|
||||||
|
originSql = "SHOW SCHEMAS";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 确保连接
|
||||||
|
if (dbConnection == null) {
|
||||||
|
initDatabase();
|
||||||
|
if (dbConnection == null) {
|
||||||
|
response.put("status", "error");
|
||||||
|
response.put("output", "Error: Could not connect to database.");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
Statement stmt = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
stmt = dbConnection.createStatement();
|
||||||
|
|
||||||
|
// 3. 直接执行!
|
||||||
|
// 此时 H2 的 MySQL 模式会原生处理 AUTO_INCREMENT, ENUM, ENGINE=InnoDB (被忽略)
|
||||||
|
boolean isResultSet = stmt.execute(originSql);
|
||||||
|
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
double duration = (endTime - startTime) / 1000.0;
|
||||||
|
|
||||||
|
if (isResultSet) {
|
||||||
|
// --- 结果集处理 ---
|
||||||
|
response.put("status", "success");
|
||||||
|
response.put("type", "table");
|
||||||
|
rs = stmt.getResultSet();
|
||||||
|
ResultSetMetaData metaData = rs.getMetaData();
|
||||||
|
int columnCount = metaData.getColumnCount();
|
||||||
|
|
||||||
|
JSONArray headers = new JSONArray();
|
||||||
|
for (int i = 1; i <= columnCount; i++) headers.put(metaData.getColumnLabel(i));
|
||||||
|
response.put("headers", headers);
|
||||||
|
|
||||||
|
JSONArray rows = new JSONArray();
|
||||||
|
int rowCount = 0;
|
||||||
|
while (rs.next()) {
|
||||||
|
JSONArray row = new JSONArray();
|
||||||
|
for (int i = 1; i <= columnCount; i++) {
|
||||||
|
Object val = rs.getObject(i);
|
||||||
|
row.put(val == null ? "NULL" : val.toString());
|
||||||
|
}
|
||||||
|
rows.put(row);
|
||||||
|
rowCount++;
|
||||||
|
}
|
||||||
|
response.put("rows", rows);
|
||||||
|
response.put("info", String.format("%d rows in set (%.2f sec)", rowCount, duration));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// --- 更新/DDL 处理 ---
|
||||||
|
int updateCount = stmt.getUpdateCount();
|
||||||
|
response.put("status", "success");
|
||||||
|
response.put("type", "text");
|
||||||
|
response.put("output", String.format("Query OK, %d row(s) affected (%.2f sec)", updateCount, duration));
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
response.put("status", "error");
|
||||||
|
// H2 的报错信息通常很清晰
|
||||||
|
response.put("output", "ERROR " + e.getErrorCode() + ": " + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
try { if (rs != null) rs.close(); } catch (Exception e) {}
|
||||||
|
try { if (stmt != null) stmt.close(); } catch (Exception e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取数据库的所有表和列信息,用于前端自动补全
|
||||||
|
*/
|
||||||
|
private static JSONObject getDatabaseSchema() {
|
||||||
|
JSONObject schema = new JSONObject();
|
||||||
|
JSONArray tables = new JSONArray();
|
||||||
|
JSONObject columnsMap = new JSONObject(); // Key: tableName, Value: ["col1", "col2"]
|
||||||
|
|
||||||
|
// 确保连接存在
|
||||||
|
if (dbConnection == null) initDatabase();
|
||||||
|
|
||||||
|
try {
|
||||||
|
DatabaseMetaData meta = dbConnection.getMetaData();
|
||||||
|
// 获取所有表
|
||||||
|
ResultSet rs = meta.getTables(null, null, "%", new String[]{"TABLE"});
|
||||||
|
while (rs.next()) {
|
||||||
|
String tableName = rs.getString("TABLE_NAME");
|
||||||
|
tables.put(tableName);
|
||||||
|
|
||||||
|
// 获取该表的所有列
|
||||||
|
JSONArray cols = new JSONArray();
|
||||||
|
ResultSet rsCols = meta.getColumns(null, null, tableName, "%");
|
||||||
|
while (rsCols.next()) {
|
||||||
|
cols.put(rsCols.getString("COLUMN_NAME"));
|
||||||
|
}
|
||||||
|
columnsMap.put(tableName, cols);
|
||||||
|
rsCols.close();
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
|
||||||
|
schema.put("status", "success");
|
||||||
|
schema.put("tables", tables);
|
||||||
|
schema.put("columns", columnsMap);
|
||||||
|
|
||||||
|
} catch (SQLException e) {
|
||||||
|
schema.put("status", "error");
|
||||||
|
schema.put("message", e.getMessage());
|
||||||
|
}
|
||||||
|
return schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 弹出模拟 SQL 命令行窗口
|
||||||
|
* @param parent 父窗口
|
||||||
|
*/
|
||||||
|
public static void popupSimulatingSQLWindow(JFrame parent) {
|
||||||
|
AtomicReference<BrowserWindowJDialog> window = new AtomicReference<>();
|
||||||
|
initDatabase();
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
WindowRegistry.getInstance().createNewChildWindow("main", builder ->
|
||||||
|
window.set(builder.title("SQL Command Line Client")
|
||||||
|
.parentFrame(parent)
|
||||||
|
.icon(new ImageIcon(Objects.requireNonNull(MainApplication.class.getClassLoader().getResource("icons/logo.png"))).getImage())
|
||||||
|
.size(900, 600)
|
||||||
|
.htmlPath(FolderCreator.getJavaScriptFolder() + "\\" + "SQLTerminal.html")
|
||||||
|
.operationHandler(createOperationHandler())
|
||||||
|
.build())
|
||||||
|
);
|
||||||
|
|
||||||
|
CefMessageRouter msgRouter = window.get().getMsgRouter();
|
||||||
|
if (msgRouter != null) {
|
||||||
|
msgRouter.addHandler(new CefMessageRouterHandlerAdapter() {
|
||||||
|
// 在 popupSimulatingSQLWindow 方法的 msgRouter.addHandler 内部:
|
||||||
|
|
||||||
|
public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId,
|
||||||
|
String request, boolean persistent, CefQueryCallback callback) {
|
||||||
|
try {
|
||||||
|
JSONObject requestJson = new JSONObject(request);
|
||||||
|
String type = requestJson.optString("type");
|
||||||
|
|
||||||
|
if ("initSchema".equals(type)) {
|
||||||
|
JSONObject schema = getDatabaseSchema();
|
||||||
|
callback.success(schema.toString());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("executeCommand".equals(type)) {
|
||||||
|
String cmd = requestJson.optString("command");
|
||||||
|
JSONObject response = executeRealSQL(cmd);
|
||||||
|
callback.success(response.toString());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
JSONObject error = new JSONObject();
|
||||||
|
error.put("status", "error");
|
||||||
|
error.put("output", "Error: " + e.getMessage());
|
||||||
|
callback.failure(500, error.toString());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onQueryCanceled(CefBrowser browser, CefFrame frame, long queryId) { }
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -349,7 +585,7 @@ public class MainApplication {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static WindowOperationHandler createOperationHandler() {
|
public static WindowOperationHandler createOperationHandler() {
|
||||||
return new WindowOperationHandler.Builder()
|
return new WindowOperationHandler.Builder()
|
||||||
.withDefaultOperations()
|
.withDefaultOperations()
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -0,0 +1,226 @@
|
|||||||
|
package com.axis.innovators.box.browser.util;
|
||||||
|
|
||||||
|
import com.axis.innovators.box.browser.BrowserWindow;
|
||||||
|
import com.axis.innovators.box.browser.BrowserWindowJDialog;
|
||||||
|
import com.axis.innovators.box.browser.WindowRegistry;
|
||||||
|
import com.axis.innovators.box.tools.FolderCreator;
|
||||||
|
import com.pty4j.PtyProcess;
|
||||||
|
import com.pty4j.PtyProcessBuilder;
|
||||||
|
import com.pty4j.WinSize;
|
||||||
|
import org.cef.browser.CefBrowser;
|
||||||
|
import org.cef.browser.CefFrame;
|
||||||
|
import org.cef.browser.CefMessageRouter;
|
||||||
|
import org.cef.callback.CefQueryCallback;
|
||||||
|
import org.cef.handler.CefMessageRouterHandlerAdapter;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import static com.axis.innovators.box.browser.MainApplication.createOperationHandler;
|
||||||
|
|
||||||
|
public class TerminalManager {
|
||||||
|
|
||||||
|
// 保存 PTY 进程引用
|
||||||
|
private static PtyProcess ptyProcess;
|
||||||
|
private static OutputStream ptyInput;
|
||||||
|
private static Thread outputReaderThread;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动真实的终端窗口
|
||||||
|
*/
|
||||||
|
public static void popupRealLinuxWindow() {
|
||||||
|
AtomicReference<BrowserWindow> window = new AtomicReference<>();
|
||||||
|
|
||||||
|
SwingUtilities.invokeLater(() -> {
|
||||||
|
// 1. 创建窗口
|
||||||
|
WindowRegistry.getInstance().createNewWindow("real_terminal", builder ->
|
||||||
|
window.set(builder.title("Terminal Linux")
|
||||||
|
.size(900, 600)
|
||||||
|
.htmlPath(FolderCreator.getJavaScriptFolder() + "\\" + "LinuxTerminal.html")
|
||||||
|
.operationHandler(createOperationHandler())
|
||||||
|
.build())
|
||||||
|
);
|
||||||
|
|
||||||
|
// 2. 初始化 PTY 进程
|
||||||
|
startPtyProcess(window.get().getBrowser());
|
||||||
|
|
||||||
|
// 3. 注册 JCEF 消息处理器
|
||||||
|
CefMessageRouter msgRouter = window.get().getMsgRouter();
|
||||||
|
if (msgRouter != null) {
|
||||||
|
msgRouter.addHandler(new CefMessageRouterHandlerAdapter() {
|
||||||
|
@Override
|
||||||
|
public boolean onQuery(CefBrowser browser, CefFrame frame, long queryId,
|
||||||
|
String request, boolean persistent, CefQueryCallback callback) {
|
||||||
|
try {
|
||||||
|
JSONObject json = new JSONObject(request);
|
||||||
|
if ("terminalInput".equals(json.optString("type"))) {
|
||||||
|
// 接收前端的按键数据
|
||||||
|
String data = json.getString("data");
|
||||||
|
if (ptyInput != null) {
|
||||||
|
// 写入到 Shell 进程的标准输入
|
||||||
|
ptyInput.write(data.getBytes(StandardCharsets.UTF_8));
|
||||||
|
ptyInput.flush();
|
||||||
|
}
|
||||||
|
callback.success("");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onQueryCanceled(CefBrowser browser, CefFrame frame, long queryId) {}
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 窗口关闭时杀死进程
|
||||||
|
window.get().addWindowListener(new java.awt.event.WindowAdapter() {
|
||||||
|
@Override
|
||||||
|
public void windowClosed(java.awt.event.WindowEvent windowEvent) {
|
||||||
|
stopPtyProcess();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void startPtyProcess(CefBrowser browser) {
|
||||||
|
try {
|
||||||
|
// 1. 确定要运行的 Shell 命令
|
||||||
|
String[] cmd = determineShellCommand();
|
||||||
|
|
||||||
|
// 2. 设置环境变量
|
||||||
|
Map<String, String> envs = new HashMap<>(System.getenv());
|
||||||
|
envs.put("TERM", "xterm-256color"); // 告诉 Shell 我们支持颜色
|
||||||
|
|
||||||
|
// 3. 启动 PTY 进程
|
||||||
|
ptyProcess = new PtyProcessBuilder(cmd)
|
||||||
|
.setEnvironment(envs)
|
||||||
|
.setRedirectErrorStream(true)
|
||||||
|
.start();
|
||||||
|
|
||||||
|
// 设置初始窗口大小 (列, 行)
|
||||||
|
ptyProcess.setWinSize(new WinSize(80, 24));
|
||||||
|
|
||||||
|
ptyInput = ptyProcess.getOutputStream();
|
||||||
|
InputStream ptyOutput = ptyProcess.getInputStream();
|
||||||
|
|
||||||
|
// 4. 开启后台线程,不断读取 Shell 的输出,并发给前端
|
||||||
|
outputReaderThread = new Thread(() -> {
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int read;
|
||||||
|
try {
|
||||||
|
while ((read = ptyOutput.read(buffer)) != -1) {
|
||||||
|
// 读取原生字节流
|
||||||
|
byte[] chunk = new byte[read];
|
||||||
|
System.arraycopy(buffer, 0, chunk, 0, read);
|
||||||
|
|
||||||
|
// 转为 Base64 避免特殊字符搞崩 JS
|
||||||
|
String base64Data = Base64.getEncoder().encodeToString(chunk);
|
||||||
|
|
||||||
|
// 调用前端 JS: writeToTerminal('Base64Str')
|
||||||
|
String js = "writeToTerminal('" + base64Data + "');";
|
||||||
|
|
||||||
|
SwingUtilities.invokeLater(() -> browser.executeJavaScript(js, "", 0));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 进程结束或流关闭
|
||||||
|
}
|
||||||
|
});
|
||||||
|
outputReaderThread.setDaemon(true);
|
||||||
|
outputReaderThread.start();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void stopPtyProcess() {
|
||||||
|
if (ptyProcess != null && ptyProcess.isAlive()) {
|
||||||
|
ptyProcess.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查WSL是否已安装
|
||||||
|
* @return 如果wsl.exe存在且能执行,则返回true
|
||||||
|
*/
|
||||||
|
private static boolean isWslInstalled() {
|
||||||
|
try {
|
||||||
|
Process process = new ProcessBuilder("wsl", "--status").start();
|
||||||
|
int exitCode = process.waitFor();
|
||||||
|
return true;
|
||||||
|
} catch (IOException e) {
|
||||||
|
return false;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 尝试以管理员权限启动一个进程来安装WSL
|
||||||
|
*/
|
||||||
|
private static void tryInstallWsl() {
|
||||||
|
String message = "您似乎没有安装WSL (Windows Subsystem for Linux)。\n" +
|
||||||
|
"WSL提供了更完整的Linux体验,强烈建议您安装。\n\n" +
|
||||||
|
"是否现在尝试自动安装?\n" +
|
||||||
|
"(这将会弹出一个UAC窗口请求管理员权限)";
|
||||||
|
|
||||||
|
int choice = JOptionPane.showConfirmDialog(null, message, "安装WSL",
|
||||||
|
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
|
||||||
|
if (choice == JOptionPane.YES_OPTION) {
|
||||||
|
try {
|
||||||
|
// 在Windows上,使用 "runas" 谓词(verb)可以通过ShellExecute来请求提权。
|
||||||
|
// Java没有直接访问ShellExecute的方法,但我们可以通过PowerShell的Start-Process命令来间接实现。
|
||||||
|
// Start-Process -Verb runAs 可以触发UAC弹窗。
|
||||||
|
String command = "powershell.exe -Command \"Start-Process wsl -ArgumentList '--install' -Verb runAs\"";
|
||||||
|
Runtime.getRuntime().exec(command);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
JOptionPane.showMessageDialog(null,
|
||||||
|
"启动安装程序失败,请尝试手动以管理员身份运行 'wsl --install'。",
|
||||||
|
"错误", JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据操作系统决定启动什么 Shell
|
||||||
|
*/
|
||||||
|
private static String[] determineShellCommand() {
|
||||||
|
String os = System.getProperty("os.name").toLowerCase();
|
||||||
|
|
||||||
|
if (os.contains("win")) {
|
||||||
|
// 1. 检查WSL是否安装
|
||||||
|
if (isWslInstalled()) {
|
||||||
|
System.out.println("检测到WSL,将使用WSL。");
|
||||||
|
return new String[]{"wsl.exe"};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 如果没有安装,提示用户安装
|
||||||
|
System.out.println("未检测到WSL,提示用户安装。");
|
||||||
|
// 在Swing线程中弹出对话框
|
||||||
|
SwingUtilities.invokeLater(TerminalManager::tryInstallWsl);
|
||||||
|
|
||||||
|
// 3. 无论用户是否选择安装,本次都先回退到PowerShell,避免阻塞程序
|
||||||
|
// 用户安装完毕并重启应用后,下次启动就会自动使用WSL了。
|
||||||
|
System.out.println("本次将回退到PowerShell。");
|
||||||
|
return new String[]{"powershell.exe"};
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Mac / Linux
|
||||||
|
return new String[]{"/bin/bash", "-i"};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,7 @@ package com.axis.innovators.box.register;
|
|||||||
|
|
||||||
import com.axis.innovators.box.AxisInnovatorsBox;
|
import com.axis.innovators.box.AxisInnovatorsBox;
|
||||||
import com.axis.innovators.box.tools.StateManager;
|
import com.axis.innovators.box.tools.StateManager;
|
||||||
|
import com.axis.innovators.box.util.AdvancedJFileChooser;
|
||||||
import com.axis.innovators.box.window.LoadIcon;
|
import com.axis.innovators.box.window.LoadIcon;
|
||||||
import com.axis.innovators.box.window.MainWindow;
|
import com.axis.innovators.box.window.MainWindow;
|
||||||
import com.axis.innovators.box.window.WindowsJDialog;
|
import com.axis.innovators.box.window.WindowsJDialog;
|
||||||
@@ -574,7 +575,7 @@ public class RegistrationSettingsItem extends WindowsJDialog {
|
|||||||
JButton selectBgBtn = new JButton("选择图片");
|
JButton selectBgBtn = new JButton("选择图片");
|
||||||
selectBgBtn.setPreferredSize(new Dimension(100, 28));
|
selectBgBtn.setPreferredSize(new Dimension(100, 28));
|
||||||
selectBgBtn.addActionListener(e -> {
|
selectBgBtn.addActionListener(e -> {
|
||||||
JFileChooser fileChooser = new JFileChooser();
|
AdvancedJFileChooser fileChooser = new AdvancedJFileChooser();
|
||||||
fileChooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter(
|
fileChooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter(
|
||||||
"图片文件 (*.jpg, *.jpeg, *.png, *.gif, *.bmp)", "jpg", "jpeg", "png", "gif", "bmp"));
|
"图片文件 (*.jpg, *.jpeg, *.png, *.gif, *.bmp)", "jpg", "jpeg", "png", "gif", "bmp"));
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ package com.axis.innovators.box.register;
|
|||||||
|
|
||||||
import com.axis.innovators.box.AxisInnovatorsBox;
|
import com.axis.innovators.box.AxisInnovatorsBox;
|
||||||
import com.axis.innovators.box.browser.MainApplication;
|
import com.axis.innovators.box.browser.MainApplication;
|
||||||
|
import com.axis.innovators.box.browser.util.TerminalManager;
|
||||||
|
import com.axis.innovators.box.util.build.BuildInformation;
|
||||||
|
import com.axis.innovators.box.util.build.BuildSystem;
|
||||||
import com.axis.innovators.box.window.FridaWindow;
|
import com.axis.innovators.box.window.FridaWindow;
|
||||||
import com.axis.innovators.box.window.JarApiProfilingWindow;
|
import com.axis.innovators.box.window.JarApiProfilingWindow;
|
||||||
import com.axis.innovators.box.window.MainWindow;
|
import com.axis.innovators.box.window.MainWindow;
|
||||||
@@ -33,129 +36,172 @@ public class RegistrationTool {
|
|||||||
public RegistrationTool(AxisInnovatorsBox main) {
|
public RegistrationTool(AxisInnovatorsBox main) {
|
||||||
this.main = main;
|
this.main = main;
|
||||||
int id = 0;
|
int id = 0;
|
||||||
MainWindow.ToolCategory debugCategory = new MainWindow.ToolCategory("调试工具",
|
// 判断系统是否支持
|
||||||
"debug/debug.png",
|
if (BuildInformation.isMatchSystem(BuildSystem.WINDOWS)
|
||||||
"用于调试指定Windows工具的一个分类");
|
|| BuildInformation.isMatchSystem(BuildSystem.UNKNOWN)) {
|
||||||
|
MainWindow.ToolCategory debugCategory = new MainWindow.ToolCategory("调试工具",
|
||||||
|
"debug/debug.png",
|
||||||
|
"用于调试指定Windows工具的一个分类");
|
||||||
|
|
||||||
debugCategory.addTool(new MainWindow.ToolItem("Frida注入工具", "debug/frida/frida_main.png",
|
debugCategory.addTool(new MainWindow.ToolItem("Frida注入工具", "debug/frida/frida_main.png",
|
||||||
"使用frida注入目标进程的脚本程序 " +
|
"使用frida注入目标进程的脚本程序 " +
|
||||||
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
FridaWindow fridaWindow = new FridaWindow(owner);
|
FridaWindow fridaWindow = new FridaWindow(owner);
|
||||||
main.popupWindow(fridaWindow);
|
main.popupWindow(fridaWindow);
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
MainWindow.ToolCategory programmingToolsCategory = new MainWindow.ToolCategory("编程工具",
|
|
||||||
"programming/programming.png",
|
|
||||||
"编程工具");
|
|
||||||
programmingToolsCategory.addTool(new MainWindow.ToolItem("JarApi查看器", "programming/JarApiViewer/JarApi_Viewer.png",
|
|
||||||
"查看Jar内的方法以及其注解" +
|
|
||||||
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
|
||||||
JarApiProfilingWindow jarApiProfilingWindow = new JarApiProfilingWindow(owner);
|
|
||||||
main.popupWindow(jarApiProfilingWindow);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
programmingToolsCategory.addTool(new MainWindow.ToolItem("C语言编辑器", "programming/LanguageEditor/file-editing.png",
|
|
||||||
"C语言编译器,智能化的idea" +
|
|
||||||
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
// Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
|
||||||
MainApplication.popupCCodeEditorWindow();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
programmingToolsCategory.addTool(new MainWindow.ToolItem("多语言在线执行(当遇到无限循环时会抛出错误)", "programming/LanguageEditor/file-editing.png",
|
|
||||||
"多语言在线执行,当遇到无限循环时会抛出错误" +
|
|
||||||
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
// Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
|
||||||
MainApplication.popupCodeEditorWindow();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
programmingToolsCategory.addTool(new MainWindow.ToolItem("数据库管理工具", "programming/programming_dark.png",
|
|
||||||
"用于管理数据库" +
|
|
||||||
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
// Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
|
||||||
MainApplication.popupDataBaseWindow();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
MainWindow.ToolCategory aICategory = new MainWindow.ToolCategory("AI工具",
|
|
||||||
"ai/ai.png",
|
|
||||||
"人工智能/大语言模型");
|
|
||||||
|
|
||||||
aICategory.addTool(new MainWindow.ToolItem("本地AI执行工具", "ai/local/local_main.png",
|
|
||||||
"在本机对开源大语言模型进行推理" +
|
|
||||||
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
LM.loadLibrary(LM.CUDA);
|
|
||||||
} catch (Exception ex) {
|
|
||||||
logger.error("无法加载AI推理库", ex);
|
|
||||||
JOptionPane.showMessageDialog(null, "无法加载AI推理库",
|
|
||||||
"无法加载AI推理库", JOptionPane.ERROR_MESSAGE);
|
|
||||||
}
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
MainWindow.ToolCategory programmingToolsCategory = new MainWindow.ToolCategory("编程工具",
|
||||||
// 这是被抛弃的界面,在后面的版本可能会删除
|
"programming/programming.png",
|
||||||
//LocalWindow dialog = new LocalWindow(owner);
|
"编程工具");
|
||||||
//main.popupWindow(dialog);
|
programmingToolsCategory.addTool(new MainWindow.ToolItem("JarApi查看器", "programming/JarApiViewer/JarApi_Viewer.png",
|
||||||
MainApplication.popupAIWindow((JFrame)owner);
|
"查看Jar内的方法以及其注解" +
|
||||||
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
JarApiProfilingWindow jarApiProfilingWindow = new JarApiProfilingWindow(owner);
|
||||||
|
main.popupWindow(jarApiProfilingWindow);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
programmingToolsCategory.addTool(new MainWindow.ToolItem("C语言编辑器", "programming/LanguageEditor/file-editing.png",
|
||||||
|
"C语言编译器,智能化的idea" +
|
||||||
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
// Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
MainApplication.popupCCodeEditorWindow();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
programmingToolsCategory.addTool(new MainWindow.ToolItem("多语言在线执行(当遇到无限循环时会抛出错误)", "programming/LanguageEditor/file-editing.png",
|
||||||
|
"多语言在线执行,当遇到无限循环时会抛出错误" +
|
||||||
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
// Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
MainApplication.popupCodeEditorWindow();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
programmingToolsCategory.addTool(new MainWindow.ToolItem("数据库管理工具", "programming/programming_dark.png",
|
||||||
|
"用于管理数据库" +
|
||||||
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
// Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
MainApplication.popupDataBaseWindow();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
programmingToolsCategory.addTool(new MainWindow.ToolItem("Linux终端工具", "programming/linux.png",
|
||||||
|
"用于启动一个Linux终端" +
|
||||||
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
TerminalManager.popupRealLinuxWindow();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
programmingToolsCategory.addTool(new MainWindow.ToolItem("MySql控制台", "programming/mysql.png",
|
||||||
|
"用于启动一个MySql控制台" +
|
||||||
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
MainApplication.popupSimulatingSQLWindow((JFrame) owner);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
MainWindow.ToolCategory aICategory = new MainWindow.ToolCategory("AI工具",
|
||||||
|
"ai/ai.png",
|
||||||
|
"人工智能/大语言模型");
|
||||||
|
|
||||||
|
aICategory.addTool(new MainWindow.ToolItem("本地AI执行工具", "ai/local/local_main.png",
|
||||||
|
"在本机对开源大语言模型进行推理" +
|
||||||
|
"\n作者:tzdwindows 7", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
LM.loadLibrary(LM.CUDA);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.error("无法加载AI推理库", ex);
|
||||||
|
JOptionPane.showMessageDialog(null, "无法加载AI推理库",
|
||||||
|
"无法加载AI推理库", JOptionPane.ERROR_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
// 这是被抛弃的界面,在后面的版本可能会删除
|
||||||
|
//LocalWindow dialog = new LocalWindow(owner);
|
||||||
|
//main.popupWindow(dialog);
|
||||||
|
MainApplication.popupAIWindow((JFrame) owner);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
MainWindow.ToolCategory hahahah = new MainWindow.ToolCategory(
|
||||||
|
"good工具",
|
||||||
|
"haha/ok.png",
|
||||||
|
"good "
|
||||||
|
);
|
||||||
|
hahahah.addTool(new MainWindow.ToolItem("123", "ai/local/local_main.png",
|
||||||
|
"456789" +
|
||||||
|
"\n作者:Vinfya", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
// 在这里写
|
||||||
|
// 这个就是弹窗Ok
|
||||||
|
JOptionPane.showMessageDialog(null, "你好...");
|
||||||
|
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
MainWindow.ToolCategory systemCategory = new MainWindow.ToolCategory("系统工具",
|
||||||
|
"windows/windows.png",
|
||||||
|
"系统工具");
|
||||||
|
systemCategory.addTool(new MainWindow.ToolItem("任务栏主题设置", "windows/windowsOptimization/windowsOptimization.png",
|
||||||
|
"可以设置Windows任务栏的颜色等各种信息", ++id, new AbstractAction() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
||||||
|
TaskbarAppearanceWindow taskbarAppearanceWindow = new TaskbarAppearanceWindow(owner);
|
||||||
|
main.popupWindow(taskbarAppearanceWindow);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
addSystemToolCategory(debugCategory, "debugTools");
|
||||||
|
addSystemToolCategory(aICategory, "fridaTools");
|
||||||
|
addSystemToolCategory(programmingToolsCategory, "programmingTools");
|
||||||
|
addSystemToolCategory(systemCategory, "systemTools");
|
||||||
|
addSystemToolCategory(hahahah, "mc");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册ToolCategory
|
||||||
|
* @param toolCategory ToolCategory
|
||||||
|
*/
|
||||||
|
private boolean addSystemToolCategory(MainWindow.ToolCategory toolCategory,
|
||||||
|
String registeredName) {
|
||||||
|
registeredName = "system:" + registeredName;
|
||||||
|
if (!main.isWindow()) {
|
||||||
|
if (registeredNameList.contains(registeredName)) {
|
||||||
|
throw new RegistrationError(registeredName + " duplicate registered names");
|
||||||
}
|
}
|
||||||
}));
|
uuidList.add(toolCategory.getId());
|
||||||
|
registeredNameList.add(registeredName);
|
||||||
MainWindow.ToolCategory hahahah = new MainWindow.ToolCategory(
|
toolCategories.add(toolCategory);
|
||||||
"good工具",
|
return true;
|
||||||
"haha/ok.png",
|
} else {
|
||||||
"good "
|
logger.warn("Wrong time to add tools");
|
||||||
);
|
return false;
|
||||||
hahahah.addTool(new MainWindow.ToolItem("123", "ai/local/local_main.png",
|
}
|
||||||
"456789" +
|
|
||||||
"\n作者:Vinfya", ++id, new AbstractAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
// 在这里写
|
|
||||||
// 这个就是弹窗Ok
|
|
||||||
JOptionPane.showMessageDialog(null, "你好...");
|
|
||||||
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MainWindow.ToolCategory systemCategory = new MainWindow.ToolCategory("系统工具",
|
|
||||||
"windows/windows.png",
|
|
||||||
"系统工具");
|
|
||||||
systemCategory.addTool(new MainWindow.ToolItem("任务栏主题设置", "windows/windowsOptimization/windowsOptimization.png",
|
|
||||||
"可以设置Windows任务栏的颜色等各种信息",++id, new AbstractAction() {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(ActionEvent e) {
|
|
||||||
Window owner = SwingUtilities.windowForComponent((Component) e.getSource());
|
|
||||||
TaskbarAppearanceWindow taskbarAppearanceWindow = new TaskbarAppearanceWindow(owner);
|
|
||||||
main.popupWindow(taskbarAppearanceWindow);
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
addToolCategory(debugCategory, "system:debugTools");
|
|
||||||
addToolCategory(aICategory,"system:fridaTools");
|
|
||||||
addToolCategory(programmingToolsCategory, "system:programmingTools");
|
|
||||||
addToolCategory(systemCategory, "system:systemTools");
|
|
||||||
addToolCategory(hahahah, "system:mc");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
package com.axis.innovators.box.tools;
|
package com.axis.innovators.box.tools;
|
||||||
|
|
||||||
|
import com.axis.innovators.box.events.BrowserCreationCallback;
|
||||||
|
import com.axis.innovators.box.events.SubscribeEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在程序链接库文件中加载指定链接库
|
* 在程序链接库文件中加载指定链接库
|
||||||
* @author tzdwindows 7
|
* @author tzdwindows 7
|
||||||
|
|||||||
@@ -1,67 +1,132 @@
|
|||||||
package com.axis.innovators.box.util;
|
package com.axis.innovators.box.util;
|
||||||
|
|
||||||
|
import com.axis.innovators.box.util.build.BuildInformation;
|
||||||
|
import com.axis.innovators.box.util.build.BuildSystem;
|
||||||
import com.axis.innovators.box.window.JarApiProfilingWindow;
|
import com.axis.innovators.box.window.JarApiProfilingWindow;
|
||||||
|
import jnafilechooser.api.JnaFileChooser;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.InvalidPathException;
|
|
||||||
import java.util.prefs.Preferences;
|
import java.util.prefs.Preferences;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 修改版:回归继承 JFileChooser,以解决 boolean/int 类型不匹配问题。
|
||||||
|
* 通过内部代理的方式调用 Windows 原生组件。
|
||||||
|
*
|
||||||
* @author tzdwindows 7
|
* @author tzdwindows 7
|
||||||
*/
|
*/
|
||||||
public class AdvancedJFileChooser extends JFileChooser {
|
public class AdvancedJFileChooser extends JFileChooser {
|
||||||
|
|
||||||
private static final String PREF_KEY = "LAST_DIRECTORY";
|
private static final String PREF_KEY = "LAST_DIRECTORY";
|
||||||
private static final File FALLBACK_DIR = new File(System.getProperty("user.home"));
|
|
||||||
|
|
||||||
public AdvancedJFileChooser() {
|
public AdvancedJFileChooser() {
|
||||||
super(loadValidDirectory());
|
super();
|
||||||
setFileSelectionMode(FILES_AND_DIRECTORIES);
|
// 初始化目录
|
||||||
|
File lastDir = loadValidDirectory();
|
||||||
|
if (lastDir != null) {
|
||||||
|
setCurrentDirectory(lastDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重写核心方法 showDialog。
|
||||||
|
* 拦截调用,启动 Windows 原生选择器,并将结果转换回 int 返回。
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int showDialog(Component parent, String approveButtonText) {
|
||||||
|
// 1. 仅在 Windows 下启用原生界面
|
||||||
|
if (BuildInformation.isMatchSystem(BuildSystem.WINDOWS)) {
|
||||||
|
|
||||||
|
JnaFileChooser fc = new JnaFileChooser();
|
||||||
|
|
||||||
|
// --- 关键:将 JFileChooser 的设置同步给 Native Chooser ---
|
||||||
|
|
||||||
|
// 2. 同步过滤器 (解决你遇到的过滤器不生效问题)
|
||||||
|
javax.swing.filechooser.FileFilter swingFilter = getFileFilter();
|
||||||
|
if (swingFilter instanceof FileNameExtensionFilter) {
|
||||||
|
FileNameExtensionFilter ext = (FileNameExtensionFilter) swingFilter;
|
||||||
|
fc.addFilter(ext.getDescription(), ext.getExtensions());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 同步标题
|
||||||
|
String title = getDialogTitle();
|
||||||
|
fc.setTitle((title != null && !title.isEmpty()) ? title : approveButtonText);
|
||||||
|
|
||||||
|
// 4. 同步当前目录
|
||||||
|
if (getCurrentDirectory() != null) {
|
||||||
|
fc.setCurrentDirectory(getCurrentDirectory().getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 设置模式 (文件/目录)
|
||||||
|
if (getFileSelectionMode() == DIRECTORIES_ONLY) fc.setMode(JnaFileChooser.Mode.Directories);
|
||||||
|
else fc.setMode(JnaFileChooser.Mode.Files); // 默认为文件
|
||||||
|
|
||||||
|
// 6. 显示原生窗口
|
||||||
|
Window window = getWindowForComponent(parent);
|
||||||
|
boolean result;
|
||||||
|
if (getDialogType() == SAVE_DIALOG) {
|
||||||
|
result = fc.showSaveDialog(window);
|
||||||
|
} else {
|
||||||
|
result = fc.showOpenDialog(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 处理结果并转换类型 (boolean -> int)
|
||||||
|
if (result) {
|
||||||
|
File selected = fc.getSelectedFile();
|
||||||
|
setSelectedFile(selected); // 回填文件,供 getSelectedFile() 调用
|
||||||
|
persistDirectory(selected);
|
||||||
|
return APPROVE_OPTION; // 返回 0
|
||||||
|
} else {
|
||||||
|
return CANCEL_OPTION; // 返回 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.showDialog(parent, approveButtonText);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 兼容性重写 ---
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int showOpenDialog(Component parent) {
|
||||||
|
setDialogType(OPEN_DIALOG);
|
||||||
|
return showDialog(parent, "Open");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int showDialog(Component parent, String approveButtonText) {
|
public int showSaveDialog(Component parent) {
|
||||||
int result = super.showDialog(parent, approveButtonText);
|
setDialogType(SAVE_DIALOG);
|
||||||
if (result == APPROVE_OPTION) {
|
return showDialog(parent, "Save");
|
||||||
persistDirectory(getSelectedPath());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getSelectedPath() {
|
// --- 辅助工具 ---
|
||||||
File selected = getSelectedFile();
|
|
||||||
return (selected != null && selected.isDirectory()) ?
|
private Window getWindowForComponent(Component parent) {
|
||||||
selected.getAbsolutePath() :
|
if (parent == null) return null;
|
||||||
getCurrentDirectory().getAbsolutePath();
|
if (parent instanceof Window) return (Window) parent;
|
||||||
|
return SwingUtilities.getWindowAncestor(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static File loadValidDirectory() {
|
private static File loadValidDirectory() {
|
||||||
try {
|
try {
|
||||||
Preferences prefs = Preferences.userNodeForPackage(JarApiProfilingWindow.class);
|
Preferences prefs = Preferences.userNodeForPackage(JarApiProfilingWindow.class);
|
||||||
String path = prefs.get(PREF_KEY, FALLBACK_DIR.getAbsolutePath());
|
String path = prefs.get(PREF_KEY, null);
|
||||||
|
if (path != null) {
|
||||||
File dir = new File(path).getCanonicalFile();
|
File dir = new File(path);
|
||||||
return dir.isDirectory() && Files.isReadable(dir.toPath()) ?
|
if (dir.exists() && dir.isDirectory()) return dir;
|
||||||
dir :
|
}
|
||||||
FALLBACK_DIR;
|
} catch (Exception e) {}
|
||||||
|
return null;
|
||||||
} catch (IOException | InvalidPathException | SecurityException e) {
|
|
||||||
return FALLBACK_DIR;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void persistDirectory(String path) {
|
private void persistDirectory(File file) {
|
||||||
|
if (file == null) return;
|
||||||
try {
|
try {
|
||||||
File dir = new File(path).getCanonicalFile();
|
File dir = file.isDirectory() ? file : file.getParentFile();
|
||||||
if (dir.isDirectory() && Files.isWritable(dir.toPath())) {
|
if (dir != null && dir.exists()) {
|
||||||
Preferences prefs = Preferences.userNodeForPackage(JarApiProfilingWindow.class);
|
Preferences prefs = Preferences.userNodeForPackage(JarApiProfilingWindow.class);
|
||||||
prefs.put(PREF_KEY, dir.getAbsolutePath());
|
prefs.put(PREF_KEY, dir.getAbsolutePath());
|
||||||
}
|
}
|
||||||
} catch (IOException | InvalidPathException | SecurityException e) {
|
} catch (Exception e) {}
|
||||||
System.err.println("无法保存目录: " + e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.axis.innovators.box.util;
|
package com.axis.innovators.box.util;
|
||||||
|
|
||||||
|
import com.axis.innovators.box.util.build.BuildSystem;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.axis.innovators.box.AxisInnovatorsBox;
|
|||||||
import com.axis.innovators.box.browser.MainApplication;
|
import com.axis.innovators.box.browser.MainApplication;
|
||||||
import com.axis.innovators.box.decompilation.gui.ModernJarViewer;
|
import com.axis.innovators.box.decompilation.gui.ModernJarViewer;
|
||||||
import com.axis.innovators.box.tools.RegisterTray;
|
import com.axis.innovators.box.tools.RegisterTray;
|
||||||
|
import com.axis.innovators.box.util.build.BuildSystem;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -18,7 +19,7 @@ public class Tray {
|
|||||||
private static final Random random = new Random();
|
private static final Random random = new Random();
|
||||||
private static final String trayName = "轴创工具箱 v1.1";
|
private static final String trayName = "轴创工具箱 v1.1";
|
||||||
private static final String trayDescription = "轴创工具箱";
|
private static final String trayDescription = "轴创工具箱";
|
||||||
private static final String trayIcon =System.getProperty("user.dir") + "/logo.ico";
|
private static final String trayIcon = System.getProperty("user.dir") + "/logo.ico";
|
||||||
private static List<RegisterTray.Item> menuItems = null;
|
private static List<RegisterTray.Item> menuItems = null;
|
||||||
private static final List<Integer> idx = new ArrayList<>();
|
private static final List<Integer> idx = new ArrayList<>();
|
||||||
private static final List<TrayLabels> trayLabelsList = new ArrayList<>();
|
private static final List<TrayLabels> trayLabelsList = new ArrayList<>();
|
||||||
@@ -35,8 +36,7 @@ public class Tray {
|
|||||||
});
|
});
|
||||||
|
|
||||||
load(new TrayLabels("启动 Jar 查看器", () -> SwingUtilities.invokeLater(() -> {
|
load(new TrayLabels("启动 Jar 查看器", () -> SwingUtilities.invokeLater(() -> {
|
||||||
ModernJarViewer viewer = new ModernJarViewer(null);
|
ModernJarViewer.popupSimulatingWindow(null,null);
|
||||||
viewer.setVisible(true);
|
|
||||||
})));
|
})));
|
||||||
|
|
||||||
load(new TrayLabels("启动 HTML 查看器", new Runnable() {
|
load(new TrayLabels("启动 HTML 查看器", new Runnable() {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user