void MonkeyBinding::Callback(const ValueList &args, SharedValue result) { SharedKObject event = args.at(0)->ToObject(); if (!event->Get("url")->IsString() || !event->Get("scope")->IsObject() || !event->GetObject("scope")->Get("window")) { throw ValueException::FromString( "ti.Monkey could not find required components of PAGE_LOADED events"); } std::string url = event->GetString("url"); SharedKObject windowObject = event->GetObject("scope")->GetObject("window"); vector<Script*>::iterator iter = scripts.begin(); while (iter != scripts.end()) { Script* script = (*iter++); if (script->Matches(url)) { EvaluateUserScript(event, url, windowObject, script->source); } } }
void MonkeyBinding::EvaluateUserScript( SharedKObject event, std::string& url, SharedKObject windowObject, std::string& scriptSource) { static Logger *logger = Logger::Get("Monkey"); // I got a castle in brooklyn, that's where i dwell // Word, brother. if (!windowObject->Get("eval")->IsMethod()) { logger->Error("Found a window object without an " "eval function (%s) -- aborting", url.c_str()); return; } SharedKObject target = event->GetObject("target"); if (!windowObject->Get(GLOBAL_NS_VARNAME)->IsObject() && !target.isNull() && target->Get("insertAPI")->IsMethod()) { logger->Info("Forcing Titanium API into: %s\n", url.c_str()); target->CallNS("insertAPI", Value::NewObject(windowObject)); } SharedKMethod evalFunction = windowObject->GetMethod("eval"); logger->Info("Loading userscript for %s\n", url.c_str()); try { evalFunction->Call(Value::NewString(scriptSource)); } catch (ValueException &ex) { SharedString ss = ex.DisplayString(); int line = -1; if (ex.GetValue()->IsObject() && ex.GetValue()->ToObject()->Get("line")->IsNumber()) { line = ex.GetValue()->ToObject()->Get("line")->ToInt(); } logger->Error( "Exception generated evaluating user script for %s " "(line %i): %s", url.c_str(), line, ss->c_str()); } }