Commit 0f1f9599 authored by Anton Tarasov's avatar Anton Tarasov Committed by intellij-monorepo-bot
Browse files

IDEA-264004 (JBR-3171) [followup] JCEF JBCefOsrHandlerBrowser failed to invoke...

IDEA-264004 (JBR-3171) [followup] JCEF JBCefOsrHandlerBrowser failed to invoke JS when global registry value ide.browser.jcef.jsQueryPoolSize is not set.

(cherry picked from commit 8ad4e544fc756018459fec3994a8b99f0c31945a)

GitOrigin-RevId: f7267bceed44cdf6517087abd433fc96db20fcde
parent 5a598c41
Showing with 188 additions and 5 deletions
+188 -5
...@@ -19,18 +19,66 @@ import java.awt.event.KeyEvent; ...@@ -19,18 +19,66 @@ import java.awt.event.KeyEvent;
* @see JBCefBrowser * @see JBCefBrowser
*/ */
public final class JBCefOsrHandlerBrowser extends JBCefBrowserBase { public final class JBCefOsrHandlerBrowser extends JBCefBrowserBase {
/**
* Creates the browser and immediately creates its native peer.
* <p></p>
* In order to use {@link JBCefJSQuery} create the browser via {@link #create(String, CefRenderHandler, boolean)} or
* {@link #create(String, CefRenderHandler, JBCefClient, boolean, boolean)}.
*/
@NotNull @NotNull
public static JBCefOsrHandlerBrowser create(@NotNull String url, @NotNull CefRenderHandler renderHandler) { public static JBCefOsrHandlerBrowser create(@NotNull String url, @NotNull CefRenderHandler renderHandler) {
return create(url, renderHandler, JBCefApp.getInstance().createClient(), true); return create(url, renderHandler, true);
} }
/**
* Creates the browser and creates its native peer depending on {@code createImmediately}.
* <p></p>
* For the browser to start loading call {@link #getCefBrowser()} and {@link CefBrowser#createImmediately()}.
* <p></p>
* In order to use {@link JBCefJSQuery} pass {@code createImmediately} as {@code false}, then call {@link CefBrowser#createImmediately()}
* after all the JS queries are created.
*
* @see CefBrowser#createImmediately()
*/
@NotNull
public static JBCefOsrHandlerBrowser create(@NotNull String url, @NotNull CefRenderHandler renderHandler, boolean createImmediately) {
return create(url, renderHandler, JBCefApp.getInstance().createClient(), true, createImmediately);
}
/**
* Creates the browser with the provided {@link JBCefClient} and immediately creates its native peer.
* <p></p>
* In order to use {@link JBCefJSQuery} set {@link JBCefClient.Properties#JS_QUERY_POOL_SIZE} before passing the client.
*/
@NotNull @NotNull
public static JBCefOsrHandlerBrowser create(@NotNull String url, @NotNull CefRenderHandler renderHandler, @NotNull JBCefClient client) { public static JBCefOsrHandlerBrowser create(@NotNull String url, @NotNull CefRenderHandler renderHandler, @NotNull JBCefClient client) {
return create(url, renderHandler, client, false); return create(url, renderHandler, client, false, true);
}
/**
* Creates the browser and creates its native peer depending on {@code createImmediately}.
* <p></p>
* For the browser to start loading call {@link #getCefBrowser()} and {@link CefBrowser#createImmediately()}.
* <p></p>
* In order to use {@link JBCefJSQuery} pass {@code createImmediately} as {@code false}, then call {@link CefBrowser#createImmediately()}
* after all the JS queries are created. Alternatively, pass {@code createImmediately} as {@code true} and set
* {@link JBCefClient.Properties#JS_QUERY_POOL_SIZE} before passing the client.
*
* @see CefBrowser#createImmediately()
*/
@NotNull
public static JBCefOsrHandlerBrowser create(@NotNull String url, @NotNull CefRenderHandler renderHandler, @NotNull JBCefClient client, boolean createImmediately) {
return create(url, renderHandler, client, false, createImmediately);
} }
private static JBCefOsrHandlerBrowser create(@NotNull String url, @NotNull CefRenderHandler renderHandler, @NotNull JBCefClient client, boolean isDefaultClient) { private static JBCefOsrHandlerBrowser create(@NotNull String url,
@NotNull CefRenderHandler renderHandler,
@NotNull JBCefClient client,
boolean isDefaultClient,
boolean createImmediately)
{
var cefBrowser = new CefBrowserOsrWithHandler(client.getCefClient(), url, null, renderHandler); var cefBrowser = new CefBrowserOsrWithHandler(client.getCefClient(), url, null, renderHandler);
if (createImmediately) cefBrowser.createImmediately();
return new JBCefOsrHandlerBrowser(client, cefBrowser, true, isDefaultClient); return new JBCefOsrHandlerBrowser(client, cefBrowser, true, isDefaultClient);
} }
......
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ui.jcef;
import com.intellij.testFramework.ApplicationRule;
import com.intellij.ui.scale.TestScaleHelper;
import org.cef.browser.CefBrowser;
import org.cef.callback.CefDragData;
import org.cef.handler.CefRenderHandler;
import org.cef.handler.CefScreenInfo;
import org.jetbrains.annotations.NotNull;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import java.awt.*;
import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch;
import static com.intellij.ui.jcef.JBCefTestHelper.invokeAndWaitForLatch;
import static com.intellij.ui.jcef.JBCefTestHelper.invokeAndWaitForLoad;
/**
* Tests {@link JBCefJSQuery} for {@link JBCefOsrHandlerBrowser}.
* See: IDEA-264004, JBR-3175
*
* @author tav
*/
public class JBCefJSQueryOSRTest {
static {
TestScaleHelper.setSystemProperty("java.awt.headless", "false");
}
@ClassRule public static final ApplicationRule appRule = new ApplicationRule();
@Before
public void before() {
TestScaleHelper.setSystemProperty("ide.browser.jcef.osr.enabled", "true");
}
@After
public void after() {
TestScaleHelper.restoreProperties();
}
@Test
public void test1() {
TestScaleHelper.assumeStandalone();
JBCefClient client = JBCefApp.getInstance().createClient();
client.setProperty(JBCefClient.Properties.JS_QUERY_POOL_SIZE, 1);
JBCefOsrHandlerBrowser browser = JBCefOsrHandlerBrowser.create("", new MyRenderHandler(), client);
JBCefJSQuery jsQuery = JBCefJSQuery.create(browser);
doTest(browser, jsQuery);
}
@Test
public void test2() {
TestScaleHelper.assumeStandalone();
JBCefOsrHandlerBrowser browser = JBCefOsrHandlerBrowser.create("", new MyRenderHandler(), false);
JBCefJSQuery jsQuery = JBCefJSQuery.create(browser);
browser.getCefBrowser().createImmediately();
doTest(browser, jsQuery);
}
public void doTest(@NotNull JBCefOsrHandlerBrowser browser, @NotNull JBCefJSQuery jsQuery) {
CountDownLatch latch = new CountDownLatch(1);
jsQuery.addHandler(result -> {
System.out.println("JBCefJSQuery result: " + result);
latch.countDown();
return null;
});
invokeAndWaitForLoad(browser, () -> {
browser.loadURL("chrome:version");
});
invokeAndWaitForLatch(latch, () -> {
System.out.println("Executing JBCefJSQuery...");
browser.getCefBrowser().executeJavaScript(jsQuery.inject("'hello'"), "about:blank", 0);
});
}
private static class MyRenderHandler implements CefRenderHandler {
@Override
public Rectangle getViewRect(CefBrowser browser) {
return new Rectangle(0, 0, 100, 100);
}
@Override
public boolean getScreenInfo(CefBrowser browser, CefScreenInfo screenInfo) {
return false;
}
@Override
public Point getScreenPoint(CefBrowser browser, Point viewPoint) {
return new Point(0, 0);
}
@Override
public double getDeviceScaleFactor(CefBrowser browser) {
return 1;
}
@Override
public void onPopupShow(CefBrowser browser, boolean show) {
}
@Override
public void onPopupSize(CefBrowser browser, Rectangle size) {
}
@Override
public void onPaint(CefBrowser browser, boolean popup, Rectangle[] dirtyRects, ByteBuffer buffer, int width, int height) {
}
@Override
public boolean onCursorChange(CefBrowser browser, int cursorType) {
return false;
}
@Override
public boolean startDragging(CefBrowser browser, CefDragData dragData, int mask, int x, int y) {
return false;
}
@Override
public void updateDragCursor(CefBrowser browser, int operation) {
}
}
}
...@@ -12,13 +12,13 @@ import java.util.concurrent.CountDownLatch; ...@@ -12,13 +12,13 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class JBCefTestHelper { public class JBCefTestHelper {
public static void invokeAndWaitForLoad(@NotNull JBCefBrowser browser, @NotNull Runnable runnable) { public static void invokeAndWaitForLoad(@NotNull JBCefBrowserBase browser, @NotNull Runnable runnable) {
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
browser.getJBCefClient().addLoadHandler(new CefLoadHandlerAdapter() { browser.getJBCefClient().addLoadHandler(new CefLoadHandlerAdapter() {
@Override @Override
public void onLoadEnd(CefBrowser cefBrowser, CefFrame frame, int httpStatusCode) { public void onLoadEnd(CefBrowser cefBrowser, CefFrame frame, int httpStatusCode) {
System.out.println("onLoadEnd on " + browser); System.out.println("onLoadEnd on " + browser + " for " + browser.getCefBrowser().getURL());
browser.getJBCefClient().removeLoadHandler(this, cefBrowser); browser.getJBCefClient().removeLoadHandler(this, cefBrowser);
latch.countDown(); latch.countDown();
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment