"""Putting data into a frame"""
from cefpython3 import cefpython
import os
import sys
from panda3d.core import loadPrcFileData
loadPrcFileData("", "Panda3D example -- Set Javascript")
loadPrcFileData("", "fullscreen 0")
loadPrcFileData("", "win-size 1024 768")
import direct.directbase.DirectStart
from panda3d.core import CardMaker, Texture
settings = {
"log_severity": cefpython.LOGSEVERITY_INFO, # LOGSEVERITY_VERBOSE
#"log_file": GetApplicationPath("debug.log"), # Set to "" to disable.
"release_dcheck_enabled": True, # Enable only when debugging.
# This directories must be set on Linux
"locales_dir_path": cefpython.GetModuleDirectory()+"/locales",
"resources_dir_path": cefpython.GetModuleDirectory(),
"browser_subprocess_path": "%s/%s" % (
cefpython.GetModuleDirectory(), "subprocess")
}
html = """
""" + sys.version + """
Message:
Number of Frames:
"""
class ClientHandler:
"""A client handler is required for the browser to do built in callbacks back into the application."""
browser = None
texture = None
def __init__(self, browser, texture):
self.browser = browser
self.texture = texture
def OnPaint(self, browser, paintElementType, dirtyRects, buffer, width, height):
img = self.texture.modifyRamImage()
if paintElementType == cefpython.PET_POPUP:
print("width=%s, height=%s" % (width, height))
elif paintElementType == cefpython.PET_VIEW:
img.setData(buffer.GetString(mode="rgba", origin="bottom-left"))
else:
raise Exception("Unknown paintElementType: %s" % paintElementType)
def GetViewRect(self, browser, rect):
width = self.texture.getXSize()
height = self.texture.getYSize()
rect.append(0)
rect.append(0)
rect.append(width)
rect.append(height)
return True
def GetScreenPoint(self, browser, viewX, viewY, screenCoordinates):
print("GetScreenPoint()")
return False
def OnLoadEnd(self, browser, frame, httpStatusCode):
return
self._saveImage()
def OnLoadError(self, browser, frame, errorCode, errorText, failedURL):
print("load error", browser, frame, errorCode, errorText, failedURL)
def messageLoop(task):
cefpython.MessageLoopWork()
"""Call a specific javascript function and pass any parameters to it."""
browser.GetMainFrame().CallFunction("setFrameCount", task.frame)
return task.cont
def setVariable(name, value):
"""Sets a javascript value in the main frame"""
jsBindings.SetProperty(name, value)
cefpython.g_debug = True
cefpython.Initialize(settings)
texture = Texture()
texture.setXSize(1024)
texture.setYSize(1024)
texture.setCompression(Texture.CMOff)
texture.setComponentType(Texture.TUnsignedByte)
texture.setFormat(Texture.FRgba4)
cardMaker = CardMaker("browser2d")
cardMaker.setFrame(-0.75, 0.75, -0.75, 0.75)
node = cardMaker.generate()
#For UI attach to render2d
nodePath = render.attachNewNode(node)
nodePath.setTexture(texture)
windowHandle = base.win.getWindowHandle().getIntHandle()
windowInfo = cefpython.WindowInfo()
#You can pass 0 to parentWindowHandle, but then some things like context menus and plugins may not display correctly.
windowInfo.SetAsOffscreen(windowHandle)
#windowInfo.SetAsOffscreen(0)
browserSettings = {}
# Using non about:blank in constructor results in error before render handler callback is set.
# Either set it before/during construction, or set it after then call LoadURL after it is set.
browser = cefpython.CreateBrowserSync(
windowInfo, browserSettings,
navigateUrl="http://www.panda3d.org")
browser.SendFocusEvent(True)
browser.SetClientHandler(ClientHandler(browser, texture))
def on_load_end(*args, **kwargs): return # Example of one kind of call back
browser.SetClientCallback("OnLoadEnd", on_load_end)
browser.GetMainFrame().LoadString(html, "http://fake")
browser.WasResized()
''' IMPORTANT: there is a bug in CEF 3 that causes js bindings to be removed when LoadUrl() is called (see http://www.magpcss.org/ceforum/viewtopic.php?f=6&t=11009). A temporary fix to this bug is to do the navigation through javascript by calling: GetMainFrame().ExecuteJavascript('window.location="http://google.com/"'). '''
#browser.GetMainFrame().ExecuteJavascript('window.location="http://www.panda3d.org"')
#browser.GetMainFrame().LoadUrl("http://wwww.panda3d.org")
#base.accept("window-event", setBrowserSize)
"""Sets up bindings to access javascript variabels and functions. Also is used for calling back into python."""
jsBindings = cefpython.JavascriptBindings(bindToFrames=False, bindToPopups=True)
jsBindings.SetProperty("sometext", "A message from python land! Hello!")
browser.SetJavascriptBindings(jsBindings)
taskMgr.add(messageLoop, "CefMessageLoop")
run()
cefpython.Shutdown()