This commit is contained in:
Tim Taubert 2012-02-04 11:28:09 +01:00
Родитель f318a0e25c 502f2d2b69
Коммит d7ecd7fbae
20 изменённых файлов: 154 добавлений и 88 удалений

Просмотреть файл

@ -1766,6 +1766,23 @@ function delayedStartup(isLoadingBlank, mustLoadSidebar) {
document.getElementById("appmenu_charsetMenu").hidden = true;
#endif
let appMenuButton = document.getElementById("appmenu-button");
let appMenuPopup = document.getElementById("appmenu-popup");
if (appMenuButton && appMenuPopup) {
let appMenuOpening = null;
appMenuButton.addEventListener("mousedown", function(event) {
if (event.button == 0)
appMenuOpening = new Date();
}, false);
appMenuPopup.addEventListener("popupshown", function(event) {
if (event.target != appMenuPopup || !appMenuOpening)
return;
let duration = new Date() - appMenuOpening;
appMenuOpening = null;
Services.telemetry.getHistogramById("FX_APP_MENU_OPEN_MS").add(duration);
}, false);
}
window.addEventListener("mousemove", MousePosTracker, false);
window.addEventListener("dragover", MousePosTracker, false);
@ -8159,11 +8176,13 @@ var gIdentityHandler = {
this._identityPopup.hidePopup();
},
_popupOpenTime : null,
/**
* Click handler for the identity-box element in primary chrome.
*/
handleIdentityButtonEvent : function(event) {
this._popupOpenTime = new Date();
event.stopPropagation();
if ((event.type == "click" && event.button != 0) ||
@ -8200,6 +8219,17 @@ var gIdentityHandler = {
this._identityPopup.openPopup(this._identityBox, "bottomcenter topleft");
},
onPopupShown : function(event) {
let openingDuration = new Date() - this._popupOpenTime;
this._popupOpenTime = null;
try {
Services.telemetry.getHistogramById("FX_IDENTITY_POPUP_OPEN_MS").add(openingDuration);
} catch (ex) {
Components.utils.reportError("Unable to report telemetry for FX_IDENTITY_POPUP_OPEN_MS.");
}
document.getElementById('identity-popup-more-info-button').focus();
},
onDragStart: function (event) {
if (gURLBar.getAttribute("pageproxystate") != "valid")
return;

Просмотреть файл

@ -304,7 +304,7 @@
type="arrow"
hidden="true"
noautofocus="true"
onpopupshown="document.getElementById('identity-popup-more-info-button').focus();"
onpopupshown="gIdentityHandler.onPopupShown(event);"
level="top">
<hbox id="identity-popup-container" align="top">
<image id="identity-popup-icon"/>

Просмотреть файл

@ -45,3 +45,6 @@ const THUMB_HEIGHT = 127;
#include dropTargetShim.js
#include dropPreview.js
#include updater.js
// Everything is loaded. Initialize the New Tab Page.
gPage.init("#toolbar", "#grid");

Просмотреть файл

@ -33,10 +33,8 @@
<li class="cell"/><li class="cell"/><li class="cell"/>
</ul>
<xul:script type="text/javascript;version=1.8" src="chrome://browser/content/newtab/newTab.js"/>
<xul:script type="text/javascript;version=1.8">
gPage.init("#toolbar", "#grid");
</xul:script>
<xul:script type="text/javascript;version=1.8"
src="chrome://browser/content/newtab/newTab.js"/>
</body>
</xul:vbox>
</xul:window>

Просмотреть файл

@ -1856,7 +1856,7 @@ GroupItem.prototype = Utils.extend(new Item(), new Subscribable(), {
UI.setActive(this, { dontSetActiveTabInGroup: true });
let dontZoomIn = !!(options && options.dontZoomIn);
return gBrowser.loadOneTab(url || "about:blank", { inBackground: dontZoomIn });
return gBrowser.loadOneTab(url || gWindow.BROWSER_NEW_TAB_URL, { inBackground: dontZoomIn });
},
// ----------

Просмотреть файл

@ -792,6 +792,7 @@ let events = [
'mouseout',
'mousemove',
'click',
'dblclick',
'resize',
'change',
'blur',

Просмотреть файл

@ -30,16 +30,12 @@ function test1() {
closeGroupItem(groupItems[1], finish);
});
// first click
mouseClick(contentElement, 0);
// second click
mouseClick(contentElement, 0);
// double click
doubleClick(contentElement, 0);
}
function mouseClick(targetElement, buttonCode) {
function doubleClick(targetElement, buttonCode) {
EventUtils.sendMouseEvent(
{ type: "mousedown", button: buttonCode }, targetElement, contentWindow);
EventUtils.sendMouseEvent(
{ type: "mouseup", button: buttonCode }, targetElement, contentWindow);
{ type: "dblclick", button: buttonCode }, targetElement, contentWindow);
}

Просмотреть файл

@ -80,7 +80,7 @@ function finishTest() {
"The total number of tab items is 1 after leaving the page");
let location = gBrowser.browsers[0].currentURI.spec;
is(location, "about:blank", "The open tab is the expected one");
is(location, BROWSER_NEW_TAB_URL, "The open tab is the expected one");
isnot(contentWindow.GroupItems.getActiveGroupItem(), activeGroup,
"Active group is no longer the same");

Просмотреть файл

@ -79,8 +79,7 @@ function test() {
let height = cw.innerHeight;
let body = cw.document.body;
EventUtils.synthesizeMouse(body, width - 10, height - 10, {}, cw);
EventUtils.synthesizeMouse(body, width - 10, height - 10, {}, cw);
EventUtils.synthesizeMouse(body, width - 10, height - 10, { clickCount: 2 }, cw);
whenTabViewIsHidden(function () {
assertNumberOfTabs(2);

Просмотреть файл

@ -34,14 +34,7 @@ function onTabViewWindowLoaded(win) {
is(secondGroup.getBounds().top - firstGroup.getBounds().bottom, 40,
"There's currently 40 px between the first group and second group");
// set double click interval to negative so quick drag and drop doesn't
// trigger the double click code.
let origDBlClickInterval = contentWindow.UI.DBLCLICK_INTERVAL;
contentWindow.UI.DBLCLICK_INTERVAL = -1;
let endGame = function() {
contentWindow.UI.DBLCLICK_INTERVAL = origDBlClickInterval;
firstGroup.container.parentNode.removeChild(firstGroup.container);
firstGroup.close();
thirdGroup.container.parentNode.removeChild(thirdGroup.container);

Просмотреть файл

@ -51,16 +51,6 @@ let Keys = { meta: false };
// Class: UI
// Singleton top-level UI manager.
let UI = {
// Constant: DBLCLICK_INTERVAL
// Defines the maximum time (in ms) between two clicks for it to count as
// a double click.
DBLCLICK_INTERVAL: 500,
// Constant: DBLCLICK_OFFSET
// Defines the maximum offset (in pixels) between two clicks for it to count as
// a double click.
DBLCLICK_OFFSET: 5,
// Variable: _frameInitialized
// True if the Tab View UI frame has been initialized.
_frameInitialized: false,
@ -100,11 +90,6 @@ let UI = {
// Used to facilitate zooming down from a previous tab.
_currentTab: null,
// Variable: _lastClick
// Keeps track of the time of last click event to detect double click.
// Used to create tabs on double-click since we cannot attach 'dblclick'
_lastClick: 0,
// Variable: _eventListeners
// Keeps track of event listeners added to the AllTabs object.
_eventListeners: {},
@ -212,40 +197,28 @@ let UI = {
element.blur();
});
}
if (e.originalTarget.id == "content") {
if (!Utils.isLeftClick(e)) {
self._lastClick = 0;
self._lastClickPositions = null;
} else {
// Create a group with one tab on double click
if (Date.now() - self._lastClick <= self.DBLCLICK_INTERVAL &&
(self._lastClickPositions.x - self.DBLCLICK_OFFSET) <= e.clientX &&
(self._lastClickPositions.x + self.DBLCLICK_OFFSET) >= e.clientX &&
(self._lastClickPositions.y - self.DBLCLICK_OFFSET) <= e.clientY &&
(self._lastClickPositions.y + self.DBLCLICK_OFFSET) >= e.clientY) {
let box =
new Rect(e.clientX - Math.floor(TabItems.tabWidth/2),
e.clientY - Math.floor(TabItems.tabHeight/2),
TabItems.tabWidth, TabItems.tabHeight);
box.inset(-30, -30);
let opts = {immediately: true, bounds: box};
let groupItem = new GroupItem([], opts);
groupItem.newTab();
self._lastClick = 0;
self._lastClickPositions = null;
gTabView.firstUseExperienced = true;
} else {
self._lastClick = Date.now();
self._lastClickPositions = new Point(e.clientX, e.clientY);
self._createGroupItemOnDrag(e);
}
}
if (e.originalTarget.id == "content" &&
Utils.isLeftClick(e) &&
e.detail == 1) {
self._createGroupItemOnDrag(e);
}
});
iQ(gTabViewFrame.contentDocument).dblclick(function(e) {
// Create a group with one tab on double click
let box =
new Rect(e.clientX - Math.floor(TabItems.tabWidth/2),
e.clientY - Math.floor(TabItems.tabHeight/2),
TabItems.tabWidth, TabItems.tabHeight);
box.inset(-30, -30);
let opts = {immediately: true, bounds: box};
let groupItem = new GroupItem([], opts);
groupItem.newTab();
gTabView.firstUseExperienced = true;
});
iQ(window).bind("unload", function() {
self.uninit();
});

Просмотреть файл

@ -77,6 +77,7 @@ let PageThumbs = {
* @return The newly created canvas containing the image data.
*/
capture: function PageThumbs_capture(aWindow) {
let telemetryCaptureTime = new Date();
let [sw, sh, scale] = this._determineCropSize(aWindow);
let canvas = this._createCanvas();
@ -93,6 +94,9 @@ let PageThumbs = {
// We couldn't draw to the canvas for some reason.
}
Services.telemetry.getHistogramById("FX_THUMBNAILS_CAPTURE_TIME_MS")
.add(new Date() - telemetryCaptureTime);
return canvas;
},
@ -105,13 +109,20 @@ let PageThumbs = {
* stored (optional).
*/
store: function PageThumbs_store(aKey, aCanvas, aCallback) {
let self = this;
let telemetryStoreTime = new Date();
function finish(aSuccessful) {
if (aSuccessful) {
Services.telemetry.getHistogramById("FX_THUMBNAILS_STORE_TIME_MS")
.add(new Date() - telemetryStoreTime);
}
if (aCallback)
aCallback(aSuccessful);
}
let self = this;
// Get a writeable cache entry.
PageThumbsCache.getWriteEntry(aKey, function (aEntry) {
if (!aEntry) {

Просмотреть файл

@ -129,12 +129,18 @@ Channel.prototype = {
// Try to read the data from the thumbnail cache.
this._readCache(function (aData) {
let telemetryThumbnailFound = true;
// Update response if there's no data.
if (!aData) {
this._responseStatus = 404;
this._responseText = "Not Found";
telemetryThumbnailFound = false;
}
Services.telemetry.getHistogramById("FX_THUMBNAILS_HIT_OR_MISS")
.add(telemetryThumbnailFound);
this._startRequest();
if (!this.canceled) {

Просмотреть файл

@ -49,6 +49,7 @@
#include "nsContentUtils.h"
#include "nsJSUtils.h"
#include "nsMathUtils.h"
#include "nsStreamUtils.h"
#include "mozilla/Preferences.h"
#include "mozilla/Telemetry.h"
@ -235,7 +236,15 @@ nsHTMLCanvasElement::MozFetchAsStream(nsIInputStreamCallback *aCallback,
nsCOMPtr<nsIAsyncInputStream> asyncData = do_QueryInterface(inputData, &rv);
NS_ENSURE_SUCCESS(rv, rv);
return aCallback->OnInputStreamReady(asyncData);
nsCOMPtr<nsIThread> mainThread;
rv = NS_GetMainThread(getter_AddRefs(mainThread));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIInputStreamCallback> asyncCallback;
rv = NS_NewInputStreamReadyEvent(getter_AddRefs(asyncCallback), aCallback, mainThread);
NS_ENSURE_SUCCESS(rv, rv);
return asyncCallback->OnInputStreamReady(asyncData);
}
nsresult

Просмотреть файл

@ -310,9 +310,18 @@ HISTOGRAM(THUNDERBIRD_INDEXING_RATE_MSG_PER_S, 1, 100, 20, LINEAR, "Gloda: index
*/
// Disable this application-specific #ifdef ftb. (See bug 710562)
// #ifdef MOZ_PHOENIX
HISTOGRAM(FX_TAB_ANIM_OPEN_MS, 1, 3000, 10, EXPONENTIAL, "Firefox: Time taken by the tab opening animation")
HISTOGRAM(FX_TAB_ANIM_CLOSE_MS, 1, 3000, 10, EXPONENTIAL, "Firefox: Time taken by the tab closing animation")
HISTOGRAM(FX_TAB_ANIM_OPEN_MS, 1, 3000, 10, EXPONENTIAL, "Firefox: Time taken by the tab opening animation in milliseconds")
HISTOGRAM(FX_TAB_ANIM_CLOSE_MS, 1, 3000, 10, EXPONENTIAL, "Firefox: Time taken by the tab closing animation in milliseconds")
HISTOGRAM_BOOLEAN(FX_CONTEXT_SEARCH_AND_TAB_SELECT, "Firefox: Background tab was selected within 5 seconds of searching from the context menu")
HISTOGRAM(FX_IDENTITY_POPUP_OPEN_MS, 1, 1000, 10, EXPONENTIAL, "Firefox: Time taken by the identity popup to open in milliseconds")
HISTOGRAM(FX_APP_MENU_OPEN_MS, 1, 1000, 10, EXPONENTIAL, "Firefox: Time taken by the app-menu opening in milliseconds")
/**
* Thumbnail Service telemetry.
*/
HISTOGRAM(FX_THUMBNAILS_CAPTURE_TIME_MS, 1, 500, 15, EXPONENTIAL, "THUMBNAILS: Time (ms) it takes to capture a thumbnail")
HISTOGRAM(FX_THUMBNAILS_STORE_TIME_MS, 1, 500, 15, EXPONENTIAL, "THUMBNAILS: Time (ms) it takes to store a thumbnail in the cache")
HISTOGRAM(FX_THUMBNAILS_HIT_OR_MISS, 0, 1, 2, BOOLEAN, "THUMBNAILS: Thumbnail found")
// #endif
HISTOGRAM_BOOLEAN(INNERWINDOWS_WITH_MUTATION_LISTENERS, "Deleted or to-be-reused innerwindow which has had mutation event listeners.")

Просмотреть файл

@ -58,6 +58,7 @@ _TEST_FILES = \
test_videocontrols.html \
test_videocontrols_video_direction.html \
test_videocontrols_audio_direction.html \
test_audiocontrols_dimensions.html \
videocontrols_direction-1-ref.html \
videocontrols_direction-1a.html \
videocontrols_direction-1b.html \

Просмотреть файл

@ -0,0 +1,36 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Audio controls test</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content">
<audio id="audio" src="audio.wav" controls preload="auto"></audio>
</div>
<pre id="test">
<script type="text/javascript" src="use_large_cache.js"></script>
<script class="testbody" type="text/javascript">
function loadedmetadata(event) {
is(event.type, "loadedmetadata", "checking event type");
is(audio.clientHeight, "28", "checking height of audio element");
SimpleTest.finish();
}
var audio = document.getElementById("audio"), video;
// Kick off test once audio has loaded.
audio.addEventListener("loadedmetadata", loadedmetadata, false);
SimpleTest.waitForExplicitFinish();
</script>
</pre>
</body>
</html>

Просмотреть файл

@ -1308,7 +1308,8 @@
// (Note: the |controls| attribute is already handled via layout/style/html.css)
var shouldShow = (!(this.video.autoplay && this.video.mozAutoplayEnabled) || !this.dynamicControls);
// Hide the overlay if the video time is non-zero or if an error occurred to workaround bug 718107.
this.startFade(this.clickToPlay, shouldShow && this.video.currentTime == 0 && !this.hasError(), true);
this.startFade(this.clickToPlay, shouldShow && !this.isAudioOnly &&
this.video.currentTime == 0 && !this.hasError(), true);
this.startFade(this.controlBar, shouldShow, true);
// Use the handleEvent() callback for all media events.

Просмотреть файл

@ -70,30 +70,30 @@
</filter>
<mask id="dropShadowMask">
<path
d="M47.285,29.991L23.75,16.24c-0.357-0.208-0.692-0.278-0.969-0.221 C22.32,16.114,22,16.555,22,17.251v27.5c0,1.112,0.797,1.568,1.75,1.011l23.535-13.749C48.238,31.458,48.238,30.546,47.285,29.991z M0,0v64h64V0H0z M32,59C16.536,59,4,46.464,4,31S16.536,3,32,3s28,12.536,28,28S47.464,59,32,59z"
d="M47.285,30.991L23.75,17.24c-0.357-0.208-0.692-0.278-0.969-0.221 C22.32,17.115,22,17.555,22,18.252v27.499c0,1.112,0.797,1.568,1.75,1.011l23.535-13.748C48.238,32.458,48.238,31.547,47.285,30.991 z M0,0v64h64V0H0z M32,60C16.536,60,4,47.464,4,32S16.536,4,32,4s28,12.536,28,28S47.464,60,32,60z"
id="dropShadowMaskPath"
style="fill:#ffffff;fill-opacity:1;stroke:none" />
</mask>
</defs>
<path
d="M32,3C16.536,3,4,15.536,4,31s12.536,28,28,28s28-12.536,28-28S47.464,3,32,3z M47.285,32.013L23.75,45.762C22.797,46.319,22,45.863,22,44.751v-27.5c0-0.697,0.32-1.137,0.781-1.232 c0.277-0.058,0.612,0.012,0.969,0.221l23.535,13.751C48.238,30.546,48.238,31.458,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32s12.536,28,28,28s28-12.536,28-28S47.464,4,32,4z M47.285,33.014 L23.75,46.762C22.797,47.319,22,46.863,22,45.751v-27.5c0-0.697,0.32-1.137,0.781-1.232c0.277-0.058,0.612,0.012,0.969,0.221 l23.535,13.751C48.238,31.546,48.238,32.458,47.285,33.014z"
mask="url(#dropShadowMask)"
id="playButtonShadow"
style="fill:black;fill-opacity:1;stroke:none;filter:url(#dropShadow)" />
<path
d="M22.781,16.019C22.32,16.114,22,16.555,22,17.251v27.5c0,1.112,0.797,1.568,1.75,1.011 l23.535-13.749c0.953-0.556,0.953-1.467,0-2.022L23.75,16.24C23.393,16.031,23.058,15.961,22.781,16.019z"
d="M22.781,17.019C22.32,17.114,22,17.555,22,18.251v27.5c0,1.112,0.797,1.568,1.75,1.011 l23.535-13.748c0.953-0.556,0.953-1.467,0-2.023L23.75,17.24C23.393,17.031,23.058,16.961,22.781,17.019z"
id="playButtonArrow"
style="fill:url(#arrowGradient);fill-opacity:1;stroke:none" />
<path
d="M32,3C16.536,3,4,15.536,4,31s12.536,28,28,28s28-12.536,28-28S47.464,3,32,3z M47.285,32.013L23.75,45.762C22.797,46.319,22,45.863,22,44.751v-27.5c0-0.697,0.32-1.137,0.781-1.232 c0.277-0.058,0.612,0.012,0.969,0.221l23.535,13.751C48.238,30.546,48.238,31.458,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32s12.536,28,28,28s28-12.536,28-28S47.464,4,32,4z M47.285,33.014 L23.75,46.762C22.797,47.319,22,46.863,22,45.751v-27.5c0-0.697,0.32-1.137,0.781-1.232c0.277-0.058,0.612,0.012,0.969,0.221 l23.535,13.751C48.238,31.546,48.238,32.458,47.285,33.014z"
id="playButton"
style="fill:url(#whiteGradient);fill-opacity:1;stroke:none" />
<path
d="M32,3C16.536,3,4,15.536,4,31s12.536,28,28,28s28-12.536,28-28S47.464,3,32,3 z M32,58C17.112,58,5,45.888,5,31S17.112,4,32,4s27,12.112,27,27S46.888,58,32,58z M47.789,29.127l-23.534-13.75 C23.826,15.126,23.396,15,22.976,15c-0.135,0-0.27,0.014-0.398,0.041C21.62,15.238,21,16.106,21,17.251v27.5 C21,46.075,21.812,47,22.977,47c0.423,0,0.854-0.126,1.279-0.375L47.79,32.876c0.769-0.448,1.21-1.131,1.21-1.875 S48.559,29.576,47.789,29.127z M47.285,32.013L23.75,45.762C23.474,45.924,23.211,46,22.977,46C22.402,46,22,45.541,22,44.751v-27.5 c0-0.697,0.32-1.137,0.781-1.232L22.976,16c0.233,0,0.498,0.079,0.775,0.24l23.535,13.751 C48.238,30.546,48.238,31.458,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32s12.536,28,28,28s28-12.536,28-28S47.464,4,32,4z M32,59C17.112,59,5,46.888,5,32S17.112,5,32,5s27,12.112,27,27S46.888,59,32,59z M47.789,30.127l-23.534-13.75 C23.826,16.126,23.396,16,22.976,16c-0.135,0-0.27,0.014-0.398,0.041C21.62,16.238,21,17.106,21,18.251v27.5 C21,47.075,21.812,48,22.977,48c0.423,0,0.854-0.126,1.279-0.375L47.79,33.877c0.769-0.449,1.21-1.132,1.21-1.875 S48.559,30.576,47.789,30.127z M47.285,33.014L23.75,46.762C23.474,46.924,23.211,47,22.977,47C22.402,47,22,46.541,22,45.751v-27.5 c0-0.697,0.32-1.137,0.781-1.232L22.976,17c0.233,0,0.498,0.079,0.775,0.24l23.535,13.751 C48.238,31.546,48.238,32.458,47.285,33.014z"
id="playButtonEdgeHighlights"
style="fill:white;fill-opacity:.3;stroke:none" />
<path
d="M32,3C16.536,3,4,15.536,4,31c0,0.167,0.01,0.333,0.013,0.5C4.28,16.268,16.704,4,32,4 c15.296,0,27.72,12.268,27.987,27.5C59.99,31.333,60,31.167,60,31C60,15.536,47.464,3,32,3z M47.285,32.013L23.75,45.762 C22.797,46.319,22,45.863,22,44.751v1c0,1.112,0.797,1.568,1.75,1.011l23.535-13.748c0.697-0.407,0.879-1.003,0.556-1.512 C47.723,31.688,47.541,31.864,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32c0,0.167,0.01,0.333,0.013,0.5 C4.28,17.268,16.704,5,32,5c15.296,0,27.72,12.268,27.987,27.5C59.99,32.333,60,32.167,60,32C60,16.536,47.464,4,32,4z M47.285,33.014L23.75,46.762C22.797,47.319,22,46.863,22,45.751v1c0,1.112,0.797,1.568,1.75,1.011l23.535-13.748 c0.697-0.406,0.879-1.003,0.556-1.512C47.723,32.688,47.541,32.864,47.285,33.014z"
id="playButtonTopEdgeHighlights"
style="fill:white;fill-opacity:.8;stroke:none" />
</svg>

До

Ширина:  |  Высота:  |  Размер: 4.9 KiB

После

Ширина:  |  Высота:  |  Размер: 4.9 KiB

Просмотреть файл

@ -70,30 +70,30 @@
</filter>
<mask id="dropShadowMask">
<path
d="M47.285,29.991L23.75,16.24c-0.357-0.208-0.692-0.278-0.969-0.221 C22.32,16.114,22,16.555,22,17.251v27.5c0,1.112,0.797,1.568,1.75,1.011l23.535-13.749C48.238,31.458,48.238,30.546,47.285,29.991z M0,0v64h64V0H0z M32,59C16.536,59,4,46.464,4,31S16.536,3,32,3s28,12.536,28,28S47.464,59,32,59z"
d="M47.285,30.991L23.75,17.24c-0.357-0.208-0.692-0.278-0.969-0.221 C22.32,17.115,22,17.555,22,18.252v27.499c0,1.112,0.797,1.568,1.75,1.011l23.535-13.748C48.238,32.458,48.238,31.547,47.285,30.991 z M0,0v64h64V0H0z M32,60C16.536,60,4,47.464,4,32S16.536,4,32,4s28,12.536,28,28S47.464,60,32,60z"
id="dropShadowMaskPath"
style="fill:#ffffff;fill-opacity:1;stroke:none" />
</mask>
</defs>
<path
d="M32,3C16.536,3,4,15.536,4,31s12.536,28,28,28s28-12.536,28-28S47.464,3,32,3z M47.285,32.013L23.75,45.762C22.797,46.319,22,45.863,22,44.751v-27.5c0-0.697,0.32-1.137,0.781-1.232 c0.277-0.058,0.612,0.012,0.969,0.221l23.535,13.751C48.238,30.546,48.238,31.458,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32s12.536,28,28,28s28-12.536,28-28S47.464,4,32,4z M47.285,33.014 L23.75,46.762C22.797,47.319,22,46.863,22,45.751v-27.5c0-0.697,0.32-1.137,0.781-1.232c0.277-0.058,0.612,0.012,0.969,0.221 l23.535,13.751C48.238,31.546,48.238,32.458,47.285,33.014z"
mask="url(#dropShadowMask)"
id="playButtonShadow"
style="fill:black;fill-opacity:1;stroke:none;filter:url(#dropShadow)" />
<path
d="M22.781,16.019C22.32,16.114,22,16.555,22,17.251v27.5c0,1.112,0.797,1.568,1.75,1.011 l23.535-13.749c0.953-0.556,0.953-1.467,0-2.022L23.75,16.24C23.393,16.031,23.058,15.961,22.781,16.019z"
d="M22.781,17.019C22.32,17.114,22,17.555,22,18.251v27.5c0,1.112,0.797,1.568,1.75,1.011 l23.535-13.748c0.953-0.556,0.953-1.467,0-2.023L23.75,17.24C23.393,17.031,23.058,16.961,22.781,17.019z"
id="playButtonArrow"
style="fill:url(#arrowGradient);fill-opacity:1;stroke:none" />
<path
d="M32,3C16.536,3,4,15.536,4,31s12.536,28,28,28s28-12.536,28-28S47.464,3,32,3z M47.285,32.013L23.75,45.762C22.797,46.319,22,45.863,22,44.751v-27.5c0-0.697,0.32-1.137,0.781-1.232 c0.277-0.058,0.612,0.012,0.969,0.221l23.535,13.751C48.238,30.546,48.238,31.458,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32s12.536,28,28,28s28-12.536,28-28S47.464,4,32,4z M47.285,33.014 L23.75,46.762C22.797,47.319,22,46.863,22,45.751v-27.5c0-0.697,0.32-1.137,0.781-1.232c0.277-0.058,0.612,0.012,0.969,0.221 l23.535,13.751C48.238,31.546,48.238,32.458,47.285,33.014z"
id="playButton"
style="fill:url(#whiteGradient);fill-opacity:1;stroke:none" />
<path
d="M32,3C16.536,3,4,15.536,4,31s12.536,28,28,28s28-12.536,28-28S47.464,3,32,3 z M32,58C17.112,58,5,45.888,5,31S17.112,4,32,4s27,12.112,27,27S46.888,58,32,58z M47.789,29.127l-23.534-13.75 C23.826,15.126,23.396,15,22.976,15c-0.135,0-0.27,0.014-0.398,0.041C21.62,15.238,21,16.106,21,17.251v27.5 C21,46.075,21.812,47,22.977,47c0.423,0,0.854-0.126,1.279-0.375L47.79,32.876c0.769-0.448,1.21-1.131,1.21-1.875 S48.559,29.576,47.789,29.127z M47.285,32.013L23.75,45.762C23.474,45.924,23.211,46,22.977,46C22.402,46,22,45.541,22,44.751v-27.5 c0-0.697,0.32-1.137,0.781-1.232L22.976,16c0.233,0,0.498,0.079,0.775,0.24l23.535,13.751 C48.238,30.546,48.238,31.458,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32s12.536,28,28,28s28-12.536,28-28S47.464,4,32,4z M32,59C17.112,59,5,46.888,5,32S17.112,5,32,5s27,12.112,27,27S46.888,59,32,59z M47.789,30.127l-23.534-13.75 C23.826,16.126,23.396,16,22.976,16c-0.135,0-0.27,0.014-0.398,0.041C21.62,16.238,21,17.106,21,18.251v27.5 C21,47.075,21.812,48,22.977,48c0.423,0,0.854-0.126,1.279-0.375L47.79,33.877c0.769-0.449,1.21-1.132,1.21-1.875 S48.559,30.576,47.789,30.127z M47.285,33.014L23.75,46.762C23.474,46.924,23.211,47,22.977,47C22.402,47,22,46.541,22,45.751v-27.5 c0-0.697,0.32-1.137,0.781-1.232L22.976,17c0.233,0,0.498,0.079,0.775,0.24l23.535,13.751 C48.238,31.546,48.238,32.458,47.285,33.014z"
id="playButtonEdgeHighlights"
style="fill:white;fill-opacity:.3;stroke:none" />
<path
d="M32,3C16.536,3,4,15.536,4,31c0,0.167,0.01,0.333,0.013,0.5C4.28,16.268,16.704,4,32,4 c15.296,0,27.72,12.268,27.987,27.5C59.99,31.333,60,31.167,60,31C60,15.536,47.464,3,32,3z M47.285,32.013L23.75,45.762 C22.797,46.319,22,45.863,22,44.751v1c0,1.112,0.797,1.568,1.75,1.011l23.535-13.748c0.697-0.407,0.879-1.003,0.556-1.512 C47.723,31.688,47.541,31.864,47.285,32.013z"
d="M32,4C16.536,4,4,16.536,4,32c0,0.167,0.01,0.333,0.013,0.5 C4.28,17.268,16.704,5,32,5c15.296,0,27.72,12.268,27.987,27.5C59.99,32.333,60,32.167,60,32C60,16.536,47.464,4,32,4z M47.285,33.014L23.75,46.762C22.797,47.319,22,46.863,22,45.751v1c0,1.112,0.797,1.568,1.75,1.011l23.535-13.748 c0.697-0.406,0.879-1.003,0.556-1.512C47.723,32.688,47.541,32.864,47.285,33.014z"
id="playButtonTopEdgeHighlights"
style="fill:white;fill-opacity:.8;stroke:none" />
</svg>

До

Ширина:  |  Высота:  |  Размер: 4.9 KiB

После

Ширина:  |  Высота:  |  Размер: 4.9 KiB