Re: Webview2 control - Chromium browser for Purebasic (Windows)
Posted: Tue Oct 05, 2021 9:33 am
Thanks for the reply. What a shame 

http://www.purebasic.com
https://www.purebasic.fr/english/
Justin wrote: Wed Dec 15, 2021 10:07 am Hi vmars316,
the examples i included cover various things like limiting the pages you can visit, there is also a basic browser in the Ohm folder, not sure if is this what you are looking for.
Yeah ... that seems to do the trick .... thanks a lot.Justin wrote: Tue Jan 18, 2022 7:25 pm Hi PureLust,
to use different cookie settings you have to use CreateCoreWebView2EnvironmentWithOptions() to set the userDataFolder, all webview instances using that WebView2Environment will use that datafolder, so for each webview instance with a different data folder you need to create a new WebView2Environment instance with that data folder..
https://docs.microsoft.com/en-us/micros ... ithoptions
Code: Select all
;multi_tab.pb
;Multi tab browser
;New environment for each browser.
;Use Ctrl + T new browser, Ctrl + w closes the current browser
IncludeFile "..\PBWebView2.pb"
EnableExplicit
;- CMD Enum
Enumeration
#CMD_NEW_TAB
#CMD_CLOSE_TAB
EndEnumeration
;- BROWSER
Structure BROWSER
wvEnvironment.ICoreWebView2Environment
wvController.ICoreWebView2Controller
wvCore.ICoreWebView2
*eventNavigationCompleted.WV2_EVENT_HANDLER
container.i
id.l
EndStructure
;- APP_TAG
Structure APP_TAG
window.i
panel.i
*evAccelKeyPressed.WV2_EVENT_HANDLER
browserID.l
EndStructure
Global.APP_TAG app
;- DECLARES
Declare main()
Declare window_Close()
Declare window_Resize()
Declare window_ProcessEvents(ev.l)
Declare window_new_tab()
Declare window_close_tab(index.l)
Declare wvEnvironment_Created(*this.WV2_EVENT_HANDLER, result.l, environment.ICoreWebView2Environment)
Declare wvController_Created(*this.WV2_EVENT_HANDLER, result.l=0, controller.ICoreWebView2Controller=0)
Declare wv_NavigationCompleted(*this.WV2_EVENT_HANDLER, sender.ICoreWebView2, args.ICoreWebView2NavigationCompletedEventArgs)
Declare wv_NavigationStarting(*this.WV2_EVENT_HANDLER, sender.ICoreWebView2, args.ICoreWebView2NavigationStartingEventArgs)
Declare wv_WebResourceRequested(*this.WV2_EVENT_HANDLER, sender.ICoreWebView2, args.ICoreWebView2WebResourceRequestedEventArgs)
;-
;Resizes the webview to the dimensions of ite container gadget
Procedure browser_resize(*browser.BROWSER)
Protected.RECT wvBounds
If *browser\wvController
;Resize container
ResizeGadget(*browser\container, #PB_Ignore, #PB_Ignore, GetGadgetAttribute(app\panel, #PB_Panel_ItemWidth),
GetGadgetAttribute(app\panel, #PB_Panel_ItemHeight))
;Resize webview
GetClientRect_(GadgetID(*browser\container), @wvBounds)
wv2_Controller_put_Bounds(*browser\wvController, @wvBounds)
EndIf
EndProcedure
Procedure browser_free(*browser.BROWSER)
If *browser\wvCore : *browser\wvCore\Release() : *browser\wvCore = 0 : EndIf
If *browser\wvController : *browser\wvController\Release() : *browser\wvController = 0 : EndIf
If *browser\wvEnvironment : *browser\wvEnvironment\Release() : *browser\wvEnvironment = 0 : EndIf
FreeMemory(*browser)
EndProcedure
;-
Procedure wvEnvironment_Created(*this.WV2_EVENT_HANDLER, result.l, environment.ICoreWebView2Environment)
Protected.BROWSER *browser
If result = #S_OK
*browser = *this\context
environment\QueryInterface(?IID_ICoreWebView2Environment, @*browser\wvEnvironment)
*browser\wvEnvironment\CreateCoreWebView2Controller(GadgetID(*browser\container),
wv2_EventHandler_New(?IID_ICoreWebView2CreateCoreWebView2ControllerCompletedHandler, @wvController_Created(), *browser))
wv2_EventHandler_Release(*this)
Else
MessageRequester("Error", "Failed to create WebView2Environment.")
End
EndIf
EndProcedure
Procedure wvController_Created(*this.WV2_EVENT_HANDLER, result.l=0, controller.ICoreWebView2Controller=0)
Protected.BROWSER *browser
If result = #S_OK
*browser = *this\context
controller\QueryInterface(?IID_ICoreWebView2Controller, @*browser\wvController)
*browser\wvController\get_CoreWebView2(@*browser\wvCore)
;Setup events
;Global event for all browsers
*browser\wvController\add_AcceleratorKeyPressed(app\evAccelKeyPressed, #Null)
;Browser specific event
*browser\eventNavigationCompleted = wv2_EventHandler_New(?IID_ICoreWebView2NavigationCompletedEventHandler, @wv_NavigationCompleted(), *browser)
*browser\wvCore\add_NavigationCompleted(*browser\eventNavigationCompleted, #Null)
browser_resize(*browser)
*browser\wvCore\Navigate("https://duckduckgo.com")
wv2_EventHandler_Release(*this)
Else
MessageRequester("Error", "Failed to create WebView2Controller.")
End
EndIf
EndProcedure
Procedure wvController_AccelKeyPressed(*this.WV2_EVENT_HANDLER, sender.ICoreWebView2Controller, args.ICoreWebView2AcceleratorKeyPressedEventArgs)
Protected.l keyEventKind, key, handled
;Disable Ctrl + T , Ctrl + w so it can be handled by the main window.
handled = #False
args\get_KeyEventKind(@keyEventKind)
If keyEventKind = #COREWEBVIEW2_KEY_EVENT_KIND_KEY_DOWN Or keyEventKind = #COREWEBVIEW2_KEY_EVENT_KIND_SYSTEM_KEY_DOWN
args\get_VirtualKey(@key)
If key_IsDown(#VK_CONTROL)
Select key
Case #VK_T
window_new_tab()
handled = #True
Case #VK_W
window_close_tab(GetGadgetState(app\panel))
handled = #True
EndSelect
EndIf
EndIf
args\put_Handled(handled)
EndProcedure
Procedure wv_NavigationCompleted(*this.WV2_EVENT_HANDLER, sender.ICoreWebView2, args.ICoreWebView2NavigationCompletedEventArgs)
Protected.BROWSER *browser
*browser = *this\context
Debug "Event NavigationCompleted ID: " + Str(*browser\id)
EndProcedure
;-
Procedure panel_on_change()
Protected.BROWSER *browser
*browser = GetGadgetItemData(app\panel, GetGadgetState(app\panel))
If *browser : browser_resize(*browser) :EndIf
EndProcedure
;-
Procedure window_on_move_moving()
Protected.BROWSER *browser
*browser = GetGadgetItemData(app\panel, GetGadgetState(app\panel))
If *browser And *browser\wvController
wv2_Controller_On_WM_MOVE_MOVING(*browser\wvController)
EndIf
EndProcedure
Procedure window_Proc(hwnd.i, msg.l, wparam.i, lparam.i)
Select msg
Case #WM_MOVE, #WM_MOVING : window_on_move_moving()
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure window_new_tab()
Protected.BROWSER *browser
Protected.l currTab
Protected.WV2_EVENT_HANDLER *wvEv
;New browser
*browser = AllocateMemory(SizeOf(BROWSER))
app\browserID + 1
*browser\id = app\browserID
OpenGadgetList(app\panel)
AddGadgetItem(app\panel, -1, "New tab " + Str(*browser\id))
CloseGadgetList() ;Panel
currTab = CountGadgetItems(app\panel) - 1
SetGadgetItemData(app\panel, currTab, *browser)
OpenGadgetList(app\panel, currTab)
*browser\container = ContainerGadget(#PB_Any, 0, 0, GetGadgetAttribute(app\panel, #PB_Panel_ItemWidth),
GetGadgetAttribute(app\panel, #PB_Panel_ItemHeight))
CloseGadgetList() ;Container
CreateCoreWebView2EnvironmentWithOptions("", "", #Null,
wv2_EventHandler_New(?IID_ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, @wvEnvironment_Created(), *browser))
SetGadgetState(app\panel, currTab)
CloseGadgetList() ;Tab
EndProcedure
Procedure window_close_tab(index.l)
Protected.BROWSER *browser
If index <> -1
*browser = GetGadgetItemData(app\panel, index)
RemoveGadgetItem(app\panel, index)
If *browser : browser_free(*browser) : EndIf
;Resize the next current browser
*browser = GetGadgetItemData(app\panel, GetGadgetState(app\panel))
If *browser : browser_resize(*browser) : EndIf
EndIf
EndProcedure
Procedure window_Close()
Protected.l iTab
;Free all browsers
For iTab = 0 To CountGadgetItems(app\panel)
window_close_tab(iTab)
Next
;Global event
If app\evAccelKeyPressed
wv2_EventHandler_Release(app\evAccelKeyPressed)
app\evAccelKeyPressed = 0
EndIf
ProcedureReturn #True ;Exit message loop.
EndProcedure
Procedure window_Resize()
Protected.RECT wvBounds
Protected.BROWSER *browser
;Panel
ResizeGadget(app\panel, #PB_Ignore, #PB_Ignore, WindowWidth(app\window), WindowHeight(app\window))
*browser = GetGadgetItemData(app\panel, GetGadgetState(app\panel))
If *browser : browser_resize(*browser) : EndIf
EndProcedure
Procedure window_ProcessEvents(ev.l)
Select ev
Case #PB_Event_Gadget
Select EventType()
Case #PB_EventType_Change
Select EventGadget()
Case app\panel : panel_on_change()
EndSelect
EndSelect
Case #PB_Event_Menu
Select EventMenu()
Case #CMD_NEW_TAB : window_new_tab()
Case #CMD_CLOSE_TAB : window_close_tab(GetGadgetState(app\panel))
EndSelect
Case #PB_Event_CloseWindow : ProcedureReturn window_Close()
EndSelect
ProcedureReturn #False
EndProcedure
;-
Procedure main()
If wv2_GetBrowserVersion("") = ""
MessageRequester("Error", "MS Edge not found, install MS Edge runtime.")
End
EndIf
;Global event handler for all browsers, to disable Ctrl W Ctrl T processing
app\evAccelKeyPressed = wv2_EventHandler_New(?IID_ICoreWebView2AcceleratorKeyPressedEventHandler, @wvController_AccelKeyPressed())
app\window = OpenWindow(#PB_Any, 10, 10, 600, 400, "Multi Tab - Use: Ctrl + T New Tab / Ctrl + W Close Tab", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
SetWindowCallback(@window_Proc(), app\window)
app\panel = PanelGadget(#PB_Any, 0, 0, WindowWidth(app\window), WindowHeight(app\window))
CloseGadgetList()
BindEvent(#PB_Event_SizeWindow, @window_Resize())
AddKeyboardShortcut(app\window, #PB_Shortcut_Control | #PB_Shortcut_T, #CMD_NEW_TAB)
AddKeyboardShortcut(app\window, #PB_Shortcut_Control | #PB_Shortcut_W, #CMD_CLOSE_TAB)
Repeat
Until window_ProcessEvents(WaitWindowEvent()) = #True
EndProcedure
main()