Skip to content

Commit f46f20d

Browse files
committed
cleanup
1 parent 9c49a0a commit f46f20d

File tree

13 files changed

+178
-195
lines changed

13 files changed

+178
-195
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/QLoginWebview.kt

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import com.intellij.ui.components.panels.Wrapper
1616
import com.intellij.ui.dsl.builder.Align
1717
import com.intellij.ui.dsl.builder.panel
1818
import com.intellij.ui.jcef.JBCefJSQuery
19-
import org.cef.CefApp
2019
import software.aws.toolkits.core.utils.error
2120
import software.aws.toolkits.core.utils.getLogger
2221
import software.aws.toolkits.core.utils.warn
@@ -30,8 +29,8 @@ import software.aws.toolkits.jetbrains.core.credentials.sono.isSono
3029
import software.aws.toolkits.jetbrains.core.region.AwsRegionProvider
3130
import software.aws.toolkits.jetbrains.core.webview.BrowserMessage
3231
import software.aws.toolkits.jetbrains.core.webview.BrowserState
32+
import software.aws.toolkits.jetbrains.core.webview.LocalAssetJBCefRequestHandler
3333
import software.aws.toolkits.jetbrains.core.webview.LoginBrowser
34-
import software.aws.toolkits.jetbrains.core.webview.WebviewResourceHandlerFactory
3534
import software.aws.toolkits.jetbrains.isDeveloperMode
3635
import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser
3736
import software.aws.toolkits.jetbrains.utils.isQConnected
@@ -86,7 +85,7 @@ class QWebviewPanel private constructor(val project: Project) : Disposable {
8685
}
8786

