blob: 12a4d1437600d2fa2d323304f46af77bb33a2db6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in the
// LICENSE file.
#include "webkit/glue/webkitclient_impl.h"
#include "base/message_loop.h"
namespace webkit_glue {
WebKitClientImpl::WebKitClientImpl()
: main_loop_(MessageLoop::current()),
shared_timer_func_(NULL) {
}
WebKit::WebClipboard* WebKitClientImpl::clipboard() {
return &clipboard_;
}
double WebKitClientImpl::currentTime() {
return base::Time::Now().ToDoubleT();
}
// HACK to see if this code impacts the intl1 page cycler
#if defined(OS_WIN)
class SharedTimerTask;
// We maintain a single active timer and a single active task for
// setting timers directly on the platform.
static SharedTimerTask* shared_timer_task;
static void (*shared_timer_function)();
// Timer task to run in the chrome message loop.
class SharedTimerTask : public Task {
public:
SharedTimerTask(void (*callback)()) : callback_(callback) {}
virtual void Run() {
if (!callback_)
return;
// Since we only have one task running at a time, verify 'this' is it
DCHECK(shared_timer_task == this);
shared_timer_task = NULL;
callback_();
}
void Cancel() {
callback_ = NULL;
}
private:
void (*callback_)();
DISALLOW_COPY_AND_ASSIGN(SharedTimerTask);
};
void WebKitClientImpl::setSharedTimerFiredFunction(void (*func)()) {
shared_timer_function = func;
}
void WebKitClientImpl::setSharedTimerFireTime(double fire_time) {
DCHECK(shared_timer_function);
int interval = static_cast<int>((fire_time - currentTime()) * 1000);
if (interval < 0)
interval = 0;
stopSharedTimer();
// Verify that we didn't leak the task or timer objects.
DCHECK(shared_timer_task == NULL);
shared_timer_task = new SharedTimerTask(shared_timer_function);
MessageLoop::current()->PostDelayedTask(FROM_HERE, shared_timer_task,
interval);
}
void WebKitClientImpl::stopSharedTimer() {
if (!shared_timer_task)
return;
shared_timer_task->Cancel();
shared_timer_task = NULL;
}
#else
void WebKitClientImpl::setSharedTimerFiredFunction(void (*func)()) {
shared_timer_func_ = func;
}
void WebKitClientImpl::setSharedTimerFireTime(double fire_time) {
int interval = static_cast<int>((fire_time - currentTime()) * 1000);
if (interval < 0)
interval = 0;
shared_timer_.Stop();
shared_timer_.Start(base::TimeDelta::FromMilliseconds(interval), this,
&WebKitClientImpl::DoTimeout);
}
void WebKitClientImpl::stopSharedTimer() {
shared_timer_.Stop();
}
#endif
void WebKitClientImpl::callOnMainThread(void (*func)()) {
main_loop_->PostTask(FROM_HERE, NewRunnableFunction(func));
}
} // namespace webkit_glue
|