# TODO(zhaoqin): File bugs for those failing browser tests.

# Dr.Memory i#1052: http://code.google.com/p/drmemory/issues/detail?id=1052
#
# The list is too long for gtest_filter, so we exclude the whole
# test case if any of its tests failed.
*FLAKY*

# it takes too long to run all browser_tests with Dr.Memory,
# and we only select subset to run
# A*
Act*
Ad*
All*
AppA*
AppB*
AppL*
AppW*
Auto*
# B*
BaseD*
Bac*App*.R*
Blue*
Bit*
Bo*sT*
Br*erA*
Br*erC*
Br*erN*
Br*erT*
# C*
Cal*
Cap*
Cas*
Clou*cy
Clear*
Click*
Com*
ChromeA*
ChromeC*
ChromeR*
Col*
Con*UITest.*
Con*.Re*
Con*Se*
Cont*ns
Context*
Coo*
# D*
Dia*E*
Dec*
Dev*
Dns*
DoNot*
Down*Ext*
Down*UI*
Do*adTest.*
Do*tTest.*All
Drive*
# E*
ECK*
Ed*
Enc*
Ep*
Er*
Exe*
Ext*.D*
Ext*.P*
Ext*.N*
Ext*.RS*
Ext*Api*
Ext*Man*
Ext*Se*
Ext*re*
Ext*Re*
Ext*nB*
Ext*Crx*
# F*
FileSys*
Find*
Fl*
Font*gs
Ftp*
# G*
GcdPri*.*Remove
GcdPri*.*Query
Gcm*.R*
GetA*
Ge*Br*
# H*
Hot*
His*
HostR*
Ht*
# I*
IE*
Ide*
Inv*
# J*
# K*
# L*
Lan*
Lau*
Laz*
LoadT*
Loc*
Log*hs
# M*
MDn*
Med*B*
Med*Se*
Med*Ge*
Mock*
MSC_C*
MSE*
Man*t.*
# N*
NaCl*lib*
NaCl*Pn*
NetIn*
Noti*
NoSe*
# O*
Opt*WebUI*
Out*PPAPITe*
# P*
Pag*
Pas*erBro*
Pe*
Plat*Bro*
Policy*H*
Port*
Prefe*
PrefsF*
Print*
Prox*
Prof*ta
Prof*t
Prer*
PPA*ib*
PPA*lT*.*
PPAPIT*.F*
PPAPIT*.W*
PPAPIT*.U*3
# Q*
# R*
Red*
Ref*
Reg*
Rem*De*
Rem*Ad*
Res*
# S*
Sa*
Sea*Pr*
Ses*
Set*
Scr*
Soc*
Spe*
SRC*.Pl*
SRC*.Fr*
SSL*ed
Sup*Mo*
Str*
SyncF*
SyncInt*
Sys*Di*
Sys*In*
Sys*Ne*
# T*
Tab*
Tas*
Tran*Bu*
Tran*Up*
Tran*ag
# U*
Us*
Un*.Br*
# V*
# W*
WebViewT*
WebRtcB*
WebUIA*
WebUIBr*
WebC*
WebN*ss
WebN*.S*
WebstoreIn*
WebstoreSt*
WebSo*
Win*.Cl*
# X*
# Y*
# Z*