8887
private fun init() {
89-
if (false) {
88+
if (!isQWebviewsAvailable()) {
9089
// Fallback to an alternative browser-less solution
9190
webviewContainer.add(JBTextArea("JCEF not supported"))
9291
browser = null
@@ -108,25 +107,14 @@ class QWebviewPanel private constructor(val project: Project) : Disposable {
108107
class QWebviewBrowser(val project: Project, private val parentDisposable: Disposable) :
109108
LoginBrowser(
110109
project,
111-
QWebviewBrowser.DOMAIN,
112-
QWebviewBrowser.WEB_SCRIPT_URI
113110
),
114111
Disposable {
115112
// TODO: confirm if we need such configuration or the default is fine
116113
override val jcefBrowser = createBrowser(parentDisposable)
117114
private val query = JBCefJSQuery.create(jcefBrowser)
115+
private val assetHandler = LocalAssetJBCefRequestHandler(jcefBrowser)
118116

119117
init {
120-
CefApp.getInstance()
121-
.registerSchemeHandlerFactory(
122-
"http",
123-
domain,
124-
WebviewResourceHandlerFactory(
125-
domain = "http://$domain/",
126-
assetUri = "/webview/assets/"
127-
),
128-
)
129-
130118
loadWebView(query)
131119

132120
query.addHandler(jcefHandler)
@@ -273,12 +261,15 @@ class QWebviewBrowser(val project: Project, private val parentDisposable: Dispos
273261
}
274262

275263
override fun loadWebView(query: JBCefJSQuery) {
276-
jcefBrowser.loadHTML(getWebviewHTML(webScriptUri, query))
264+
val webScriptUri = assetHandler.createResource(
265+
"js/getStart.js",
266+
QWebviewBrowser::class.java.getResourceAsStream("/webview/assets/js/getStart.js")
267+
)
268+
269+
jcefBrowser.loadURL(assetHandler.createResource("content.html", getWebviewHTML(webScriptUri, query)))
277270
}
278271

279272
companion object {
280273
private val LOG = getLogger<QWebviewBrowser>()
281-
private const val WEB_SCRIPT_URI = "http://webview/js/getStart.js"
282-
private const val DOMAIN = "webview"
283274
}
284275
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/gettingstarted/QGettingStartedContent.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import org.cef.browser.CefBrowser
1818
import org.cef.browser.CefFrame
1919
import org.cef.handler.CefLoadHandlerAdapter
2020
import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope
21+
import software.aws.toolkits.jetbrains.core.webview.LocalAssetJBCefRequestHandler
2122
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
2223
import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.EditorThemeAdapter
2324
import software.aws.toolkits.resources.message
@@ -72,7 +73,7 @@ class QGettingStartedContent(val project: Project) : Disposable {
7273

7374
private fun loadWebView() {
7475
// load the web app
75-
jcefBrowser.loadHTML(getWebviewHTML())
76+
jcefBrowser.loadURL(LocalAssetJBCefRequestHandler(jcefBrowser).createResource("content.html", getWebviewHTML()))
7677
}
7778

7879
private fun getWebviewHTML(): String {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,13 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
107107
project: Project,
108108
qPanel: Wrapper,
109109
) {
110-
// val component = if (isQConnected(project) && !isQExpired(project)) {
111-
qPanel.setContent(AmazonQToolWindow.getInstance(project).component)
112-
// } else {
113-
// QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ))
114-
// QWebviewPanel.getInstance(project).component
115-
// }
116-
// qPanel.setContent(component)
110+
val component = if (isQConnected(project) && !isQExpired(project)) {
111+
AmazonQToolWindow.getInstance(project).component
112+
} else {
113+
QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ))
114+
QWebviewPanel.getInstance(project).component
115+
}
116+
qPanel.setContent(component)
117117
}
118118

119119
override fun init(toolWindow: ToolWindow) {
@@ -132,7 +132,7 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
132132
)
133133
}
134134

135-
override fun shouldBeAvailable(project: Project): Boolean = true
135+
override fun shouldBeAvailable(project: Project): Boolean = isQWebviewsAvailable()
136136

137137
private fun onConnectionChanged(project: Project, newConnection: ToolkitConnection?, qPanel: Wrapper) {
138138
val isNewConnectionForQ = newConnection?.let {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/util/JcefBrowserUtil.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.util
55

6-
import com.github.rli.cefschemeremotetest.toolWindow.JBCefLocalRequestHandler
7-
import com.github.rli.cefschemeremotetest.toolWindow.JBCefStreamResourceHandler
86
import com.intellij.openapi.Disposable
97
import com.intellij.openapi.util.Disposer
108
import com.intellij.ui.jcef.JBCefApp
119
import com.intellij.ui.jcef.JBCefBrowserBase
1210
import com.intellij.ui.jcef.JBCefBrowserBuilder
1311
import com.intellij.ui.jcef.JBCefClient
14-
import software.aws.toolkits.jetbrains.services.amazonq.webview.AssetResourceHandler
15-
import software.aws.toolkits.jetbrains.services.amazonq.webview.Browser
1612

1713
fun createBrowser(parent: Disposable): JBCefBrowserBase {
1814
val client = JBCefApp.getInstance().createClient().apply {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.webview
55

66
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
7-
import com.github.rli.cefschemeremotetest.toolWindow.JBCefLocalRequestHandler
8-
import com.github.rli.cefschemeremotetest.toolWindow.JBCefStreamResourceHandler
97
import com.intellij.openapi.Disposable
108
import com.intellij.openapi.util.Disposer
119
import com.intellij.ui.jcef.JBCefJSQuery
12-
import org.cef.CefApp
10+
import software.aws.toolkits.jetbrains.core.webview.LocalAssetJBCefRequestHandler
1311
import software.aws.toolkits.jetbrains.services.amazonq.util.HighlightCommand
1412
import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser
1513
import software.aws.toolkits.jetbrains.settings.MeetQSettings
14+
import java.nio.file.Paths
1615

1716
/*
1817
Displays the web view for the Amazon Q tool window
@@ -25,6 +24,17 @@ class Browser(parent: Disposable) : Disposable {
2524
Disposer.register(this, it)
2625
}
2726

27+
private val assetRequestHandler = LocalAssetJBCefRequestHandler(jcefBrowser)
28+
29+
init {
30+
assetRequestHandler.addWildcardHandler("mynah") { path ->
31+
val asset = path.replaceFirst("mynah/", "/mynah-ui/assets/")
32+
Paths.get(asset).normalize().toString().let {
33+
this::class.java.getResourceAsStream(it)
34+
}
35+
}
36+
}
37+
2838
fun init(
2939
isCodeTransformAvailable: Boolean,
3040
isFeatureDevAvailable: Boolean,
@@ -60,26 +70,13 @@ class Browser(parent: Disposable) : Disposable {
6070
// that's persistent between page loads.
6171
jcefBrowser.setProperty("state", "")
6272

63-
val handler = JBCefLocalRequestHandler("http", "toolkitasset")
64-
handler.addResource("webview/chat.html") {
65-
getWebviewHTML(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand)
66-
.byteInputStream().let {
67-
JBCefStreamResourceHandler(it, "text/html", this)
68-
}
69-
}
70-
71-
handler.addResource("mynah/js/mynah-ui.js") {
72-
AssetResourceHandler::class.java.getResourceAsStream("/mynah-ui/assets/js/mynah-ui.js")?.let {
73-
JBCefStreamResourceHandler(it, "text/javascript", this)
74-
}
75-
}
76-
jcefBrowser.jbCefClient.addRequestHandler(handler, jcefBrowser.cefBrowser)
77-
Disposer.register(this) {
78-
jcefBrowser.jbCefClient.removeRequestHandler(handler, jcefBrowser.cefBrowser)
79-
}
80-
8173
// load the web app
82-
jcefBrowser.loadURL("http://toolkitasset/webview/chat.html")
74+
jcefBrowser.loadURL(
75+
assetRequestHandler.createResource(
76+
"webview/chat.html",
77+
getWebviewHTML(isCodeTransformAvailable, isFeatureDevAvailable, isDocAvailable, isCodeScanAvailable, isCodeTestAvailable, highlightCommand)
78+
)
79+
)
8380
}
8481

8582
/**
Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1+
@file:Suppress("all")
2+
13
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
4+
// adapted from https://github.com/JetBrains/intellij-community/blob/54429f3ba00c695c22d09e164135b0713f2cfc0f/platform/ui.jcef/jcef/utils/JBCefLocalRequestHandler.kt
25

3-
package com.github.rli.cefschemeremotetest.toolWindow
6+
package contrib.org.intellij.images.editor.impl.jcef
47

58
import org.cef.browser.CefBrowser
69
import org.cef.browser.CefFrame
710
import org.cef.callback.CefCallback
8-
import org.cef.handler.*
11+
import org.cef.handler.CefRequestHandlerAdapter
12+
import org.cef.handler.CefResourceHandler
13+
import org.cef.handler.CefResourceHandlerAdapter
14+
import org.cef.handler.CefResourceRequestHandler
15+
import org.cef.handler.CefResourceRequestHandlerAdapter
916
import org.cef.misc.BoolRef
1017
import org.cef.network.CefRequest
1118
import java.net.URL
@@ -22,7 +29,7 @@ import java.net.URL
2229
*/
2330
open class JBCefLocalRequestHandler(
2431
private val myProtocol: String,
25-
private val myAuthority: String
32+
private val myAuthority: String,
2633
) : CefRequestHandlerAdapter() {
2734
private val myResources: MutableMap<String, () -> CefResourceHandler?> = HashMap()
2835

@@ -33,22 +40,27 @@ open class JBCefLocalRequestHandler(
3340
}
3441
}
3542

36-
private val RESOURCE_REQUEST_HANDLER = object : CefResourceRequestHandlerAdapter() {
37-
override fun getResourceHandler(browser: CefBrowser?, frame: CefFrame?, request: CefRequest): CefResourceHandler {
38-
val url = URL(request.url)
39-
url.protocol
40-
if (!url.protocol.equals(myProtocol) || !url.authority.equals(myAuthority)) {
41-
return REJECTING_RESOURCE_HANDLER
42-
}
43-
return try {
44-
val path = url.path.trim('/')
45-
myResources[path]?.let { it() } ?: REJECTING_RESOURCE_HANDLER
46-
} catch (e: RuntimeException) {
47-
println(e.message)
48-
REJECTING_RESOURCE_HANDLER
43+
private val RESOURCE_REQUEST_HANDLER = resourceHandlerWrapper { path ->
44+
myResources[path]?.let { it() }
45+
}
46+
47+
protected fun resourceHandlerWrapper(handler: (String) -> CefResourceHandler?): CefResourceRequestHandler =
48+
object : CefResourceRequestHandlerAdapter() {
49+
override fun getResourceHandler(browser: CefBrowser?, frame: CefFrame?, request: CefRequest): CefResourceHandler {
50+
val url = URL(request.url)
51+
url.protocol
52+
if (!url.protocol.equals(myProtocol) || !url.authority.equals(myAuthority)) {
53+
return REJECTING_RESOURCE_HANDLER
54+
}
55+
return try {
56+
val path = url.path.trim('/')
57+
handler(path) ?: REJECTING_RESOURCE_HANDLER
58+
} catch (e: RuntimeException) {
59+
println(e.message)
60+
REJECTING_RESOURCE_HANDLER
61+
}
4962
}
5063
}
51-
}
5264

5365
fun addResource(resourcePath: String, resourceProvider: () -> CefResourceHandler?) {
5466
val normalisedPath = resourcePath.trim('/')
@@ -61,13 +73,15 @@ open class JBCefLocalRequestHandler(
6173
return "$myProtocol://$myAuthority/$normalisedPath"
6274
}
6375

64-
override fun getResourceRequestHandler(browser: CefBrowser?,
65-
frame: CefFrame?,
66-
request: CefRequest?,
67-
isNavigation: Boolean,
68-
isDownload: Boolean,
69-
requestInitiator: String?,
70-
disableDefaultHandling: BoolRef?): CefResourceRequestHandler {
76+
override fun getResourceRequestHandler(
77+
browser: CefBrowser?,
78+
frame: CefFrame?,
79+
request: CefRequest?,
80+
isNavigation: Boolean,
81+
isDownload: Boolean,
82+
requestInitiator: String?,
83+
disableDefaultHandling: BoolRef?,
84+
): CefResourceRequestHandler {
7185
return RESOURCE_REQUEST_HANDLER
7286
}
73-
}
87+
}

plugins/core/jetbrains-community/src/contrib/org/intellij/images/editor/impl/jcef/JBCefStreamResourceHandler.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
1+
@file:Suppress("all")
22

3-
package com.github.rli.cefschemeremotetest.toolWindow
3+
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
4+
// https://github.com/JetBrains/intellij-community/blob/54429f3ba00c695c22d09e164135b0713f2cfc0f/platform/ui.jcef/jcef/utils/JBCefStreamResourceHandler.kt
5+
package contrib.org.intellij.images.editor.impl.jcef
46

57
import com.intellij.openapi.Disposable
68
import com.intellij.openapi.diagnostic.Logger
@@ -54,8 +56,7 @@ open class JBCefStreamResourceHandler(
5456
if (bytesRead.get() != -1) {
5557
return true
5658
}
57-
}
58-
catch (_: IOException) {
59+
} catch (_: IOException) {
5960
callback.cancel()
6061
}
6162
bytesRead.set(0)
@@ -70,9 +71,8 @@ open class JBCefStreamResourceHandler(
7071
override fun dispose() {
7172
try {
7273
myStream.close()
73-
}
74-
catch (e: IOException) {
74+
} catch (e: IOException) {
7575
Logger.getInstance(JBCefStreamResourceHandler::class.java).warn("Failed to close the stream", e)
7676
}
7777
}
78-
}
78+
}

0 commit comments

Comments
 (0)