winamp/Src/Wasabi/api/skin/widgets/mb/xuibrowser.cpp
2024-09-24 14:54:57 +02:00

385 lines
13 KiB
C++

#include <precomp.h>
#include "xuibrowser.h"
const wchar_t browserXuiObjectStr[] = L"Browser"; // This is the xml tag
char browserXuiSvcName[] = "Browser xui object"; // this is the name of the xuiservice
XMLParamPair ScriptBrowserWnd::params[] = {
{BROWSER_SETMAINMB, L"MAINMB"},
{BROWSER_SETSCROLLBARS, L"SCROLLBARS"},
{BROWSER_SETTARGETNAME, L"TARGETNAME"},
{BROWSER_SETURL, L"URL"},
};
ScriptBrowserWnd::ScriptBrowserWnd()
{
getScriptObject()->vcpu_setInterface(browserGuid, (void *)static_cast<ScriptBrowserWnd *>(this));
getScriptObject()->vcpu_setClassName(L"Browser"); // this is the script class name
getScriptObject()->vcpu_setController(browserController);
myxuihandle = newXuiHandle();
CreateXMLParameters(myxuihandle);
}
void ScriptBrowserWnd::CreateXMLParameters(int master_handle)
{
//SCRIPTBROWSERWND_PARENT::CreateXMLParameters(master_handle);
int numParams = sizeof(params) / sizeof(params[0]);
hintNumberOfParams(myxuihandle, numParams);
for (int i = 0;i < numParams;i++)
addParam(myxuihandle, params[i], XUI_ATTRIBUTE_IMPLIED);
}
ScriptBrowserWnd::~ScriptBrowserWnd()
{
if (WASABI_API_MAKI->maki_getObjectAtom(MAIN_BROWSER_ATOM_NAME) == getScriptObject())
WASABI_API_MAKI->maki_setObjectAtom(MAIN_BROWSER_ATOM_NAME, NULL);
}
int ScriptBrowserWnd::setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value)
{
if (xuihandle != myxuihandle)
return SCRIPTBROWSERWND_PARENT::setXuiParam(xuihandle, xmlattributeid, xmlattributename, value);
switch (xmlattributeid)
{
case BROWSER_SETURL:
setUrl(value);
break;
case BROWSER_SETMAINMB:
setMainMB(WTOI(value));
break;
case BROWSER_SETTARGETNAME:
setTargetName(value);
break;
case BROWSER_SETSCROLLBARS:
setScrollbarsFlag(translateScrollbarFlag(value));
break;
default:
return 0;
}
return 1;
}
int ScriptBrowserWnd::translateScrollbarFlag(const wchar_t *scrollbarflag)
{
if (WCSCASEEQLSAFE(scrollbarflag, L"auto")) return MiniBrowser::BROWSER_SCROLLBARS_AUTO;
if (WCSCASEEQLSAFE(scrollbarflag, L"never")) return MiniBrowser::BROWSER_SCROLLBARS_NEVER;
if (WCSCASEEQLSAFE(scrollbarflag, L"always")) return MiniBrowser::BROWSER_SCROLLBARS_ALWAYS;
if (WCSCASEEQLSAFE(scrollbarflag, L"default")) return MiniBrowser::BROWSER_SCROLLBARS_DEFAULT; // as specified by HTML content
return MiniBrowser::BROWSER_SCROLLBARS_AUTO;
}
void ScriptBrowserWnd::onSetVisible(int v)
{
SCRIPTBROWSERWND_PARENT::onSetVisible(v);
if (v && !defurl.isempty() && _wcsicmp(defurl, getCurrentUrl() ? getCurrentUrl() : L""))
navigateUrl(defurl);
}
void ScriptBrowserWnd::setMainMB(int m)
{
if (m)
WASABI_API_MAKI->maki_setObjectAtom(MAIN_BROWSER_ATOM_NAME, getScriptObject());
else
if (WASABI_API_MAKI->maki_getObjectAtom(MAIN_BROWSER_ATOM_NAME) == getScriptObject())
WASABI_API_MAKI->maki_setObjectAtom(MAIN_BROWSER_ATOM_NAME, NULL);
}
void ScriptBrowserWnd::setUrl(const wchar_t *url)
{
defurl = url;
if (isVisible())
{
if (!defurl.isempty())
navigateUrl(defurl);
}
}
void ScriptBrowserWnd::setCancelIEErrorPage(bool cancel)
{
MiniBrowser *browser = getBrowser();
if (browser) browser->minibrowser_setCancelIEErrorPage(cancel);
}
void ScriptBrowserWnd::Scrape()
{
MiniBrowser *browser = getBrowser();
if (browser) browser->minibrowser_scrape();
}
void ScriptBrowserWnd::getDocumentTitle(wchar_t *str, size_t len)
{
MiniBrowser *browser = getBrowser();
if (browser)
browser->minibrowser_getDocumentTitle(str, len);
else
str[0]=0;
}
int ScriptBrowserWnd::navigateUrl(const wchar_t *url)
{
defurl = url;
return SCRIPTBROWSERWND_PARENT::navigateUrl(url);
}
int ScriptBrowserWnd::onBeforeNavigate(const wchar_t *url, int flags, const wchar_t *frame)
{
if (SCRIPTBROWSERWND_PARENT::onBeforeNavigate(url, flags, frame)) return 1;
scriptVar v = BrowserScriptController::browser_onBeforeNavigate(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_STRING(url), MAKE_SCRIPT_INT(flags), MAKE_SCRIPT_STRING(frame));
if (v.type != SCRIPT_VOID)
return GET_SCRIPT_BOOLEAN(v);
return 0;
}
void ScriptBrowserWnd::onDocumentComplete(const wchar_t *url)
{
SCRIPTBROWSERWND_PARENT::onDocumentComplete(url);
if (url)
BrowserScriptController::browser_onDocumentComplete(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_STRING(url));
}
void ScriptBrowserWnd::onDocumentReady(const wchar_t *url)
{
SCRIPTBROWSERWND_PARENT::onDocumentComplete(url);
if (url)
BrowserScriptController::browser_onDocumentReady(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_STRING(url));
}
void ScriptBrowserWnd::onNavigateError(const wchar_t *url, int status)
{
SCRIPTBROWSERWND_PARENT::onNavigateError(url, status);
BrowserScriptController::browser_onNavigateError(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_STRING(url), MAKE_SCRIPT_INT(status));
}
void ScriptBrowserWnd::onMediaLink(const wchar_t *url)
{
SCRIPTBROWSERWND_PARENT::onMediaLink(url);
if (url)
BrowserScriptController::browser_onMediaLink(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_STRING(url));
}
const wchar_t * ScriptBrowserWnd::messageToMaki(wchar_t* str1, wchar_t* str2, int intval1, int intval2, int intval3)
{
const wchar_t* ret = SCRIPTBROWSERWND_PARENT::messageToMaki(str1, str2, intval1, intval2, intval3);
if (ret) return ret;
scriptVar v = BrowserScriptController::browser_messageToMaki(SCRIPT_CALL, getScriptObject(), MAKE_SCRIPT_STRING(str1), MAKE_SCRIPT_STRING(str2), MAKE_SCRIPT_INT(intval1), MAKE_SCRIPT_INT(intval2), MAKE_SCRIPT_INT(intval3));
if (v.type == SCRIPT_STRING)
return v.data.sdata;
return 0;
}
const wchar_t * ScriptBrowserWnd::messageToJS(const wchar_t* str1, const wchar_t* str2, int i1, int i2, int i3)
{
MiniBrowser *browser = getBrowser();
if (browser) return browser->minibrowser_messageToJS(str1, str2, i1, i2, i3);
return 0;
}
// -----------------------------------------------------------------------
// Script Object
BrowserScriptController _browserController;
BrowserScriptController *browserController = &_browserController;
// -- Functions table -------------------------------------
function_descriptor_struct BrowserScriptController::exportedFunction[] = {
{L"gotoUrl", 1, (void*)BrowserScriptController::browser_navigateUrl },
{L"navigateUrl", 1, (void*)BrowserScriptController::browser_navigateUrl },
{L"back", 0, (void*)BrowserScriptController::browser_back },
{L"forward", 0, (void*)BrowserScriptController::browser_forward },
{L"home", 0, (void*)BrowserScriptController::browser_home},
{L"stop", 0, (void*)BrowserScriptController::browser_stop},
{L"refresh", 0, (void*)BrowserScriptController::browser_refresh},
{L"scrape", 0, (void*)BrowserScriptController::browser_scrape},
{L"setTargetName", 1, (void*)BrowserScriptController::browser_setTargetName},
{L"onBeforeNavigate", 3, (void*)BrowserScriptController::browser_onBeforeNavigate},
{L"onDocumentComplete", 1, (void*)BrowserScriptController::browser_onDocumentComplete},
{L"onDocumentReady", 1, (void*)BrowserScriptController::browser_onDocumentReady},
{L"onNavigateError", 2, (void*)BrowserScriptController::browser_onNavigateError},
{L"onMediaLink", 1, (void*)BrowserScriptController::browser_onMediaLink},
{L"getDocumentTitle", 0, (void*)BrowserScriptController::browser_getDocumentTitle},
{L"setCancelIEErrorPage",1, (void*)BrowserScriptController::browser_setCancelIEErrorPage},
{L"messageToMaki", 5, (void*)BrowserScriptController::browser_messageToMaki},
{L"messageToJS", 5, (void*)BrowserScriptController::browser_messageToJS},
};
ScriptObject *BrowserScriptController::instantiate()
{
ScriptBrowserWnd *sb = new ScriptBrowserWnd;
ASSERT(sb != NULL);
return sb->getScriptObject();
}
void BrowserScriptController::destroy(ScriptObject *o)
{
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd *>(o->vcpu_getInterface(browserGuid));
ASSERT(sb != NULL);
delete sb;
}
void *BrowserScriptController::encapsulate(ScriptObject *o)
{
return NULL; // no encapsulation for browsers yet
}
void BrowserScriptController::deencapsulate(void *o)
{}
int BrowserScriptController::getNumFunctions()
{
return sizeof(exportedFunction) / sizeof(function_descriptor_struct);
}
const function_descriptor_struct *BrowserScriptController::getExportedFunctions()
{
return exportedFunction;
}
scriptVar BrowserScriptController::browser_navigateUrl(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar url)
{
SCRIPT_FUNCTION_INIT
ASSERT(url.type == SCRIPT_STRING);
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->navigateUrl(url.data.sdata);
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_back(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->back();
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_forward(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->forward();
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_home(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->home();
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_refresh(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->refresh();
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_stop(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->stop();
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_scrape(SCRIPT_FUNCTION_PARAMS, ScriptObject *o)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->Scrape();
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_setCancelIEErrorPage(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar cancel)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb) sb->setCancelIEErrorPage(!!cancel.data.idata);
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_setTargetName(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar name)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb)
sb->setTargetName(GET_SCRIPT_STRING(name));
RETURN_SCRIPT_VOID;
}
scriptVar BrowserScriptController::browser_onBeforeNavigate(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar url, scriptVar flags, scriptVar framename)
{
SCRIPT_FUNCTION_INIT
PROCESS_HOOKS3(o, browserController, url, flags, framename);
SCRIPT_FUNCTION_CHECKABORTEVENT;
SCRIPT_EXEC_EVENT3(o, url, flags, framename);
}
scriptVar BrowserScriptController::browser_messageToMaki(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar str1, scriptVar str2, scriptVar i1, scriptVar i2, scriptVar i3)
{
SCRIPT_FUNCTION_INIT
PROCESS_HOOKS5(o, browserController, str1, str2, i1, i2, i3);
SCRIPT_FUNCTION_CHECKABORTEVENT;
SCRIPT_EXEC_EVENT5(o, str1, str2, i1, i2, i3);
}
scriptVar BrowserScriptController::browser_messageToJS(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar str1, scriptVar str2, scriptVar i1, scriptVar i2, scriptVar i3)
{
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
if (sb)
{
const wchar_t * ret = sb->messageToJS(str1.data.sdata, str2.data.sdata, i1.data.idata, i2.data.idata, i3.data.idata);
if (ret)
return MAKE_SCRIPT_STRING(ret);
}
return MAKE_SCRIPT_STRING(L"");
}
scriptVar BrowserScriptController::browser_onDocumentComplete(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar url)
{
SCRIPT_FUNCTION_INIT
PROCESS_HOOKS1(o, browserController, url);
SCRIPT_FUNCTION_CHECKABORTEVENT;
SCRIPT_EXEC_EVENT1(o, url);
}
scriptVar BrowserScriptController::browser_onDocumentReady(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar url)
{
SCRIPT_FUNCTION_INIT
PROCESS_HOOKS1(o, browserController, url);
SCRIPT_FUNCTION_CHECKABORTEVENT;
SCRIPT_EXEC_EVENT1(o, url);
}
scriptVar BrowserScriptController::browser_onNavigateError(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar url, scriptVar status)
{
SCRIPT_FUNCTION_INIT
PROCESS_HOOKS2(o, browserController, url, status);
SCRIPT_FUNCTION_CHECKABORTEVENT;
SCRIPT_EXEC_EVENT2(o, url, status);
}
scriptVar BrowserScriptController::browser_onMediaLink(SCRIPT_FUNCTION_PARAMS, ScriptObject *o, scriptVar url)
{
SCRIPT_FUNCTION_INIT
PROCESS_HOOKS1(o, browserController, url);
SCRIPT_FUNCTION_CHECKABORTEVENT;
SCRIPT_EXEC_EVENT1(o, url);
}
static wchar_t docTitle[1024];
/*string*/ scriptVar BrowserScriptController::browser_getDocumentTitle(SCRIPT_FUNCTION_PARAMS, ScriptObject *o) {
SCRIPT_FUNCTION_INIT
ScriptBrowserWnd *sb = static_cast<ScriptBrowserWnd*>(o->vcpu_getInterface(browserGuid));
docTitle[0]=0;
if (sb) sb->getDocumentTitle(docTitle, 1024);
return MAKE_SCRIPT_STRING(docTitle);
}