Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
a14adc90
V
vscode
项目概览
掘金者说
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a14adc90
编写于
2月 01, 2016
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
some vs/base/browser linting
上级
06c26d8f
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
417 addition
and
418 deletion
+417
-418
src/vs/base/browser/browser.ts
src/vs/base/browser/browser.ts
+29
-28
src/vs/base/browser/browserService.ts
src/vs/base/browser/browserService.ts
+15
-15
src/vs/base/browser/dnd.ts
src/vs/base/browser/dnd.ts
+2
-4
src/vs/base/browser/dom.ts
src/vs/base/browser/dom.ts
+237
-237
src/vs/base/browser/idleMonitor.ts
src/vs/base/browser/idleMonitor.ts
+28
-28
src/vs/base/browser/iframe.ts
src/vs/base/browser/iframe.ts
+17
-17
src/vs/base/browser/touch.ts
src/vs/base/browser/touch.ts
+89
-89
未找到文件。
src/vs/base/browser/browser.ts
浏览文件 @
a14adc90
...
...
@@ -12,13 +12,13 @@ interface ISafeWindow {
}
interface
ISafeDocument
{
URL
:
string
;
createElement
(
tagName
:
'
div
'
):
HTMLDivElement
;
createElement
(
tagName
:
string
):
HTMLElement
;
URL
:
string
;
createElement
(
tagName
:
'
div
'
):
HTMLDivElement
;
createElement
(
tagName
:
string
):
HTMLElement
;
}
interface
INavigator
{
userAgent
:
string
;
userAgent
:
string
;
}
interface
ILocation
{
...
...
@@ -26,18 +26,18 @@ interface ILocation {
}
interface
IGlobalScope
{
window
:
ISafeWindow
;
navigator
:
INavigator
;
parent
:
IGlobalScope
;
document
:
ISafeDocument
;
window
:
ISafeWindow
;
navigator
:
INavigator
;
parent
:
IGlobalScope
;
document
:
ISafeDocument
;
history
:
{
pushState
:
any
pushState
:
any
};
isTest
:
boolean
;
isTest
:
boolean
;
location
:
ILocation
;
}
var
globals
=
<
IGlobalScope
><
any
>
(
typeof
self
===
'
object
'
?
self
:
global
);
const
globals
=
<
IGlobalScope
><
any
>
(
typeof
self
===
'
object
'
?
self
:
global
);
// MAC:
// chrome: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.100 Safari/535.2"
...
...
@@ -53,8 +53,8 @@ var globals = <IGlobalScope><any> (typeof self === 'object' ? self : global);
// chrome: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36"
// firefox: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0"
var
userAgent
=
globals
.
navigator
?
globals
.
navigator
.
userAgent
:
''
;
var
isTest
=
!!
globals
.
isTest
;
const
userAgent
=
globals
.
navigator
?
globals
.
navigator
.
userAgent
:
''
;
const
isTest
=
!!
globals
.
isTest
;
// DOCUMENTED FOR FUTURE REFERENCE:
// When running IE11 in IE10 document mode, the code below will identify the browser as being IE10,
...
...
@@ -77,6 +77,8 @@ export const canUseTranslate3d = !isIE9 && !isFirefox;
export
const
enableEmptySelectionClipboard
=
isWebKit
;
let
_disablePushState
=
false
;
/**
* Returns if the browser supports the history.pushState function or not.
*/
...
...
@@ -84,7 +86,6 @@ export function canPushState() {
return
(
!
_disablePushState
&&
globals
.
history
&&
globals
.
history
.
pushState
);
};
var
_disablePushState
=
false
;
/**
* Helpful when we detect that pushing state does not work for some reason (e.g. FF prevents pushState for security reasons in some cases)
*/
...
...
@@ -104,11 +105,11 @@ export function hasCSSAnimationSupport() {
return
false
;
}
var
supported
=
false
;
var
element
=
globals
.
document
.
createElement
(
'
div
'
);
var
properties
=
[
'
animationName
'
,
'
webkitAnimationName
'
,
'
msAnimationName
'
,
'
MozAnimationName
'
,
'
OAnimationName
'
];
for
(
var
i
=
0
;
i
<
properties
.
length
;
i
++
)
{
var
property
=
properties
[
i
];
let
supported
=
false
;
let
element
=
globals
.
document
.
createElement
(
'
div
'
);
let
properties
=
[
'
animationName
'
,
'
webkitAnimationName
'
,
'
msAnimationName
'
,
'
MozAnimationName
'
,
'
OAnimationName
'
];
for
(
let
i
=
0
;
i
<
properties
.
length
;
i
++
)
{
let
property
=
properties
[
i
];
if
(
!
types
.
isUndefinedOrNull
(
element
.
style
[
property
])
||
element
.
style
.
hasOwnProperty
(
property
))
{
supported
=
true
;
break
;
...
...
@@ -127,14 +128,14 @@ export function hasCSSAnimationSupport() {
/**
* Returns if the browser supports the provided video mime type or not.
*/
export
function
canPlayVideo
(
type
:
string
)
{
export
function
canPlayVideo
(
type
:
string
)
{
if
(
!
globals
.
document
)
{
return
false
;
}
var
video
:
HTMLVideoElement
=
<
HTMLVideoElement
>
globals
.
document
.
createElement
(
'
video
'
);
let
video
:
HTMLVideoElement
=
<
HTMLVideoElement
>
globals
.
document
.
createElement
(
'
video
'
);
if
(
video
.
canPlayType
)
{
var
canPlay
=
video
.
canPlayType
(
type
);
let
canPlay
=
video
.
canPlayType
(
type
);
return
canPlay
===
'
maybe
'
||
canPlay
===
'
probably
'
;
}
...
...
@@ -145,14 +146,14 @@ export function canPlayVideo(type:string) {
/**
* Returns if the browser supports the provided audio mime type or not.
*/
export
function
canPlayAudio
(
type
:
string
)
{
export
function
canPlayAudio
(
type
:
string
)
{
if
(
!
globals
.
document
)
{
return
false
;
}
var
audio
:
HTMLAudioElement
=
<
HTMLAudioElement
>
globals
.
document
.
createElement
(
'
audio
'
);
let
audio
:
HTMLAudioElement
=
<
HTMLAudioElement
>
globals
.
document
.
createElement
(
'
audio
'
);
if
(
audio
.
canPlayType
)
{
var
canPlay
=
audio
.
canPlayType
(
type
);
let
canPlay
=
audio
.
canPlayType
(
type
);
return
canPlay
===
'
maybe
'
||
canPlay
===
'
probably
'
;
}
...
...
@@ -160,11 +161,11 @@ export function canPlayAudio(type:string) {
return
false
;
}
export
function
isInWebWorker
():
boolean
{
return
!
globals
.
document
&&
typeof
((
<
any
>
globals
).
importScripts
)
!==
'
undefined
'
;
export
function
isInWebWorker
():
boolean
{
return
!
globals
.
document
&&
typeof
((
<
any
>
globals
).
importScripts
)
!==
'
undefined
'
;
}
export
function
supportsExecCommand
(
command
:
string
):
boolean
{
export
function
supportsExecCommand
(
command
:
string
):
boolean
{
return
(
(
isIE11orEarlier
||
Platform
.
isNative
)
&&
document
.
queryCommandSupported
(
command
)
...
...
src/vs/base/browser/browserService.ts
浏览文件 @
a14adc90
...
...
@@ -4,27 +4,27 @@
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
Browser
=
require
(
'
vs/base/browser/browser
'
)
;
import
{
isInWebWorker
}
from
'
vs/base/browser/browser
'
;
export
interface
IBrowserServiceData
{
document
:
Document
;
window
:
Window
;
isHTMLElement
:
(
o
:
any
)
=>
boolean
;
document
:
Document
;
window
:
Window
;
isHTMLElement
:
(
o
:
any
)
=>
boolean
;
}
export
interface
IBrowserService
extends
IBrowserServiceData
{
/**
* Mock the DOM with dummy objects
*/
mock
(
source
:
IBrowserServiceData
):
void
;
mock
(
source
:
IBrowserServiceData
):
void
;
/**
* Restore the normal DOM
*/
restore
():
void
;
restore
():
void
;
}
export
function
regularIsHTMLElement
(
o
:
any
):
boolean
{
export
function
regularIsHTMLElement
(
o
:
any
):
boolean
{
if
(
typeof
HTMLElement
===
'
object
'
)
{
return
o
instanceof
HTMLElement
;
}
...
...
@@ -33,23 +33,23 @@ export function regularIsHTMLElement(o:any): boolean {
class
BrowserService
implements
IBrowserService
{
public
document
:
Document
;
public
window
:
Window
;
public
isHTMLElement
:
(
o
:
any
)
=>
boolean
;
public
document
:
Document
;
public
window
:
Window
;
public
isHTMLElement
:
(
o
:
any
)
=>
boolean
;
constructor
()
{
this
.
restore
();
}
public
mock
(
source
:
IBrowserServiceData
):
void
{
public
mock
(
source
:
IBrowserServiceData
):
void
{
this
.
document
=
source
.
document
;
this
.
window
=
source
.
window
;
this
.
isHTMLElement
=
source
.
isHTMLElement
;
}
public
restore
():
void
{
public
restore
():
void
{
this
.
isHTMLElement
=
regularIsHTMLElement
;
if
(
Browser
.
isInWebWorker
())
{
if
(
isInWebWorker
())
{
this
.
document
=
null
;
this
.
window
=
null
;
}
else
{
...
...
@@ -59,8 +59,8 @@ class BrowserService implements IBrowserService {
}
}
var
browserService
=
new
BrowserService
();
const
browserService
=
new
BrowserService
();
export
function
getService
():
IBrowserService
{
export
function
getService
():
IBrowserService
{
return
browserService
;
}
\ No newline at end of file
src/vs/base/browser/dnd.ts
浏览文件 @
a14adc90
...
...
@@ -5,9 +5,7 @@
'
use strict
'
;
import
Builder
=
require
(
'
vs/base/browser/builder
'
);
var
$
=
Builder
.
$
;
import
{
$
}
from
'
vs/base/browser/builder
'
;
/**
* A helper that will execute a provided function when the provided HTMLElement receives
...
...
@@ -17,7 +15,7 @@ export class DelayedDragHandler {
private
timeout
:
number
;
constructor
(
container
:
HTMLElement
,
callback
:
()
=>
void
)
{
constructor
(
container
:
HTMLElement
,
callback
:
()
=>
void
)
{
$
(
container
).
on
(
'
dragover
'
,
()
=>
{
if
(
!
this
.
timeout
)
{
this
.
timeout
=
setTimeout
(()
=>
{
...
...
src/vs/base/browser/dom.ts
浏览文件 @
a14adc90
此差异已折叠。
点击以展开。
src/vs/base/browser/idleMonitor.ts
浏览文件 @
a14adc90
...
...
@@ -5,28 +5,28 @@
'
use strict
'
;
import
DomUtils
=
require
(
'
vs/base/browser/dom
'
);
import
Lifecycle
=
require
(
'
vs/base/common/lifecycle
'
)
;
import
EventEmitter
=
require
(
'
vs/base/common/eventEmitter
'
)
;
import
BrowserService
=
require
(
'
vs/base/browser/browserService
'
)
;
import
{
IDisposable
,
disposeAll
}
from
'
vs/base/common/lifecycle
'
;
import
{
EventEmitter
,
ListenerUnbind
}
from
'
vs/base/common/eventEmitter
'
;
import
{
getService
}
from
'
vs/base/browser/browserService
'
;
export
enum
UserStatus
{
Idle
,
Active
}
export
var
DEFAULT_IDLE_TIME
=
60
*
60
*
1000
;
// 60 minutes
export
const
DEFAULT_IDLE_TIME
=
60
*
60
*
1000
;
// 60 minutes
export
class
IdleMonitor
{
private
toDispose
:
Lifecycle
.
IDisposable
[];
private
lastActiveTime
:
number
;
private
idleCheckTimeout
:
number
;
private
status
:
UserStatus
;
private
eventEmitter
:
EventEmitter
.
EventEmitter
;
private
instance
:
ReferenceCountedIdleMonitor
;
private
idleTime
:
number
;
private
toDispose
:
IDisposable
[];
private
lastActiveTime
:
number
;
private
idleCheckTimeout
:
number
;
private
status
:
UserStatus
;
private
eventEmitter
:
EventEmitter
;
private
instance
:
ReferenceCountedIdleMonitor
;
private
idleTime
:
number
;
constructor
(
idleTime
:
number
=
DEFAULT_IDLE_TIME
)
{
constructor
(
idleTime
:
number
=
DEFAULT_IDLE_TIME
)
{
this
.
instance
=
ReferenceCountedIdleMonitor
.
INSTANCE
;
this
.
instance
.
increment
();
...
...
@@ -36,17 +36,17 @@ export class IdleMonitor {
this
.
idleTime
=
idleTime
;
this
.
toDispose
=
[];
this
.
eventEmitter
=
new
EventEmitter
.
EventEmitter
();
this
.
eventEmitter
=
new
EventEmitter
();
this
.
toDispose
.
push
(
this
.
eventEmitter
);
this
.
toDispose
.
push
({
dispose
:
this
.
instance
.
addListener
(()
=>
this
.
onUserActive
())
});
this
.
toDispose
.
push
({
dispose
:
this
.
instance
.
addListener
(()
=>
this
.
onUserActive
())
});
this
.
onUserActive
();
}
public
addOneTimeActiveListener
(
callback
:
()
=>
void
):
Lifecycle
.
IDisposable
{
public
addOneTimeActiveListener
(
callback
:
()
=>
void
):
IDisposable
{
return
this
.
eventEmitter
.
addOneTimeDisposableListener
(
'
onActive
'
,
callback
);
}
public
addOneTimeIdleListener
(
callback
:
()
=>
void
):
Lifecycle
.
IDisposable
{
public
addOneTimeIdleListener
(
callback
:
()
=>
void
):
IDisposable
{
return
this
.
eventEmitter
.
addOneTimeDisposableListener
(
'
onIdle
'
,
callback
);
}
...
...
@@ -56,7 +56,7 @@ export class IdleMonitor {
public
dispose
():
void
{
this
.
cancelIdleCheck
();
this
.
toDispose
=
Lifecycle
.
disposeAll
(
this
.
toDispose
);
this
.
toDispose
=
disposeAll
(
this
.
toDispose
);
this
.
instance
.
decrement
();
}
...
...
@@ -78,7 +78,7 @@ export class IdleMonitor {
private
scheduleIdleCheck
():
void
{
if
(
this
.
idleCheckTimeout
===
-
1
)
{
var
minimumTimeWhenUserCanBecomeIdle
=
this
.
lastActiveTime
+
this
.
idleTime
;
let
minimumTimeWhenUserCanBecomeIdle
=
this
.
lastActiveTime
+
this
.
idleTime
;
this
.
idleCheckTimeout
=
setTimeout
(()
=>
{
this
.
idleCheckTimeout
=
-
1
;
this
.
checkIfUserIsIdle
();
...
...
@@ -94,7 +94,7 @@ export class IdleMonitor {
}
private
checkIfUserIsIdle
():
void
{
var
actualIdleTime
=
(
new
Date
()).
getTime
()
-
this
.
lastActiveTime
;
let
actualIdleTime
=
(
new
Date
()).
getTime
()
-
this
.
lastActiveTime
;
if
(
actualIdleTime
>=
this
.
idleTime
)
{
this
.
onUserIdle
();
}
else
{
...
...
@@ -105,7 +105,7 @@ export class IdleMonitor {
class
ReferenceCountedObject
{
private
referenceCount
:
number
;
private
referenceCount
:
number
;
constructor
()
{
this
.
referenceCount
=
0
;
...
...
@@ -138,29 +138,29 @@ class ReferenceCountedObject {
class
ReferenceCountedIdleMonitor
extends
ReferenceCountedObject
{
public
static
INSTANCE
:
ReferenceCountedIdleMonitor
=
new
ReferenceCountedIdleMonitor
();
public
static
INSTANCE
:
ReferenceCountedIdleMonitor
=
new
ReferenceCountedIdleMonitor
();
private
toDispose
:
Lifecycle
.
IDisposable
[];
private
eventEmitter
:
EventEmitter
.
EventEmitter
;
private
toDispose
:
IDisposable
[];
private
eventEmitter
:
EventEmitter
;
public
construct
():
void
{
this
.
toDispose
=
[];
this
.
eventEmitter
=
new
EventEmitter
.
EventEmitter
();
this
.
eventEmitter
=
new
EventEmitter
();
this
.
toDispose
.
push
(
this
.
eventEmitter
);
this
.
toDispose
.
push
(
DomUtils
.
addDisposableListener
(
BrowserService
.
getService
().
document
,
'
mousemove
'
,
()
=>
this
.
onUserActive
()));
this
.
toDispose
.
push
(
DomUtils
.
addDisposableListener
(
BrowserService
.
getService
().
document
,
'
keydown
'
,
()
=>
this
.
onUserActive
()));
this
.
toDispose
.
push
(
DomUtils
.
addDisposableListener
(
getService
().
document
,
'
mousemove
'
,
()
=>
this
.
onUserActive
()));
this
.
toDispose
.
push
(
DomUtils
.
addDisposableListener
(
getService
().
document
,
'
keydown
'
,
()
=>
this
.
onUserActive
()));
this
.
onUserActive
();
}
public
dispose
():
void
{
this
.
toDispose
=
Lifecycle
.
disposeAll
(
this
.
toDispose
);
this
.
toDispose
=
disposeAll
(
this
.
toDispose
);
}
private
onUserActive
():
void
{
this
.
eventEmitter
.
emit
(
'
onActive
'
);
}
public
addListener
(
callback
:
()
=>
void
):
EventEmitter
.
ListenerUnbind
{
public
addListener
(
callback
:
()
=>
void
):
ListenerUnbind
{
return
this
.
eventEmitter
.
addListener
(
'
onActive
'
,
callback
);
}
}
\ No newline at end of file
src/vs/base/browser/iframe.ts
浏览文件 @
a14adc90
...
...
@@ -18,18 +18,18 @@ export interface IWindowChainElement {
iframeElement
:
HTMLIFrameElement
;
}
var
hasDifferentOriginAncestorFlag
:
boolean
=
false
;
var
sameOriginWindowChainCache
:
IWindowChainElement
[]
=
null
;
let
hasDifferentOriginAncestorFlag
:
boolean
=
false
;
let
sameOriginWindowChainCache
:
IWindowChainElement
[]
=
null
;
function
getParentWindowIfSameOrigin
(
w
:
Window
):
Window
{
function
getParentWindowIfSameOrigin
(
w
:
Window
):
Window
{
if
(
!
w
.
parent
||
w
.
parent
===
w
)
{
return
null
;
}
// Cannot really tell if we have access to the parent window unless we try to access something in it
try
{
var
location
=
w
.
location
;
var
parentLocation
=
w
.
parent
.
location
;
let
location
=
w
.
location
;
let
parentLocation
=
w
.
parent
.
location
;
if
(
location
.
protocol
!==
parentLocation
.
protocol
||
location
.
hostname
!==
parentLocation
.
hostname
||
location
.
port
!==
parentLocation
.
port
)
{
hasDifferentOriginAncestorFlag
=
true
;
return
null
;
...
...
@@ -42,10 +42,10 @@ function getParentWindowIfSameOrigin(w:Window): Window {
return
w
.
parent
;
}
function
findIframeElementInParentWindow
(
parentWindow
:
Window
,
childWindow
:
Window
):
HTMLIFrameElement
{
var
parentWindowIframes
=
parentWindow
.
document
.
getElementsByTagName
(
'
iframe
'
);
var
iframe
:
HTMLIFrameElement
;
for
(
var
i
=
0
,
len
=
parentWindowIframes
.
length
;
i
<
len
;
i
++
)
{
function
findIframeElementInParentWindow
(
parentWindow
:
Window
,
childWindow
:
Window
):
HTMLIFrameElement
{
let
parentWindowIframes
=
parentWindow
.
document
.
getElementsByTagName
(
'
iframe
'
);
let
iframe
:
HTMLIFrameElement
;
for
(
let
i
=
0
,
len
=
parentWindowIframes
.
length
;
i
<
len
;
i
++
)
{
iframe
=
parentWindowIframes
[
i
];
if
(
iframe
.
contentWindow
===
childWindow
)
{
return
iframe
;
...
...
@@ -62,7 +62,7 @@ function findIframeElementInParentWindow(parentWindow:Window, childWindow:Window
export
function
getSameOriginWindowChain
():
IWindowChainElement
[]
{
if
(
!
sameOriginWindowChainCache
)
{
sameOriginWindowChainCache
=
[];
var
w
=
window
,
parent
:
Window
;
let
w
=
window
,
parent
:
Window
;
do
{
parent
=
getParentWindowIfSameOrigin
(
w
);
if
(
parent
)
{
...
...
@@ -96,7 +96,7 @@ export function hasDifferentOriginAncestor(): boolean {
/**
* Returns the position of `childWindow` relative to `ancestorWindow`
*/
export
function
getPositionOfChildWindowRelativeToAncestorWindow
(
childWindow
:
Window
,
ancestorWindow
:
any
)
{
export
function
getPositionOfChildWindowRelativeToAncestorWindow
(
childWindow
:
Window
,
ancestorWindow
:
any
)
{
if
(
!
ancestorWindow
||
childWindow
===
ancestorWindow
)
{
return
{
...
...
@@ -105,12 +105,12 @@ export function getPositionOfChildWindowRelativeToAncestorWindow(childWindow:Win
};
}
var
top
=
0
,
left
=
0
;
let
top
=
0
,
left
=
0
;
var
windowChain
=
getSameOriginWindowChain
();
let
windowChain
=
getSameOriginWindowChain
();
for
(
var
i
=
0
;
i
<
windowChain
.
length
;
i
++
)
{
var
windowChainEl
=
windowChain
[
i
];
for
(
let
i
=
0
;
i
<
windowChain
.
length
;
i
++
)
{
let
windowChainEl
=
windowChain
[
i
];
if
(
windowChainEl
.
window
===
ancestorWindow
)
{
break
;
...
...
@@ -120,7 +120,7 @@ export function getPositionOfChildWindowRelativeToAncestorWindow(childWindow:Win
break
;
}
var
boundingRect
=
windowChainEl
.
iframeElement
.
getBoundingClientRect
();
let
boundingRect
=
windowChainEl
.
iframeElement
.
getBoundingClientRect
();
top
+=
boundingRect
.
top
;
left
+=
boundingRect
.
left
;
}
...
...
@@ -129,4 +129,4 @@ export function getPositionOfChildWindowRelativeToAncestorWindow(childWindow:Win
top
:
top
,
left
:
left
};
}
\ No newline at end of file
}
\ No newline at end of file
src/vs/base/browser/touch.ts
浏览文件 @
a14adc90
...
...
@@ -4,76 +4,76 @@
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
A
rrays
=
require
(
'
vs/base/common/arrays
'
);
import
Lifecycle
=
require
(
'
vs/base/common/lifecycle
'
)
;
import
a
rrays
=
require
(
'
vs/base/common/arrays
'
);
import
{
IDisposable
,
cAll
}
from
'
vs/base/common/lifecycle
'
;
import
DomUtils
=
require
(
'
vs/base/browser/dom
'
);
export
namespace
EventType
{
export
var
Tap
=
'
-monaco-gesturetap
'
;
export
var
Change
=
'
-monaco-gesturechange
'
;
export
var
Start
=
'
-monaco-gesturestart
'
;
export
var
End
=
'
-monaco-gesturesend
'
;
export
const
Tap
=
'
-monaco-gesturetap
'
;
export
const
Change
=
'
-monaco-gesturechange
'
;
export
const
Start
=
'
-monaco-gesturestart
'
;
export
const
End
=
'
-monaco-gesturesend
'
;
}
interface
TouchData
{
id
:
number
;
initialTarget
:
EventTarget
;
initialTimeStamp
:
number
;
initialPageX
:
number
;
initialPageY
:
number
;
rollingTimestamps
:
number
[];
rollingPageX
:
number
[];
rollingPageY
:
number
[];
id
:
number
;
initialTarget
:
EventTarget
;
initialTimeStamp
:
number
;
initialPageX
:
number
;
initialPageY
:
number
;
rollingTimestamps
:
number
[];
rollingPageX
:
number
[];
rollingPageY
:
number
[];
}
export
interface
GestureEvent
extends
MouseEvent
{
initialTarget
:
EventTarget
;
translationX
:
number
;
translationY
:
number
;
pageX
:
number
;
pageY
:
number
;
initialTarget
:
EventTarget
;
translationX
:
number
;
translationY
:
number
;
pageX
:
number
;
pageY
:
number
;
}
interface
Touch
{
identifier
:
number
;
screenX
:
number
;
screenY
:
number
;
clientX
:
number
;
clientY
:
number
;
pageX
:
number
;
pageY
:
number
;
radiusX
:
number
;
radiusY
:
number
;
rotationAngle
:
number
;
force
:
number
;
target
:
Element
;
identifier
:
number
;
screenX
:
number
;
screenY
:
number
;
clientX
:
number
;
clientY
:
number
;
pageX
:
number
;
pageY
:
number
;
radiusX
:
number
;
radiusY
:
number
;
rotationAngle
:
number
;
force
:
number
;
target
:
Element
;
}
interface
TouchList
{
[
i
:
number
]:
Touch
;
length
:
number
;
item
(
index
:
number
):
Touch
;
identifiedTouch
(
id
:
number
):
Touch
;
[
i
:
number
]:
Touch
;
length
:
number
;
item
(
index
:
number
):
Touch
;
identifiedTouch
(
id
:
number
):
Touch
;
}
interface
TouchEvent
extends
Event
{
touches
:
TouchList
;
targetTouches
:
TouchList
;
changedTouches
:
TouchList
;
touches
:
TouchList
;
targetTouches
:
TouchList
;
changedTouches
:
TouchList
;
}
export
class
Gesture
implements
Lifecycle
.
IDisposable
{
export
class
Gesture
implements
IDisposable
{
private
static
HOLD_DELAY
=
2000
;
private
static
SCROLL_FRICTION
=
-
0.005
;
private
targetElement
:
HTMLElement
;
private
callOnTarget
:
Function
[];
private
handle
:
Lifecycle
.
IDisposable
;
private
targetElement
:
HTMLElement
;
private
callOnTarget
:
Function
[];
private
handle
:
IDisposable
;
private
activeTouches
:
{[
id
:
number
]:
TouchData
;
};
private
activeTouches
:
{
[
id
:
number
]:
TouchData
;
};
constructor
(
target
:
HTMLElement
)
{
constructor
(
target
:
HTMLElement
)
{
this
.
callOnTarget
=
[];
this
.
activeTouches
=
{};
this
.
target
=
target
;
...
...
@@ -88,14 +88,14 @@ export class Gesture implements Lifecycle.IDisposable {
}
}
public
set
target
(
element
:
HTMLElement
)
{
Lifecycle
.
cAll
(
this
.
callOnTarget
);
public
set
target
(
element
:
HTMLElement
)
{
cAll
(
this
.
callOnTarget
);
this
.
activeTouches
=
{};
this
.
targetElement
=
element
;
if
(
!
this
.
targetElement
)
{
if
(
!
this
.
targetElement
)
{
return
;
}
...
...
@@ -104,14 +104,14 @@ export class Gesture implements Lifecycle.IDisposable {
this
.
callOnTarget
.
push
(
DomUtils
.
addListener
(
this
.
targetElement
,
'
touchmove
'
,
(
e
)
=>
this
.
onTouchMove
(
e
)));
}
private
static
newGestureEvent
(
type
:
string
):
GestureEvent
{
var
event
=
<
GestureEvent
>
(
<
any
>
document
.
createEvent
(
'
CustomEvent
'
));
private
static
newGestureEvent
(
type
:
string
):
GestureEvent
{
let
event
=
<
GestureEvent
>
(
<
any
>
document
.
createEvent
(
'
CustomEvent
'
));
event
.
initEvent
(
type
,
false
,
true
);
return
event
;
}
private
onTouchStart
(
e
:
TouchEvent
):
void
{
var
timestamp
=
Date
.
now
();
// use Date.now() because on FF e.timeStamp is not epoch based.
private
onTouchStart
(
e
:
TouchEvent
):
void
{
let
timestamp
=
Date
.
now
();
// use Date.now() because on FF e.timeStamp is not epoch based.
e
.
preventDefault
();
e
.
stopPropagation
();
...
...
@@ -120,8 +120,8 @@ export class Gesture implements Lifecycle.IDisposable {
this
.
handle
=
null
;
}
for
(
var
i
=
0
,
len
=
e
.
targetTouches
.
length
;
i
<
len
;
i
++
)
{
var
touch
=
e
.
targetTouches
.
item
(
i
);
for
(
let
i
=
0
,
len
=
e
.
targetTouches
.
length
;
i
<
len
;
i
++
)
{
let
touch
=
e
.
targetTouches
.
item
(
i
);
this
.
activeTouches
[
touch
.
identifier
]
=
{
id
:
touch
.
identifier
,
...
...
@@ -134,49 +134,49 @@ export class Gesture implements Lifecycle.IDisposable {
rollingPageY
:
[
touch
.
pageY
]
};
var
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Start
);
let
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Start
);
evt
.
pageX
=
touch
.
pageX
;
evt
.
pageY
=
touch
.
pageY
;
this
.
targetElement
.
dispatchEvent
(
evt
);
}
}
private
onTouchEnd
(
e
:
TouchEvent
):
void
{
var
timestamp
=
Date
.
now
();
// use Date.now() because on FF e.timeStamp is not epoch based.
private
onTouchEnd
(
e
:
TouchEvent
):
void
{
let
timestamp
=
Date
.
now
();
// use Date.now() because on FF e.timeStamp is not epoch based.
e
.
preventDefault
();
e
.
stopPropagation
();
var
activeTouchCount
=
Object
.
keys
(
this
.
activeTouches
).
length
;
let
activeTouchCount
=
Object
.
keys
(
this
.
activeTouches
).
length
;
for
(
var
i
=
0
,
len
=
e
.
changedTouches
.
length
;
i
<
len
;
i
++
)
{
for
(
let
i
=
0
,
len
=
e
.
changedTouches
.
length
;
i
<
len
;
i
++
)
{
var
touch
=
e
.
changedTouches
.
item
(
i
);
let
touch
=
e
.
changedTouches
.
item
(
i
);
if
(
!
this
.
activeTouches
.
hasOwnProperty
(
String
(
touch
.
identifier
)))
{
if
(
!
this
.
activeTouches
.
hasOwnProperty
(
String
(
touch
.
identifier
)))
{
console
.
warn
(
'
move of an UNKNOWN touch
'
,
touch
);
continue
;
}
var
data
=
this
.
activeTouches
[
touch
.
identifier
],
let
data
=
this
.
activeTouches
[
touch
.
identifier
],
holdTime
=
Date
.
now
()
-
data
.
initialTimeStamp
;
if
(
holdTime
<
Gesture
.
HOLD_DELAY
&&
Math
.
abs
(
data
.
initialPageX
-
A
rrays
.
tail
(
data
.
rollingPageX
))
<
30
&&
Math
.
abs
(
data
.
initialPageY
-
A
rrays
.
tail
(
data
.
rollingPageY
))
<
30
)
{
if
(
holdTime
<
Gesture
.
HOLD_DELAY
&&
Math
.
abs
(
data
.
initialPageX
-
a
rrays
.
tail
(
data
.
rollingPageX
))
<
30
&&
Math
.
abs
(
data
.
initialPageY
-
a
rrays
.
tail
(
data
.
rollingPageY
))
<
30
)
{
var
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Tap
);
let
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Tap
);
evt
.
initialTarget
=
data
.
initialTarget
;
evt
.
pageX
=
A
rrays
.
tail
(
data
.
rollingPageX
);
evt
.
pageY
=
A
rrays
.
tail
(
data
.
rollingPageY
);
evt
.
pageX
=
a
rrays
.
tail
(
data
.
rollingPageX
);
evt
.
pageY
=
a
rrays
.
tail
(
data
.
rollingPageY
);
this
.
targetElement
.
dispatchEvent
(
evt
);
}
else
if
(
activeTouchCount
===
1
)
{
var
finalX
=
A
rrays
.
tail
(
data
.
rollingPageX
);
var
finalY
=
A
rrays
.
tail
(
data
.
rollingPageY
);
}
else
if
(
activeTouchCount
===
1
)
{
let
finalX
=
a
rrays
.
tail
(
data
.
rollingPageX
);
let
finalY
=
a
rrays
.
tail
(
data
.
rollingPageY
);
var
deltaT
=
A
rrays
.
tail
(
data
.
rollingTimestamps
)
-
data
.
rollingTimestamps
[
0
];
var
deltaX
=
finalX
-
data
.
rollingPageX
[
0
];
var
deltaY
=
finalY
-
data
.
rollingPageY
[
0
];
let
deltaT
=
a
rrays
.
tail
(
data
.
rollingTimestamps
)
-
data
.
rollingTimestamps
[
0
];
let
deltaX
=
finalX
-
data
.
rollingPageX
[
0
];
let
deltaY
=
finalY
-
data
.
rollingPageY
[
0
];
this
.
inertia
(
timestamp
,
// time now
Math
.
abs
(
deltaX
)
/
deltaT
,
// speed
...
...
@@ -193,59 +193,59 @@ export class Gesture implements Lifecycle.IDisposable {
}
}
private
inertia
(
t1
:
number
,
vX
:
number
,
dirX
:
number
,
x
:
number
,
vY
:
number
,
dirY
:
number
,
y
:
number
):
void
{
private
inertia
(
t1
:
number
,
vX
:
number
,
dirX
:
number
,
x
:
number
,
vY
:
number
,
dirY
:
number
,
y
:
number
):
void
{
this
.
handle
=
DomUtils
.
scheduleAtNextAnimationFrame
(()
=>
{
var
now
=
Date
.
now
();
let
now
=
Date
.
now
();
// velocity: old speed + accel_over_time
var
deltaT
=
now
-
t1
,
let
deltaT
=
now
-
t1
,
delta_pos_x
=
0
,
delta_pos_y
=
0
,
stopped
=
true
;
vX
+=
Gesture
.
SCROLL_FRICTION
*
deltaT
;
vY
+=
Gesture
.
SCROLL_FRICTION
*
deltaT
;
if
(
vX
>
0
)
{
if
(
vX
>
0
)
{
stopped
=
false
;
delta_pos_x
=
dirX
*
vX
*
deltaT
;
}
if
(
vY
>
0
)
{
if
(
vY
>
0
)
{
stopped
=
false
;
delta_pos_y
=
dirY
*
vY
*
deltaT
;
}
// dispatch translation event
var
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Change
);
let
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Change
);
evt
.
translationX
=
delta_pos_x
;
evt
.
translationY
=
delta_pos_y
;
this
.
targetElement
.
dispatchEvent
(
evt
);
if
(
!
stopped
)
{
if
(
!
stopped
)
{
this
.
inertia
(
now
,
vX
,
dirX
,
x
+
delta_pos_x
,
vY
,
dirY
,
y
+
delta_pos_y
);
}
});
}
private
onTouchMove
(
e
:
TouchEvent
):
void
{
var
timestamp
=
Date
.
now
();
// use Date.now() because on FF e.timeStamp is not epoch based.
private
onTouchMove
(
e
:
TouchEvent
):
void
{
let
timestamp
=
Date
.
now
();
// use Date.now() because on FF e.timeStamp is not epoch based.
e
.
preventDefault
();
e
.
stopPropagation
();
for
(
var
i
=
0
,
len
=
e
.
changedTouches
.
length
;
i
<
len
;
i
++
)
{
for
(
let
i
=
0
,
len
=
e
.
changedTouches
.
length
;
i
<
len
;
i
++
)
{
var
touch
=
e
.
changedTouches
.
item
(
i
);
let
touch
=
e
.
changedTouches
.
item
(
i
);
if
(
!
this
.
activeTouches
.
hasOwnProperty
(
String
(
touch
.
identifier
)))
{
if
(
!
this
.
activeTouches
.
hasOwnProperty
(
String
(
touch
.
identifier
)))
{
console
.
warn
(
'
end of an UNKNOWN touch
'
,
touch
);
continue
;
}
var
data
=
this
.
activeTouches
[
touch
.
identifier
];
let
data
=
this
.
activeTouches
[
touch
.
identifier
];
var
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Change
);
evt
.
translationX
=
touch
.
pageX
-
A
rrays
.
tail
(
data
.
rollingPageX
);
evt
.
translationY
=
touch
.
pageY
-
A
rrays
.
tail
(
data
.
rollingPageY
);
let
evt
=
Gesture
.
newGestureEvent
(
EventType
.
Change
);
evt
.
translationX
=
touch
.
pageX
-
a
rrays
.
tail
(
data
.
rollingPageX
);
evt
.
translationY
=
touch
.
pageY
-
a
rrays
.
tail
(
data
.
rollingPageY
);
evt
.
pageX
=
touch
.
pageX
;
evt
.
pageY
=
touch
.
pageY
;
this
.
targetElement
.
dispatchEvent
(
evt
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录