I’m trying to create multiple instances of WebBrowserComponent in JUCE, but only the last one appears to work. All other instances remain empty.
class WebBrowserDemo final : public Component
{
public:
WebBrowserDemo(int instanceIndex)
{
setOpaque(true);
addAndMakeVisible(addressTextBox);
addressTextBox.setTextToShowWhenEmpty("Enter a web address, e.g. https://www.juce.com", Colours::grey);
addressTextBox.onReturnKey = [this] { webView->goToURL(addressTextBox.getText()); };
// Create a unique user data folder for each instance
auto userDataFolder = File::getSpecialLocation(File::tempDirectory)
.getChildFile("WebViewInstance_" + String(instanceIndex));
const auto winWebView2 = WebBrowserComponent::Options::WinWebView2{}
.withUserDataFolder(userDataFolder);
const auto options = WebBrowserComponent::Options{}
.withBackend(WebBrowserComponent::Options::Backend::webview2)
.withWinWebView2Options(winWebView2);
jassert(WebBrowserComponent::areOptionsSupported(options));
webView = std::make_unique<WebBrowserComponent>(options);
addAndMakeVisible(webView.get());
addAndMakeVisible(goButton);
goButton.onClick = [this] { webView->goToURL(addressTextBox.getText()); };
addAndMakeVisible(backButton);
backButton.onClick = [this] { webView->goBack(); };
addAndMakeVisible(forwardButton);
forwardButton.onClick = [this] { webView->goForward(); };
webView->goToURL("https://www.whatismybrowser.com/");
setSize(1000, 1000);
}
void paint(Graphics& g) override
{
g.fillAll(getUIColourIfAvailable(LookAndFeel_V4::ColourScheme::UIColour::windowBackground,
Colours::grey));
}
void resized() override
{
webView->setBounds(10, 45, getWidth() - 20, getHeight() - 55);
goButton.setBounds(getWidth() - 45, 10, 35, 25);
addressTextBox.setBounds(100, 10, getWidth() - 155, 25);
backButton.setBounds(10, 10, 35, 25);
forwardButton.setBounds(55, 10, 35, 25);
}
private:
std::unique_ptr<WebBrowserComponent> webView;
TextEditor addressTextBox;
TextButton goButton{ "Go", "Go to URL" },
backButton{ "<<", "Back" },
forwardButton{ ">>", "Forward" };
void lookAndFeelChanged() override
{
addressTextBox.applyFontToAllText(addressTextBox.getFont());
}
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WebBrowserDemo)
};
class MainComponent : public juce::Component
{
public:
MainComponent()
{
for(int i = 0; i < 4; ++i)
{
auto browser = std::make_unique<WebBrowserDemo>(i);
addAndMakeVisible(browser.get());
webBrowsers.add(std::move(browser));
}
setSize(800, 600);
}
void resized() override
{
auto area = getLocalBounds();
auto browserHeight = area.getHeight() / 2;
auto browserWidth = area.getWidth() / 2;
for(int i = 0; i < webBrowsers.size(); ++i)
{
auto row = i / 2;
auto col = i % 2;
webBrowsers[i]->setBounds(col * browserWidth, row * browserHeight, browserWidth, browserHeight);
}
}
private:
juce::OwnedArray<WebBrowserDemo> webBrowsers;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(MainComponent)
};
Is it possible to have multiple WebBrowserComponent instances running simultaneously?
Am I missing something in my approach?
Would appreciate any insights! Thanks.
