JSDOMWindowBase::JSDOMWindowBase(NonNullPassRefPtr<Structure> structure, PassRefPtr<DOMWindow> window, JSDOMWindowShell* shell) : JSDOMGlobalObject(structure, new JSDOMWindowBaseData(window, shell), shell) { GlobalPropertyInfo staticGlobals[] = { GlobalPropertyInfo(Identifier(globalExec(), "document"), jsNull(), DontDelete | ReadOnly), GlobalPropertyInfo(Identifier(globalExec(), "window"), d()->shell, DontDelete | ReadOnly) }; addStaticGlobals(staticGlobals, sizeof(staticGlobals) / sizeof(GlobalPropertyInfo)); }
void JSDOMWindowBase::finishCreation(JSGlobalData& globalData, JSDOMWindowShell* shell) { Base::finishCreation(globalData, shell); ASSERT(inherits(&s_info)); GlobalPropertyInfo staticGlobals[] = { GlobalPropertyInfo(Identifier(globalExec(), "document"), jsNull(), DontDelete | ReadOnly), GlobalPropertyInfo(Identifier(globalExec(), "window"), m_shell, DontDelete | ReadOnly) }; addStaticGlobals(staticGlobals, WTF_ARRAY_LENGTH(staticGlobals)); }
JSDOMWindowBase::JSDOMWindowBase(PassRefPtr<Structure> structure, PassRefPtr<DOMWindow> window, JSDOMWindowShell* shell) : JSDOMGlobalObject(structure, new JSDOMWindowBaseData(window, shell), shell) { // Time in milliseconds before the script timeout handler kicks in. setTimeoutTime(10000); GlobalPropertyInfo staticGlobals[] = { GlobalPropertyInfo(Identifier(globalExec(), "document"), jsNull(), DontDelete | ReadOnly), GlobalPropertyInfo(Identifier(globalExec(), "window"), d()->shell, DontDelete | ReadOnly) }; addStaticGlobals(staticGlobals, sizeof(staticGlobals) / sizeof(GlobalPropertyInfo)); }
JSDOMWindowBase::JSDOMWindowBase(JSGlobalData& globalData, Structure* structure, PassRefPtr<DOMWindow> window, JSDOMWindowShell* shell) : JSDOMGlobalObject(globalData, structure, shell->world(), shell) , m_impl(window) , m_shell(shell) { ASSERT(inherits(&s_info)); GlobalPropertyInfo staticGlobals[] = { GlobalPropertyInfo(Identifier(globalExec(), "document"), jsNull(), DontDelete | ReadOnly), GlobalPropertyInfo(Identifier(globalExec(), "window"), m_shell, DontDelete | ReadOnly) }; addStaticGlobals(staticGlobals, WTF_ARRAY_LENGTH(staticGlobals)); }
JSGlobalObject::~JSGlobalObject() { ASSERT(JSLock::currentThreadIsHoldingLock()); if (d()->debugger) d()->debugger->detach(this); Profiler** profiler = Profiler::enabledProfilerReference(); if (UNLIKELY(*profiler != 0)) { (*profiler)->stopProfiling(globalExec(), UString()); } d()->next->d()->prev = d()->prev; d()->prev->d()->next = d()->next; JSGlobalObject*& headObject = head(); if (headObject == this) headObject = d()->next; if (headObject == this) headObject = 0; HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end(); for (HashSet<ProgramCodeBlock*>::const_iterator it = codeBlocks().begin(); it != end; ++it) (*it)->clearGlobalObject(); RegisterFile& registerFile = globalData()->interpreter->registerFile(); if (registerFile.globalObject() == this) { registerFile.setGlobalObject(0); registerFile.setNumGlobals(0); } delete d(); }
void JSDOMWindowBase::clear() { JSLock lock(false); if (d()->returnValueSlot && !*d()->returnValueSlot) *d()->returnValueSlot = getDirect(Identifier(globalExec(), "returnValue")); clearHelperObjectProperties(); }
void JSDOMWindowBase::updateDocument() { ASSERT(m_impl->document()); ExecState* exec = globalExec(); symbolTablePutWithAttributes(exec->globalData(), Identifier(exec, "document"), toJS(exec, this, m_impl->document()), DontDelete | ReadOnly); }
void JSDOMWindowBase::updateDocument() { ASSERT(m_wrapped->document()); ExecState* exec = globalExec(); symbolTablePutWithAttributesTouchWatchpointSet(this, exec, exec->vm().propertyNames->document, toJS(exec, this, m_wrapped->document()), DontDelete | ReadOnly); }
Completion Interpreter::evaluate(const UString& sourceURL, int startingLineNumber, const UChar* code, int codeLength, JSValue* thisV) { JSLock lock; // prevent against infinite recursion if (m_recursion >= 20) return Completion(Throw, Error::create(&m_globalExec, GeneralError, "Recursion too deep")); // parse the source code int sid; int errLine; UString errMsg; RefPtr<ProgramNode> progNode = Parser::parse(sourceURL, startingLineNumber, code, codeLength, &sid, &errLine, &errMsg); // notify debugger that source has been parsed if (m_debugger) { bool cont = m_debugger->sourceParsed(&m_globalExec, sid, sourceURL, UString(code, codeLength), startingLineNumber, errLine, errMsg); if (!cont) return Completion(Break); } // no program node means a syntax error occurred if (!progNode) return Completion(Throw, Error::create(&m_globalExec, SyntaxError, errMsg, errLine, sid, sourceURL)); m_globalExec.clearException(); m_recursion++; JSObject* globalObj = m_globalObject; JSObject* thisObj = globalObj; // "this" must be an object... use same rules as Function.prototype.apply() if (thisV && !thisV->isUndefinedOrNull()) thisObj = thisV->toObject(&m_globalExec); Completion res; if (m_globalExec.hadException()) // the thisV->toObject() conversion above might have thrown an exception - if so, propagate it res = Completion(Throw, m_globalExec.exception()); else { // execute the code Context ctx(globalObj, this, thisObj, progNode.get()); ExecState newExec(this, &ctx); ctx.setExecState(&newExec); progNode->processVarDecls(&newExec); res = progNode->execute(&newExec); } m_recursion--; if (shouldPrintExceptions() && res.complType() == Throw) { JSLock lock; ExecState* exec = globalExec(); CString f = sourceURL.UTF8String(); CString message = res.value()->toObject(exec)->toString(exec).UTF8String(); int line = res.value()->toObject(exec)->get(exec, "line")->toUInt32(exec); #if PLATFORM(WIN_OS) printf("%s line %d: %s\n", f.c_str(), line, message.c_str()); #else printf("[%d] %s line %d: %s\n", getpid(), f.c_str(), line, message.c_str()); #endif } return res; }