4a4104a50dd25d2db611a243045f612b5a330ab3
[WebKit-https.git] / WebCore / bindings / js / ScheduledAction.cpp
1 /*
2  *  Copyright (C) 2000 Harri Porten (porten@kde.org)
3  *  Copyright (C) 2006 Jon Shier (jshier@iastate.edu)
4  *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reseved.
5  *  Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Lesser General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public
18  *  License along with this library; if not, write to the Free Software
19  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
20  *  USA
21  */
22
23 #include "config.h"
24 #include "ScheduledAction.h"
25
26 #include "CString.h"
27 #include "Console.h"
28 #include "DOMWindow.h"
29 #include "Document.h"
30 #include "Frame.h"
31 #include "FrameLoader.h"
32 #include "JSDOMWindow.h"
33 #include "ScriptController.h"
34 #include <kjs/JSLock.h>
35
36 using namespace KJS;
37
38 namespace WebCore {
39
40 ScheduledAction::ScheduledAction(JSValue* function, const ArgList& args)
41     : m_function(function)
42 {
43     ArgList::const_iterator end = args.end();
44     for (ArgList::const_iterator it = args.begin(); it != end; ++it)
45         m_args.append((*it).jsValue());
46 }
47
48
49 void ScheduledAction::execute(JSDOMWindowShell* windowShell)
50 {
51     RefPtr<Frame> frame = windowShell->window()->impl()->frame();
52     if (!frame)
53         return;
54
55     if (!frame->script()->isEnabled())
56         return;
57
58     frame->script()->setProcessingTimerCallback(true);
59
60     JSLock lock(false);
61
62     if (m_function) {
63         CallData callData;
64         CallType callType = m_function->getCallData(callData);
65         if (callType != CallTypeNone) {
66             JSDOMWindow* window = windowShell->window();
67             ExecState* exec = window->globalExec();
68
69             ArgList args;
70             size_t size = m_args.size();
71             for (size_t i = 0; i < size; ++i)
72                 args.append(m_args[i]);
73
74             window->startTimeoutCheck();
75             call(exec, m_function, callType, callData, windowShell, args);
76             window->stopTimeoutCheck();
77             if (exec->hadException())
78                 frame->domWindow()->console()->reportCurrentException(exec);
79         }
80     } else
81         frame->loader()->executeScript(m_code);
82
83     // Update our document's rendering following the execution of the timeout callback.
84     // FIXME: Why not use updateDocumentsRendering to update rendering of all documents?
85     // FIXME: Is this really the right point to do the update? We need a place that works
86     // for all possible entry points that might possibly execute script, but this seems
87     // to be a bit too low-level.
88     if (Document* document = frame->document())
89         document->updateRendering();
90
91     frame->script()->setProcessingTimerCallback(false);
92 }
93
94 } // namespace WebCore